Example usage for org.objectweb.asm Label Label

List of usage examples for org.objectweb.asm Label Label

Introduction

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

Prototype

public Label() 

Source Link

Document

Constructs a new label.

Usage

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

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

@Override
public final BytecodeExpression construct(final Map<String, BytecodeExpression> fields) {
    return new BaseTypeExpression(type) {
        @Override//from   w  w  w . j a  v a 2s  .  co m
        public void generate(CodeEmitter top) {
            CodeEmitter code = top.createScope();
            BytecodeExpression input = code.evaluateOnce(type.construct());
            for (Map.Entry<String, BytecodeExpression> e : fields.entrySet()) {
                AssignableValue out = property(input, e.getKey());
                BytecodeExpression value = e.getValue();
                if (value.getType().isNullable()) {
                    Label nextItem = new Label();
                    value = code.evaluateOnce(value);
                    code.gotoIfNull(value, nextItem);
                    code.exec(out.write(
                            new BytecodeCastExpression(NotNullableTypeWidget.create(out.getType()), value)));
                    code.getMethodVisitor().visitLabel(nextItem);
                } else {
                    code.exec(out.write(e.getValue()));
                }
            }
            code.exec(input);
            code.endScope();
        }
    };
}

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

@Override
public final BytecodeSequence visitProperties(final BytecodeExpression target, final PropertyVisit loop) {
    return new BytecodeSequence() {
        @Override/*from   ww  w.  j a  v a 2  s . co  m*/
        public void generate(CodeEmitter code) {
            Label done = new Label();
            MethodVisitor mv = code.getMethodVisitor();
            for (Property property : getProperties()) {
                Label nextProperty = new Label();
                BytecodeExpression propertyValue = code.evaluateOnce(property(target, property.name));
                boolean maybeNull = code.gotoIfNull(propertyValue, nextProperty);
                if (maybeNull) {

                    propertyValue = new NullCheckedEvaluatedExpression(propertyValue);
                }
                loop.item(code, new StringConstantExpression(property.name), propertyValue, done, nextProperty);
                if (maybeNull) {
                    mv.visitLabel(nextProperty);
                }
            }
            mv.visitLabel(done);

        }
    };
}

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

@Override
public void generate(CodeEmitter code) {
    Label done = new Label();
    Label isNull = new Label();
    MethodVisitor mv = code.getMethodVisitor();
    code.exec(target);//from w w w.  jav  a  2  s  .  c om
    boolean nullable = code.nullTest(target.getType(), isNull);
    code.getMethodVisitor().visitMethodInsn(Opcodes.INVOKEINTERFACE, Type.getInternalName(Collection.class),
            "size", Type.getMethodDescriptor(Type.INT_TYPE), true);
    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.IntegerSwitchSequence.java

@Override
public void generate(CodeEmitter code) {
    Map<Integer, Label> labelMap = Maps.newHashMapWithExpectedSize(sequenceMap.size());
    for (Integer key : sequenceMap.keySet()) {
        labelMap.put(key, new Label());
    }//from   ww  w  . j  a va  2 s . c  o m
    Label done = new Label();
    Label defaultCase = defaultSequence == BytecodeSequence.NOOP ? done : new Label();
    code.emitIntegerSwitch(labelMap, defaultCase);
    MethodVisitor mv = code.getMethodVisitor();
    for (Map.Entry<Integer, BytecodeSequence> e : sequenceMap.entrySet()) {
        mv.visitLabel(labelMap.get(e.getKey()));
        code.exec(e.getValue());
        mv.visitJumpInsn(Opcodes.GOTO, done);
    }
    if (defaultCase != done) {
        mv.visitLabel(defaultCase);
        code.exec(defaultSequence);
    }
    mv.visitLabel(done);

}