List of usage examples for org.objectweb.asm Opcodes GOTO
int GOTO
To view the source code for org.objectweb.asm Opcodes GOTO.
Click Source Link
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(); } }; }