Example usage for org.objectweb.asm Opcodes GOTO

List of usage examples for org.objectweb.asm Opcodes GOTO

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes GOTO.

Prototype

int GOTO

To view the source code for org.objectweb.asm Opcodes GOTO.

Click Source Link

Usage

From source file:com.asakusafw.dag.compiler.builtin.BranchOperatorGenerator.java

License:Apache License

static void branch(MethodVisitor method, Context context, UserOperator operator, LocalVarRef input,
        Map<OperatorProperty, FieldRef> dependencies) {
    OperatorOutput[] outputs = outputs(context, operator);
    Label[] caseLabels = Stream.of(outputs).map(o -> new Label()).toArray(Label[]::new);
    Label defaultLabel = new Label();
    Label endLabel = new Label();

    method.visitMethodInsn(Opcodes.INVOKEVIRTUAL, typeOf(Enum.class).getInternalName(), "ordinal",
            Type.getMethodDescriptor(Type.INT_TYPE), false);
    method.visitTableSwitchInsn(0, caseLabels.length - 1, defaultLabel, caseLabels);

    for (int i = 0; i < outputs.length; i++) {
        method.visitLabel(caseLabels[i]);
        FieldRef ref = Invariants.requireNonNull(dependencies.get(outputs[i]));
        ref.load(method);//ww  w  .  j  a  v a 2 s .  co m
        input.load(method);
        invokeResultAdd(method);
        method.visitJumpInsn(Opcodes.GOTO, endLabel);
    }
    method.visitLabel(defaultLabel);
    getNew(method, Descriptions.typeOf(AssertionError.class));
    method.visitInsn(Opcodes.ATHROW);

    method.visitLabel(endLabel);
}

From source file:com.asakusafw.dag.compiler.builtin.MasterCheckOperatorGenerator.java

License:Apache License

@Override
protected void defineProcess(MethodVisitor method, Context context, UserOperator operator, LocalVarRef master,
        LocalVarRef transaction, FieldRef impl, Map<OperatorProperty, FieldRef> dependencies,
        ClassDescription target) {// w ww . j  ava 2  s  . c o  m
    OperatorOutput found = operator.getOutputs().get(MasterCheck.ID_OUTPUT_FOUND);
    OperatorOutput missed = operator.getOutputs().get(MasterCheck.ID_OUTPUT_MISSED);

    Label onNull = new Label();
    Label end = new Label();
    master.load(method);
    getConst(method, null);
    method.visitJumpInsn(Opcodes.IF_ACMPEQ, onNull);

    dependencies.get(found).load(method);
    transaction.load(method);
    invokeResultAdd(method);
    method.visitJumpInsn(Opcodes.GOTO, end);

    method.visitLabel(onNull);
    dependencies.get(missed).load(method);
    transaction.load(method);
    invokeResultAdd(method);

    method.visitLabel(end);
}

From source file:com.asakusafw.dag.compiler.builtin.MasterJoinOperatorGenerator.java

License:Apache License

@Override
protected void defineProcess(MethodVisitor method, Context context, UserOperator operator, LocalVarRef master,
        LocalVarRef transaction, FieldRef impl, Map<OperatorProperty, FieldRef> dependencies,
        ClassDescription target) {//from  w w w. j  a v a 2 s.  c om
    OperatorOutput joined = operator.getOutput(MasterJoin.ID_OUTPUT_JOINED);
    OperatorOutput missed = operator.getOutput(MasterJoin.ID_OUTPUT_MISSED);

    Label onNull = new Label();
    Label end = new Label();
    master.load(method);
    getConst(method, null);
    method.visitJumpInsn(Opcodes.IF_ACMPEQ, onNull);

    dependencies.get(joined).load(method);
    performJoin(method, context, operator, master, transaction, impl, dependencies, target);
    invokeResultAdd(method);
    method.visitJumpInsn(Opcodes.GOTO, end);

    method.visitLabel(onNull);
    dependencies.get(missed).load(method);
    transaction.load(method);
    invokeResultAdd(method);

    method.visitLabel(end);
}

From source file:com.asakusafw.dag.compiler.builtin.MasterJoinUpdateOperatorGenerator.java

License:Apache License

@Override
protected void defineProcess(MethodVisitor method, Context context, UserOperator operator, LocalVarRef master,
        LocalVarRef transaction, FieldRef impl, Map<OperatorProperty, FieldRef> dependencies,
        ClassDescription target) {//from www  .  ja v  a2s .  c  om
    OperatorOutput found = operator.getOutputs().get(MasterCheck.ID_OUTPUT_FOUND);
    OperatorOutput missed = operator.getOutputs().get(MasterCheck.ID_OUTPUT_MISSED);

    Label onNull = new Label();
    Label end = new Label();
    master.load(method);
    getConst(method, null);
    method.visitJumpInsn(Opcodes.IF_ACMPEQ, onNull);

    List<ValueRef> arguments = new ArrayList<>();
    arguments.add(impl);
    arguments.add(master);
    arguments.add(transaction);
    appendExtraViews(arguments::add, operator, dependencies::get);
    appendArguments(arguments::add, operator, dependencies::get);
    invoke(method, context, operator, arguments);
    dependencies.get(found).load(method);
    transaction.load(method);
    invokeResultAdd(method);
    method.visitJumpInsn(Opcodes.GOTO, end);

    method.visitLabel(onNull);
    dependencies.get(missed).load(method);
    transaction.load(method);
    invokeResultAdd(method);

    method.visitLabel(end);
}

From source file:com.asakusafw.dag.compiler.jdbc.PreparedStatementAdapterGenerator.java

License:Apache License

private static void defineBody(ClassWriter writer, DataModelReference dataType,
        List<PropertyReference> properties, Optional<FieldRef> dateBuf) {
    MethodVisitor v = writer.visitMethod(Opcodes.ACC_PUBLIC, "drive", //$NON-NLS-1$
            Type.getMethodDescriptor(typeOf(void.class), typeOf(PreparedStatement.class), typeOf(Object.class)),
            null, new String[] { typeOf(SQLException.class).getInternalName(), });
    LocalVarRef row = new LocalVarRef(Opcodes.ALOAD, 1);
    LocalVarRef object = cast(v, 2, dataType.getDeclaration());

    int columnIndex = 0;
    for (PropertyReference property : properties) {
        columnIndex++;//w ww .  ja v  a  2 s  .  co m

        object.load(v);
        getOption(v, property);
        LocalVarRef option = putLocalVar(v, Type.OBJECT, 3);

        Label elseIf = new Label();
        Label endIf = new Label();

        // if (option.isNull()) {
        option.load(v);
        v.visitMethodInsn(Opcodes.INVOKEVIRTUAL, typeOf(ValueOption.class).getInternalName(), "isNull", //$NON-NLS-1$
                Type.getMethodDescriptor(typeOf(boolean.class)), false);
        v.visitJumpInsn(Opcodes.IFEQ, elseIf);

        row.load(v);
        getConst(v, columnIndex);
        doSetNull(v, property);

        v.visitJumpInsn(Opcodes.GOTO, endIf);

        // } else { @elseIf
        v.visitLabel(elseIf);

        row.load(v);
        getConst(v, columnIndex);
        option.load(v);
        doSetValue(v, property, dateBuf);

        // } @endIf
        v.visitLabel(endIf);
    }

    v.visitInsn(Opcodes.RETURN);
    v.visitMaxs(0, 0);
    v.visitEnd();
}

From source file:com.asakusafw.dag.compiler.jdbc.ResultSetAdapterGenerator.java

License:Apache License

private static void defineBody(ClassWriter writer, DataModelReference dataType,
        List<PropertyReference> properties, FieldRef valueBuffer, Optional<FieldRef> calendarBuf) {
    MethodVisitor v = writer.visitMethod(Opcodes.ACC_PUBLIC, "extract",
            Type.getMethodDescriptor(typeOf(Object.class), typeOf(ResultSet.class)), null,
            new String[] { typeOf(SQLException.class).getInternalName(), });
    LocalVarRef rs = new LocalVarRef(Opcodes.ALOAD, 1);
    valueBuffer.load(v);//from  www.  ja va2 s . c  om
    LocalVarRef buf = putLocalVar(v, Type.OBJECT, 2);

    int columnIndex = 0;
    Set<PropertyName> sawSet = new HashSet<>();
    for (PropertyReference property : properties) {
        columnIndex++;
        Label elseIf = new Label();
        Label endIf = new Label();

        buf.load(v);
        getOption(v, property);

        rs.load(v);
        getConst(v, columnIndex);
        doGetValue(v, property, calendarBuf);

        // if (rs.wasNull()) {
        rs.load(v);
        v.visitMethodInsn(Opcodes.INVOKEINTERFACE, typeOf(ResultSet.class).getInternalName(), "wasNull",
                Type.getMethodDescriptor(typeOf(boolean.class)), true);
        v.visitJumpInsn(Opcodes.IFEQ, elseIf);
        if (isWideType(property)) {
            v.visitInsn(Opcodes.POP2);
        } else {
            v.visitInsn(Opcodes.POP);
        }
        doSetNull(v);
        v.visitJumpInsn(Opcodes.GOTO, endIf);

        // } else { @elseIf
        v.visitLabel(elseIf);
        doSetValue(v, property);

        // } @endIf
        v.visitLabel(endIf);

        sawSet.add(property.getName());
    }

    // resets other properties
    for (PropertyReference property : dataType.getProperties()) {
        if (sawSet.contains(property.getName())) {
            continue;
        }
        buf.load(v);
        getOption(v, property);
        doSetNull(v);
    }

    buf.load(v);
    v.visitInsn(Opcodes.ARETURN);
    v.visitMaxs(0, 0);
    v.visitEnd();
}

From source file:com.codename1.tools.translator.bytecodes.Jump.java

License:Open Source License

@Override
public void appendInstruction(StringBuilder b, List<Instruction> instructions) {
    b.append("    ");

    switch (opcode) {
    case Opcodes.IFEQ:
        b.append("if(POP_INT() == 0) /* IFEQ */ ");
        break;// w  w w . j  av  a 2s .c  o  m
    case Opcodes.IFNE:
        b.append("if(POP_INT() != 0) /* IFNE */ ");
        break;
    case Opcodes.IFLT:
        b.append("if(POP_INT() < 0) /* IFLT */ ");
        break;
    case Opcodes.IFGE:
        b.append("if(POP_INT() >= 0) /* IFGE */ ");
        break;
    case Opcodes.IFGT:
        b.append("if(POP_INT() > 0) /* IFGT */ ");
        break;
    case Opcodes.IFLE:
        b.append("if(POP_INT() <= 0) /* IFLE */ ");
        break;
    case Opcodes.IF_ICMPEQ:
        b.append("SP-=2; if((*SP).data.i == SP[1].data.i) /* IF_ICMPEQ */ ");
        break;
    case Opcodes.IF_ICMPNE:
        b.append("SP-=2; if((*SP).data.i != SP[1].data.i) /* IF_ICMPNE */ ");
        break;
    case Opcodes.IF_ICMPLT:
        b.append("SP-=2; if((*SP).data.i < SP[1].data.i) /* IF_ICMPLT */ ");
        break;
    case Opcodes.IF_ICMPGE:
        b.append("SP-=2; if((*SP).data.i >= SP[1].data.i) /* IF_ICMPGE */ ");
        break;
    case Opcodes.IF_ICMPGT:
        b.append("SP-=2; if((*SP).data.i > SP[1].data.i) /* IF_ICMPGT */ ");
        break;
    case Opcodes.IF_ICMPLE:
        b.append("SP-=2; if((*SP).data.i <= SP[1].data.i) /* IF_ICMPLE */ ");
        break;
    case Opcodes.IF_ACMPEQ:
        b.append("SP-=2; if((*SP).data.o == SP[1].data.o) /* IF_ACMPEQ */ ");
        break;
    case Opcodes.IF_ACMPNE:
        b.append("SP-=2; if((*SP).data.o != SP[1].data.o) /* IF_ACMPNE */ ");
        break;
    case Opcodes.GOTO:
        // this space intentionally left blank
        break;
    case Opcodes.JSR:
        b.append("/* JSR TODO */");
        /*b.append("PUSH_")
        b.append("goto label_");
        b.append(label.toString());
        b.append(";\n");
        b.append("JSR_RETURN_LABEL_");
        b.append(jsrCounter);
        b.append(":");
        jsrCounter++;*/
        return;
    case Opcodes.IFNULL:
        b.append("if(POP_OBJ() == JAVA_NULL) /* IFNULL */ ");
        break;
    case Opcodes.IFNONNULL:
        b.append("if(POP_OBJ() != JAVA_NULL) /* IFNONNULL */ ");
        break;
    }

    if (TryCatch.isTryCatchInMethod()) {
        b.append("JUMP_TO(label_");
        b.append(label.toString());
        b.append(", ");
        b.append(LabelInstruction.getLabelCatchDepth(label, instructions));
        b.append(");\n");
    } else {
        b.append("goto label_");
        b.append(label.toString());
        b.append(";\n");
    }
}

From source file:com.gargoylesoftware.js.nashorn.internal.ir.debug.NashornTextifier.java

License:Open Source License

private static boolean noFallThru(final int opcode) {
    switch (opcode) {
    case Opcodes.GOTO:
    case Opcodes.ATHROW:
    case Opcodes.ARETURN:
    case Opcodes.IRETURN:
    case Opcodes.LRETURN:
    case Opcodes.FRETURN:
    case Opcodes.DRETURN:
        return true;
    default:/* w w  w .  j a  v a2s  .  c  o  m*/
        return false;
    }
}

From source file:com.github.anba.es6draft.compiler.assembler.InstructionAssembler.java

License:Open Source License

public void goTo(Jump jump) {
    methodVisitor.visitJumpInsn(Opcodes.GOTO, jump.target());
    stack.goTo(jump);
}

From source file:com.github.malamut2.low.AllocationMethodAdapter.java

License:Apache License

private void pushProductOfIntArrayOnStack() {
    Label beginScopeLabel = new Label();
    Label endScopeLabel = new Label();

    int dimsArrayIndex = newLocal("[I", beginScopeLabel, endScopeLabel);
    int counterIndex = newLocal("I", beginScopeLabel, endScopeLabel);
    int productIndex = newLocal("I", beginScopeLabel, endScopeLabel);
    Label loopLabel = new Label();
    Label endLabel = new Label();

    super.visitLabel(beginScopeLabel);

    // stack: ... intArray
    super.visitVarInsn(Opcodes.ASTORE, dimsArrayIndex);
    // -> stack: ...

    // counter = 0
    super.visitInsn(Opcodes.ICONST_0);
    super.visitVarInsn(Opcodes.ISTORE, counterIndex);
    // product = 1
    super.visitInsn(Opcodes.ICONST_1);
    super.visitVarInsn(Opcodes.ISTORE, productIndex);
    // loop://  w ww  .java2 s .  c om
    super.visitLabel(loopLabel);
    // if index >= arraylength goto end:
    super.visitVarInsn(Opcodes.ILOAD, counterIndex);
    super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex);
    super.visitInsn(Opcodes.ARRAYLENGTH);
    super.visitJumpInsn(Opcodes.IF_ICMPGE, endLabel);
    // product = product * max(array[counter],1)
    super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex);
    super.visitVarInsn(Opcodes.ILOAD, counterIndex);
    super.visitInsn(Opcodes.IALOAD);
    super.visitInsn(Opcodes.DUP);
    Label nonZeroDimension = new Label();
    super.visitJumpInsn(Opcodes.IFNE, nonZeroDimension);
    super.visitInsn(Opcodes.POP);
    super.visitInsn(Opcodes.ICONST_1);
    super.visitLabel(nonZeroDimension);
    super.visitVarInsn(Opcodes.ILOAD, productIndex);
    super.visitInsn(Opcodes.IMUL); // if overflow happens it happens.
    super.visitVarInsn(Opcodes.ISTORE, productIndex);
    // iinc counter 1
    super.visitIincInsn(counterIndex, 1);
    // goto loop
    super.visitJumpInsn(Opcodes.GOTO, loopLabel);
    // end:
    super.visitLabel(endLabel);
    // re-push dimensions array
    super.visitVarInsn(Opcodes.ALOAD, dimsArrayIndex);
    // push product
    super.visitVarInsn(Opcodes.ILOAD, productIndex);

    super.visitLabel(endScopeLabel);
}