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.yahoo.yqlplus.engine.internal.compiler.EqualsExpression.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
    MethodVisitor mv = code.getMethodVisitor();
    Label hasNull = new Label();
    CodeEmitter.Unification unified = code.unifiedEmit(leftExpr, rightExpr, hasNull);
    if (unified.type.isPrimitive()) {
        emitPrimitiveEquals(code, unified.type);
    } else {//from   w  w w  .ja  v a  2 s .com
        mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Object.class), "equals",
                Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.getType(Object.class)), false);
        if (negate) {
            emitNegate(mv);
        }
    }
    if (unified.nullPossible) {
        Label done = new Label();
        mv.visitJumpInsn(Opcodes.GOTO, done);
        mv.visitLabel(hasNull);
        emitFalse(code);
        mv.visitLabel(done);
    }
}

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);/* ww  w  . j a  va 2  s .  com*/
    Label done = new Label();
    Label isTrue = new Label();
    mv.visitJumpInsn(Opcodes.IFEQ, isTrue);
    emitFalse(code);
    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 emitIntEquals(CodeEmitter code) {
    Label done = new Label();
    MethodVisitor mv = code.getMethodVisitor();
    Label isTrue = new Label();
    mv.visitJumpInsn(Opcodes.IF_ICMPEQ, isTrue);
    emitFalse(code);//from www  .  ja  v a2 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);//from   w w  w. ja  v a  2 s .  c  o m
    mv.visitJumpInsn(Opcodes.GOTO, skip);
    mv.visitLabel(truth);
    mv.visitInsn(Opcodes.ICONST_0);
    mv.visitLabel(skip);
}

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();//from  ww  w  .  j  ava2s .co  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 . j av a2 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.AnyTypeWidget.java

@Override
public ComparisonAdapter getComparisionAdapter() {
    Preconditions.checkState(!isPrimitive(), "BaseTypeWidget should not be handling a primitive type");
    return new ComparisonAdapter() {
        @Override/*from   ww  w. j a v a 2s.  c  o m*/
        public void coerceBoolean(CodeEmitter scope, Label isTrue, Label isFalse, Label isNull) {
            // null or true
            scope.nullTest(AnyTypeWidget.getInstance(), isNull);
            Label popTrue = new Label();
            scope.emitInstanceOf(AnyTypeWidget.getInstance(), Boolean.class, popTrue);
            final MethodVisitor mv = scope.getMethodVisitor();
            mv.visitMethodInsn(Opcodes.GETSTATIC, Type.getInternalName(Boolean.class), "TRUE",
                    Type.getMethodDescriptor(Type.getType(Boolean.class)), false);
            mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Boolean.class), "equals",
                    Type.getMethodDescriptor(Type.BOOLEAN_TYPE, Type.getType(Object.class)), false);
            mv.visitJumpInsn(Opcodes.IFEQ, isFalse);
            mv.visitJumpInsn(Opcodes.GOTO, isTrue);
            mv.visitLabel(popTrue);
            scope.pop(AnyTypeWidget.getInstance());
            mv.visitJumpInsn(Opcodes.GOTO, isTrue);
        }
    };
}

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   www.ja  v  a 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// w  w w .  j  a va  2  s. 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 www .  j  a  v a2s  .c o m
        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();
        }
    };
}