Java Code Examples for org.objectweb.asm.MethodVisitor#visitInvokeDynamicInsn()
The following examples show how to use
org.objectweb.asm.MethodVisitor#visitInvokeDynamicInsn() .
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 7 votes |
@Override void compile(final MethodVisitor mv) { // compiles e1 e1.compile(mv); // tests if e1 is false mv.visitInsn(DUP); // convert to a boolean mv.visitInvokeDynamicInsn("asBoolean", "(Ljava/lang/Object;)Z", UNARY); Label end = new Label(); mv.visitJumpInsn(IFEQ, end); // case where e1 is true : e1 && e2 is equal to e2 mv.visitInsn(POP); e2.compile(mv); // if e1 is false, e1 && e2 is equal to e1: // we jump directly to this label, without evaluating e2 mv.visitLabel(end); }
Example 2
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 6 votes |
@Override void compile(final MethodVisitor mv) { // compiles e1 e1.compile(mv); // tests if e1 is true mv.visitInsn(DUP); // convert to a boolean mv.visitInvokeDynamicInsn("asBoolean", "(Ljava/lang/Object;)Z", UNARY); Label end = new Label(); mv.visitJumpInsn(IFNE, end); // case where e1 is false : e1 || e2 is equal to e2 mv.visitInsn(POP); e2.compile(mv); // if e1 is true, e1 || e2 is equal to e1: // we jump directly to this label, without evaluating e2 mv.visitLabel(end); }
Example 3
Source File: BytecodeNegateExpression.java From yql-plus with Apache License 2.0 | 5 votes |
@Override public void generate(CodeEmitter code) { MethodVisitor mv = code.getMethodVisitor(); Label isNull = new Label(); TypeWidget mathType = getType().unboxed(); if (!mathType.isPrimitive()) { mv.visitFieldInsn(Opcodes.GETSTATIC, Type.getInternalName(Maths.class), "INSTANCE", Type.getDescriptor(Maths.class)); } boolean maybeNull = code.cast(mathType, leftExpr.getType(), isNull); // compute the result if (mathType.isPrimitive()) { mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.INEG)); } else if (mathType.getValueCoreType() == YQLCoreType.ANY) { String desc = Type.getMethodDescriptor(getType().getJVMType(), Type.getType(Maths.class), leftExpr.getType().getJVMType()); mv.visitInvokeDynamicInsn("dyn:callMethod:negate", desc, Dynamic.H_DYNALIB_BOOTSTRAP); } else { throw new ProgramCompileException(loc, "Math operation NEGATE is not defined for type %s", mathType.getJVMType()); } if (!getType().isPrimitive() && mathType.isPrimitive()) { code.box(mathType); } if (maybeNull) { Label done = new Label(); mv.visitJumpInsn(Opcodes.GOTO, done); mv.visitLabel(isNull); mv.visitInsn(Opcodes.ACONST_NULL); mv.visitLabel(done); } }
Example 4
Source File: InvokeDynamicExpression.java From yql-plus with Apache License 2.0 | 5 votes |
@Override public void generate(CodeEmitter code) { for (BytecodeExpression arg : arguments) { arg.generate(code); } Type[] argTypes = new Type[arguments.size()]; for (int i = 0; i < arguments.size(); ++i) { argTypes[i] = arguments.get(i).getType().getJVMType(); } String desc = Type.getMethodDescriptor(returnType.getJVMType(), argTypes); MethodVisitor mv = code.getMethodVisitor(); mv.visitInvokeDynamicInsn(operationName, desc, bootstrap, bootstrapArgs); }
Example 5
Source File: LambdaTest.java From Despector with MIT License | 5 votes |
@Test public void testMethodRefJavac() { // apparently javac chooses it add a call to r.getClass() before the // method ref TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(Ljava/lang/Runnable;)V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); mv.visitInsn(POP); mv.visitInvokeDynamicInsn("run", "(Ljava/lang/Runnable;)Ljava/lang/Runnable;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("()V"), new Handle(H_INVOKEINTERFACE, "java/lang/Runnable", "run", "()V"), Type.getType("()V")}); mv.visitVarInsn(ASTORE, 2); Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/Runnable", "run", "()V", true); mv.visitInsn(RETURN); Label end = new Label(); mv.visitLabel(end); mv.visitLocalVariable("this", "Lorg/spongepowered/test/ast/LambdaTest;", null, start, end, 0); mv.visitLocalVariable("r", "Ljava/lang/Runnable;", null, start, end, 1); mv.visitLocalVariable("a", "Ljava/lang/Runnable;", null, l1, end, 2); String insn = TestHelper.getAsString(builder.finish(), "test_mth"); String good = "r.getClass();\n" + "Runnable a = r::run;\n" + "a.run();"; Assert.assertEquals(good, insn); }
Example 6
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 5 votes |
@Override void compile(final MethodVisitor mv) { if (value instanceof String) { mv.visitLdcInsn(value); return; } // instead of pushing the constant and then box it, we use // invokedynamic with the constant as bootstrap argument. The // boxing will be performed by the VM when calling the bootstrap // method mv.visitInvokeDynamicInsn("cst", "()Ljava/lang/Object;", CST, value); }
Example 7
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 5 votes |
@Override void compile(final MethodVisitor mv) { // compiles e1, e2, and adds an instruction to add the two values e1.compile(mv); e2.compile(mv); mv.visitInvokeDynamicInsn( "add", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", BINARY); }
Example 8
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 5 votes |
@Override void compile(final MethodVisitor mv) { // compiles e1, e2, and adds an instruction to multiply the two // values e1.compile(mv); e2.compile(mv); mv.visitInvokeDynamicInsn( "mul", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", BINARY); }
Example 9
Source File: LambdaTest.java From Despector with MIT License | 5 votes |
@Test public void testMethodRef() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "(Ljava/lang/Runnable;)V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start); mv.visitVarInsn(ALOAD, 1); mv.visitInvokeDynamicInsn("run", "(Ljava/lang/Runnable;)Ljava/lang/Runnable;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("()V"), new Handle(H_INVOKEINTERFACE, "java/lang/Runnable", "run", "()V"), Type.getType("()V")}); mv.visitVarInsn(ASTORE, 2); Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/Runnable", "run", "()V", true); mv.visitInsn(RETURN); Label end = new Label(); mv.visitLabel(end); mv.visitLocalVariable("this", "Lorg/spongepowered/test/ast/LambdaTest;", null, start, end, 0); mv.visitLocalVariable("r", "Ljava/lang/Runnable;", null, start, end, 1); mv.visitLocalVariable("a", "Ljava/lang/Runnable;", null, l1, end, 2); String insn = TestHelper.getAsString(builder.finish(), "test_mth"); String good = "Runnable a = r::run;\n" + "a.run();"; Assert.assertEquals(good, insn); }
Example 10
Source File: JCasClassConversion.java From uima-uimaj with Apache License 2.0 | 5 votes |
void genv3_setter(String name, String type) { MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "set" + up1st(name), "(" + type + ")V", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, classname, "_casView", "Lorg/apache/uima/cas/impl/CASImpl;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETSTATIC, classname, "_FI_" + name, "I"); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ILOAD, 1); mv.visitInvokeDynamicInsn("run", "(Lorg/apache/uima/jcas/tcas/Annotation;I)Ljava/lang/Runnable;", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;" + "Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] { Type.getType("()V"), new Handle(Opcodes.H_INVOKESPECIAL, "org/apache/uima/jcas/tcas/Annotation", "lambda$0", "(I)V"), Type.getType("()V") }); mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/uima/cas/impl/CASImpl", "setWithCheckAndJournalJFRI", "(Lorg/apache/uima/jcas/cas/TOP;ILjava/lang/Runnable;)V", false); mv.visitInsn(RETURN); mv.visitMaxs(5, 2); mv.visitEnd(); }
Example 11
Source File: LambdaTest.java From Despector with MIT License | 5 votes |
@Test public void testConsumer() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start); if (TestHelper.IS_ECLIPSE) { mv.visitInvokeDynamicInsn("accept", "()Ljava/util/function/Consumer;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("(Ljava/lang/Object;)V"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$1", "(Ljava/lang/Object;)V"), Type.getType("(Ljava/lang/Object;)V")}); } else { // javac adds an extra decoration to the lambda method name with the // name of the calling method mv.visitInvokeDynamicInsn("accept", "()Ljava/util/function/Consumer;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("(Ljava/lang/Object;)V"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$test_consumer$1", "(Ljava/lang/Object;)V"), Type.getType("(Ljava/lang/Object;)V")}); } mv.visitVarInsn(ASTORE, 1); Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ACONST_NULL); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/function/Consumer", "accept", "(Ljava/lang/Object;)V", true); mv.visitInsn(RETURN); Label end = new Label(); mv.visitLabel(end); mv.visitLocalVariable("this", "Lorg/spongepowered/test/ast/LambdaTest;", null, start, end, 0); mv.visitLocalVariable("r", "Ljava/util/function/Consumer;", "Ljava/util/function/Consumer<Ljava/lang/Object;>;", l1, end, 1); String insn = TestHelper.getAsString(builder.finish(), "test_mth"); String good = "java.util.function.Consumer<Object> r = (obj) -> System.out.println(\"Hello World\");\n" + "r.accept(null);"; Assert.assertEquals(good, insn); }
Example 12
Source File: LambdaTest.java From Despector with MIT License | 5 votes |
@Test public void testLambda() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start); if (TestHelper.IS_ECLIPSE) { mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("()V"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$0", "()V"), Type.getType("()V")}); } else { // javac adds an extra decoration to the lambda method name with the // name of the calling method mv.visitInvokeDynamicInsn("run", "()Ljava/lang/Runnable;", new Handle(H_INVOKESTATIC, "java/lang/invoke/LambdaMetafactory", "metafactory", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;"), new Object[] {Type.getType("()V"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$test_lambda$0", "()V"), Type.getType("()V")}); } mv.visitVarInsn(ASTORE, 1); Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/Runnable", "run", "()V", true); mv.visitInsn(RETURN); Label end = new Label(); mv.visitLabel(end); mv.visitLocalVariable("this", "Lorg/spongepowered/test/ast/LambdaTest;", null, start, end, 0); mv.visitLocalVariable("r", "Ljava/lang/Runnable;", null, l1, end, 1); String insn = TestHelper.getAsString(builder.finish(), "test_mth"); String good = "Runnable r = () -> System.out.println(\"Hello World\");\n" + "r.run();"; Assert.assertEquals(good, insn); }
Example 13
Source File: BytecodeArithmeticExpression.java From yql-plus with Apache License 2.0 | 4 votes |
@Override public void generate(CodeEmitter code) { MethodVisitor mv = code.getMethodVisitor(); Label isNull = new Label(); TypeWidget mathType = getType().unboxed(); if (!mathType.isPrimitive() || op == ArithmeticOperation.POW) { mv.visitFieldInsn(Opcodes.GETSTATIC, Type.getInternalName(Maths.class), "INSTANCE", Type.getDescriptor(Maths.class)); mv.visitFieldInsn(Opcodes.GETSTATIC, Type.getInternalName(ArithmeticOperation.class), op.name(), Type.getDescriptor(ArithmeticOperation.class)); } CodeEmitter.Unification out = code.unifyAs(mathType, leftExpr, rightExpr, isNull, isNull, isNull); // now we have both sides unified as (if possible) a primitive type // compute the result if (mathType.isPrimitive()) { switch (op) { case ADD: mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.IADD)); break; case SUB: mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.ISUB)); break; case MULT: mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.IMUL)); break; case DIV: mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.IDIV)); break; case MOD: mv.visitInsn(mathType.getJVMType().getOpcode(Opcodes.IREM)); break; case POW: mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, Type.getInternalName(Maths.class), "binaryMath", Type.getMethodDescriptor(mathType.getJVMType(), Type.getType(ArithmeticOperation.class), mathType.getJVMType(), mathType.getJVMType()), false); break; default: throw new ProgramCompileException(loc, "Unknown BinaryMath operation: " + op); } } else if (mathType.getValueCoreType() == YQLCoreType.ANY) { String desc = Type.getMethodDescriptor(getType().getJVMType(), Type.getType(Maths.class), Type.getType(ArithmeticOperation.class), leftExpr.getType().boxed().getJVMType(), rightExpr.getType().boxed().getJVMType()); mv.visitInvokeDynamicInsn("dyn:callMethod:binaryMath", desc, Dynamic.H_DYNALIB_BOOTSTRAP); } else { throw new ProgramCompileException(loc, "Math operation %s is not defined for type %s", op, mathType.getJVMType()); } if (!getType().isPrimitive() && mathType.isPrimitive()) { code.box(mathType); } if (out.nullPossible) { Label done = new Label(); mv.visitJumpInsn(Opcodes.GOTO, done); mv.visitLabel(isNull); if (!mathType.isPrimitive() || op == ArithmeticOperation.POW) { mv.visitInsn(Opcodes.POP2); } mv.visitInsn(Opcodes.ACONST_NULL); mv.visitLabel(done); } }
Example 14
Source File: InvokeDynamicInsnNode.java From JReFrameworker with MIT License | 4 votes |
@Override public void accept(final MethodVisitor methodVisitor) { methodVisitor.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); acceptAnnotations(methodVisitor); }
Example 15
Source File: InvokeDynamicInsnNode.java From JReFrameworker with MIT License | 4 votes |
@Override public void accept(final MethodVisitor methodVisitor) { methodVisitor.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); acceptAnnotations(methodVisitor); }
Example 16
Source File: IndyCompile.java From cs-summary-reflection with Apache License 2.0 | 4 votes |
@Override void compile(final MethodVisitor mv) { // compiles e, and applies 'not' e.compile(mv); mv.visitInvokeDynamicInsn("not", "(Ljava/lang/Object;)Ljava/lang/Object;", UNARY); }
Example 17
Source File: IndyStaticTypesMultiTypeDispatcher.java From groovy with Apache License 2.0 | 4 votes |
@Override public void call(MethodVisitor mv) { mv.visitInvokeDynamicInsn(name, signature, BSM); }
Example 18
Source File: ComplexIndyGenerator.java From bumblebench with Apache License 2.0 | 4 votes |
public static byte[] makeExample() throws Throwable { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, "ComplexIndy", null, "java/lang/Object", null); MethodVisitor mv; { mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "gwtTest", "(Ljava/lang/Object;)Ljava/lang/String;", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitInvokeDynamicInsn("gwtBootstrap", "(Ljava/lang/Object;)Ljava/lang/String;", new Handle( H_INVOKESTATIC, "BootstrapMethods", "fibBootstrap", Type.getType( "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" ).getDescriptor()) ); mv.visitInsn(ARETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "fibIndy", "(I)I", null, null); mv.visitCode(); mv.visitVarInsn(ILOAD, 0); mv.visitInvokeDynamicInsn("fibBootstrap", "(I)I", new Handle( H_INVOKESTATIC, "BootstrapMethods", "fibBootstrap", Type.getType( "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;" ).getDescriptor()) ); mv.visitInsn(IRETURN); mv.visitMaxs(0, 0); mv.visitEnd(); } cw.visitEnd(); return cw.toByteArray(); }
Example 19
Source File: DynamicInvocationExpr.java From maple-ir with GNU General Public License v3.0 | 4 votes |
@Override protected void generateCallCode(MethodVisitor visitor) { visitor.visitInvokeDynamicInsn(boundName, getBootstrapDesc(), bootstrapMethod, bootstrapArgs); }
Example 20
Source File: InvokeDynamicInsnNode.java From Concurnas with MIT License | 4 votes |
@Override public void accept(final MethodVisitor methodVisitor) { methodVisitor.visitInvokeDynamicInsn(name, desc, bsm, bsmArgs); acceptAnnotations(methodVisitor); }