List of usage examples for org.objectweb.asm MethodVisitor visitInsn
public void visitInsn(final int opcode)
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(); } }; }