List of usage examples for org.objectweb.asm Label Label
public Label()
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); }