Example usage for org.objectweb.asm MethodVisitor visitInsn

List of usage examples for org.objectweb.asm MethodVisitor visitInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitInsn.

Prototype

public void visitInsn(final int opcode) 

Source Link

Document

Visits a zero operand instruction.

Usage

From source file:com.yahoo.yqlplus.engine.internal.compiler.CompareExpression.java

@Override
public void generate(CodeEmitter code) {
    // a bit of a hack; should not need to go to dynamic invocation for this unless one arg is ANY
    Label done = new Label();
    MethodVisitor mv = code.getMethodVisitor();
    Label leftNull = new Label();
    Label rightNull = new Label();
    Label bothNull = new Label();
    CodeEmitter.Unification unified = code.unifiedEmit(leftExpr, rightExpr, leftNull, rightNull, bothNull);
    if (unified.type.isPrimitive()) {
        emitPrimitiveCompare(code, unified.type);
    } else {/* ww w .j  a va2s  . com*/
        // TODO: statically determine if the unified type is Comparable -- for now treat them all like "any"
        CodeEmitter scope = code.createScope();
        MethodVisitor mv2 = scope.getMethodVisitor();
        AssignableValue right = scope.allocate(unified.type);
        AssignableValue left = scope.allocate(unified.type);
        scope.exec(right.write(unified.type));
        scope.exec(left.write(unified.type));
        scope.exec(left.read());
        Label leftIsNotComparable = new Label();
        scope.emitInstanceCheck(unified.type, Comparable.class, leftIsNotComparable);
        scope.exec(right.read());
        mv2.visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(Comparable.class), "compareTo",
                Type.getMethodDescriptor(Type.INT_TYPE, Type.getType(Object.class)), true);
        scope.gotoExitScope();
        mv2.visitLabel(leftIsNotComparable);
        scope.exec(scope.getLocal("$program").read());
        scope.exec(left.read());
        scope.emitIntConstant((loc != null) ? loc.getLineNumber() : -1);
        scope.emitIntConstant((loc != null) ? loc.getCharacterOffset() : 0);
        mv2.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(ProgramInvocation.class),
                "notComparable", Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(Object.class),
                        Type.INT_TYPE, Type.INT_TYPE),
                false);
        // this bit is not reachable, notComparable throws
        mv2.visitInsn(Opcodes.ICONST_0);
        mv2.visitJumpInsn(Opcodes.GOTO, done);
        scope.endScope();
    }
    if (unified.nullPossible) {
        mv.visitJumpInsn(Opcodes.GOTO, done);
        mv.visitLabel(leftNull);
        mv.visitInsn(Opcodes.ICONST_M1);
        mv.visitJumpInsn(Opcodes.GOTO, done);
        mv.visitLabel(rightNull);
        mv.visitInsn(Opcodes.ICONST_1);
        mv.visitJumpInsn(Opcodes.GOTO, done);
        mv.visitLabel(bothNull);
        mv.visitInsn(Opcodes.ICONST_0);
    }
    mv.visitLabel(done);
}

From source file:com.yahoo.yqlplus.engine.internal.compiler.ConstructorGenerator.java

@Override
public void generate(ClassVisitor cw) {
    CodeEmitter out = new CodeEmitter(unit, arguments, createMethod(cw));
    MethodVisitor mv = out.getMethodVisitor();
    unit.getSuperInit().generate(out);/*from   w  w w  . ja  v  a  2s  .c  o m*/
    code.generate(out);
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:com.yahoo.yqlplus.engine.internal.compiler.EqualsExpression.java

private void emitComplexEquals(CodeEmitter code, int op) {
    MethodVisitor mv = code.getMethodVisitor();
    mv.visitInsn(op);
    Label done = new Label();
    Label isTrue = new Label();
    mv.visitJumpInsn(Opcodes.IFEQ, isTrue);
    emitFalse(code);//  w  ww . j ava 2 s.  c  o m
    mv.visitJumpInsn(Opcodes.GOTO, done);
    mv.visitLabel(isTrue);
    emitTrue(code);
    mv.visitLabel(done);
}

From source file:com.yahoo.yqlplus.engine.internal.compiler.EqualsExpression.java

private void emitNegate(MethodVisitor mv) {
    Label truth = new Label();
    Label skip = new Label();
    mv.visitJumpInsn(Opcodes.IFNE, truth);
    mv.visitInsn(Opcodes.ICONST_1);
    mv.visitJumpInsn(Opcodes.GOTO, skip);
    mv.visitLabel(truth);//from ww  w . j ava 2  s . c  om
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitLabel(skip);
}

From source file:com.yahoo.yqlplus.engine.internal.compiler.MulticompareExpression.java

@Override
public void generate(CodeEmitter code) {
    CodeEmitter scope = code.createScope();
    MethodVisitor mv = scope.getMethodVisitor();
    AssignableValue var = scope.allocate(BaseTypeAdapter.INT32);
    for (BytecodeExpression expr : expressions) {
        Label areEqual = new Label();
        scope.exec(var.write(expr));
        scope.exec(var.read());
        mv.visitJumpInsn(Opcodes.IFEQ, areEqual);
        scope.exec(var.read());
        scope.gotoExitScope();/*ww  w.  j  a  va 2s .  c  o m*/
        mv.visitLabel(areEqual);
    }
    mv.visitInsn(Opcodes.ICONST_0);
    scope.endScope();
}

From source file:com.yahoo.yqlplus.engine.internal.generate.StructGenerator.java

private void generatePutMethod() {
    final MethodGenerator setGenerator = createMethod("set");
    final BytecodeExpression propertyNameExpr = setGenerator.addArgument("propertyName", BaseTypeAdapter.STRING)
            .read();/* ww w  .j a v  a  2  s  .c  o  m*/
    final BytecodeExpression valueExpr = setGenerator.addArgument("value", AnyTypeWidget.getInstance()).read();
    setGenerator.add(new BytecodeSequence() {
        @Override
        public void generate(CodeEmitter code) {
            Map<String, Label> labelMap = Maps.newLinkedHashMap();
            Label done = new Label();
            for (Map.Entry<String, FieldProperty> field : fields.entrySet()) {
                labelMap.put(field.getKey(), new Label());
            }
            propertyNameExpr.generate(code);
            code.emitStringSwitch(labelMap, done, true);
            MethodVisitor mv = code.getMethodVisitor();
            for (Map.Entry<String, FieldProperty> field : fields.entrySet()) {
                mv.visitLabel(labelMap.get(field.getKey()));
                BytecodeExpression castValue = new BytecodeCastExpression(field.getValue().property.type,
                        valueExpr);
                field.getValue().property(setGenerator.getLocal("this").read()).write(castValue).generate(code);
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            mv.visitLabel(done);
            mv.visitInsn(Opcodes.RETURN);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.generate.StructGenerator.java

private void generateGetMethod() {
    final MethodGenerator getGenerator = createMethod("get");
    getGenerator.setReturnType(AnyTypeWidget.getInstance());
    final BytecodeExpression propertyNameExpr = getGenerator.addArgument("propertyName", BaseTypeAdapter.STRING)
            .read();//from   w w  w  .ja  v  a  2 s .c om
    getGenerator.add(new BytecodeSequence() {
        @Override
        public void generate(CodeEmitter code) {
            Map<String, Label> labelMap = Maps.newLinkedHashMap();
            Label defaultCase = new Label();
            Label done = new Label();
            for (Map.Entry<String, FieldProperty> field : fields.entrySet()) {
                labelMap.put(field.getKey(), new Label());
            }
            propertyNameExpr.generate(code);
            code.emitStringSwitch(labelMap, defaultCase, true);
            MethodVisitor mv = code.getMethodVisitor();
            for (Map.Entry<String, FieldProperty> field : fields.entrySet()) {
                mv.visitLabel(labelMap.get(field.getKey()));
                field.getValue().property(getGenerator.getLocal("this").read()).read().generate(code);
                code.box(field.getValue().property.type);
                mv.visitJumpInsn(Opcodes.GOTO, done);
            }
            mv.visitLabel(defaultCase);
            new NullExpr(AnyTypeWidget.getInstance()).generate(code);
            mv.visitLabel(done);
            mv.visitInsn(Opcodes.ARETURN);
        }
    });
}

From source file:com.yahoo.yqlplus.engine.internal.plan.types.base.ArrayIndexAdapter.java

@Override
public BytecodeExpression length(final BytecodeExpression inputExpr) {
    return new BaseTypeExpression(BaseTypeAdapter.INT32) {
        @Override/*from  w  w  w  .ja va 2  s  . c o  m*/
        public void generate(CodeEmitter code) {
            Label done = new Label();
            Label isNull = new Label();
            MethodVisitor mv = code.getMethodVisitor();
            code.exec(inputExpr);
            boolean nullable = code.nullTest(inputExpr.getType(), isNull);
            mv.visitInsn(Opcodes.ARRAYLENGTH);
            if (nullable) {
                mv.visitJumpInsn(Opcodes.GOTO, done);
                mv.visitLabel(isNull);
                mv.visitInsn(Opcodes.ICONST_0);
                mv.visitLabel(done);
            }
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.plan.types.base.ArrayIndexAdapter.java

@Override
public BytecodeSequence iterate(final BytecodeExpression target, final AssignableValue item,
        final IterateLoop loop) {
    return new BytecodeSequence() {
        @Override//from  w  w w. j  a v a  2s .  c  o  m
        public void generate(CodeEmitter start) {
            CodeEmitter code = start.createScope();
            final AssignableValue count = code.allocate(BaseTypeAdapter.INT32);
            final AssignableValue idx = code.allocate(BaseTypeAdapter.INT32);
            Label done = new Label();
            Label next = new Label();
            MethodVisitor mv = code.getMethodVisitor();
            BytecodeExpression tgt = code.evaluateOnce(target);
            code.exec(tgt);
            code.nullTest(tgt.getType(), done);
            mv.visitInsn(Opcodes.ARRAYLENGTH);
            code.exec(count.write(BaseTypeAdapter.INT32));
            code.emitIntConstant(0);
            code.exec(idx.write(BaseTypeAdapter.INT32));
            mv.visitLabel(next);
            code.exec(count.read());
            mv.visitJumpInsn(Opcodes.IFEQ, done);
            code.inc(count, -1);
            code.exec(tgt);
            code.exec(idx.read());
            code.getMethodVisitor().visitInsn(ownerType.getJVMType().getOpcode(Opcodes.IALOAD));
            code.inc(idx, 1);
            code.nullTest(valueType, next);
            code.exec(item.write(item.getType()));
            loop.item(code, item.read(), done, next);
            mv.visitJumpInsn(Opcodes.GOTO, next);
            mv.visitLabel(done);
            code.endScope();
        }
    };
}

From source file:com.yahoo.yqlplus.engine.internal.plan.types.base.ArrayIndexAdapter.java

@Override
public BytecodeExpression first(final BytecodeExpression target) {
    // what should this return if the array is of length 0?
    return new BaseTypeExpression(NullableTypeWidget.create(valueType.boxed())) {
        @Override/*from   w  ww .  j a va2 s  .  c om*/
        public void generate(CodeEmitter start) {
            CodeEmitter code = start.createScope();
            Label done = new Label();
            Label isNull = new Label();
            MethodVisitor mv = code.getMethodVisitor();
            BytecodeExpression tgt = code.evaluateOnce(target);
            code.exec(tgt);
            code.nullTest(tgt.getType(), isNull);
            mv.visitInsn(Opcodes.ARRAYLENGTH);
            mv.visitJumpInsn(Opcodes.IFEQ, isNull);
            code.exec(tgt);
            code.emitIntConstant(0);
            mv.visitInsn(ownerType.getJVMType().getOpcode(Opcodes.IALOAD));
            code.cast(valueType.boxed(), valueType, isNull);
            mv.visitJumpInsn(Opcodes.GOTO, done);
            mv.visitLabel(isNull);
            mv.visitInsn(Opcodes.ACONST_NULL);
            mv.visitLabel(done);
            code.endScope();
        }
    };
}