List of usage examples for org.objectweb.asm MethodVisitor visitInvokeDynamicInsn
public void visitInvokeDynamicInsn(final String name, final String descriptor, final Handle bootstrapMethodHandle, final Object... bootstrapMethodArguments)
From source file:org.jboss.byteman.agent.JigsawAccessEnablerGenerator.java
License:Open Source License
public static byte[] getJigsawAccessEnablerClassBytes() { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); FieldVisitor fv;/*from www. ja v a 2s . c o m*/ MethodVisitor mv; // package org/jboss/byteman/jigsaw; // public class JigsawAccessEnabler implements AccessEnabler { ... } cw.visit(V9, ACC_PUBLIC + ACC_SUPER, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", null, "java/lang/Object", new String[] { "org/jboss/byteman/agent/AccessEnabler" }); cw.visitSource("JigsawAccessEnabler.java", null); // this is here because we use String + String cw.visitInnerClass("java/lang/invoke/MethodHandles$Lookup", "java/lang/invoke/MethodHandles", "Lookup", ACC_PUBLIC + ACC_FINAL + ACC_STATIC); { // private Module THIS_MODULE = this.getClass().getModule(); fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE", "Ljava/lang/Module;", null, null); fv.visitEnd(); } { // private Module UNPRIVILEGED_MODULE = AccessEnabler.class.getModule(); fv = cw.visitField(ACC_PRIVATE, "UNPRIVILEGED_MODULE", "Ljava/lang/Module;", null, null); fv.visitEnd(); } { // private Set<Module> THIS_MODULE_SET = Set.of(THIS_MODULE); fv = cw.visitField(ACC_PRIVATE, "THIS_MODULE_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Module;>;", null); fv.visitEnd(); } { // private Set<Module> EMPTY_READS_SET = Set.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_READS_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Module;>;", null); fv.visitEnd(); } { // private Map<String,<Set<Module>> EMPTY_EXPORTS_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_EXPORTS_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null); fv.visitEnd(); } { // private Map<String,<Set<Module>> EMPTY_OPENS_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_OPENS_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/String;Ljava/util/Set<Ljava/lang/Module;>;>;", null); fv.visitEnd(); } { // private Set<Class<?>> EMPTY_USES_SET = Set.of() fv = cw.visitField(ACC_PRIVATE, "EMPTY_USES_SET", "Ljava/util/Set;", "Ljava/util/Set<Ljava/lang/Class<*>;>;", null); fv.visitEnd(); } { // private Map<Class<?>,List<Class?>>> EMPTY_PROVIDES_MAP = Map.of(); fv = cw.visitField(ACC_PRIVATE, "EMPTY_PROVIDES_MAP", "Ljava/util/Map;", "Ljava/util/Map<Ljava/lang/Class<*>;Ljava/util/List<Ljava/lang/Class<*>;>;>;", null); fv.visitEnd(); } { // private Instrumentation inst; fv = cw.visitField(ACC_PRIVATE, "inst", "Ljava/lang/instrument/Instrumentation;", null, null); fv.visitEnd(); } { // private Lookup theLookup; fv = cw.visitField(ACC_PRIVATE, "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;", null, null); fv.visitEnd(); } { // private DefaultAccessEnabler defaultAccessEnabler; fv = cw.visitField(ACC_PRIVATE, "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;", null, null); fv.visitEnd(); } { // public JigsawAccessEnabler(Instrumentation inst) { mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/instrument/Instrumentation;)V", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); // super() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); // this.THIS_MODULE = this.getClass().getModule(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); // this.UNPRIVILEGED_MODULE = AccessEnabler.class.getModule(); mv.visitVarInsn(ALOAD, 0); mv.visitLdcInsn(Type.getType("Lorg/jboss/byteman/agent/AccessEnabler;")); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE", "Ljava/lang/Module;"); // this.THIS_MODULE_SET = Set.of(this.THIS_MODULE); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET", "Ljava/util/Set;"); // this.EMPTY_READS_SET = Set.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET", "Ljava/util/Set;"); // this.EMPTY_EXPORTS_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); // this.EMPTY_OPENS_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); // this.EMPTY_USES_SET = Set.of() mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "()Ljava/util/Set;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); // this.EMPTY_PROVIDES_MAP = Map.of(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "()Ljava/util/Map;", true); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); // if this.THIS_MODULE.isnamed() mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l3 = new Label(); mv.visitJumpInsn(IFNE, l3); // { // throw NEW RuntimeException("JigsawAccessEnabler : can only enable Jigsaw access from a named module not " + THIS_MODULE); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitInvokeDynamicInsn("makeConcatWithConstants", "(Ljava/lang/Module;)Ljava/lang/String;", new Handle(Opcodes.H_INVOKESTATIC, "java/lang/invoke/StringConcatFactory", "makeConcatWithConstants", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;"), new Object[] { "JigsawAccessEnabler : can only enable Jigsaw access from a named module not \u0001" }); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l3); // if (inst == null) mv.visitVarInsn(ALOAD, 1); Label l4 = new Label(); mv.visitJumpInsn(IFNONNULL, l4); // { // throw New RuntimeException("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle"); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessEnabler : can only be created if passed a real Instrumentation handle"); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l4); // this.inst = inst; mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); // try { mv.visitLabel(l0); // this.theLookup = MethodHandles.lookup(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "lookup", "()Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitLabel(l1); Label l5 = new Label(); mv.visitJumpInsn(GOTO, l5); // } (catch Exception) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 2); // throw new RuntimeException("JigsawAccessEnabler : cannot access Lookup.IMPL_LOOKUP", e); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitLdcInsn("JigsawAccessEnabler : cannot obtain lookup from Byteman module"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "<init>", "(Ljava/lang/String;Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); // } mv.visitLabel(l5); // defaultAccessEnabler = new DefaultAccessEnabler(); mv.visitVarInsn(ALOAD, 0); mv.visitTypeInsn(NEW, "org/jboss/byteman/agent/DefaultAccessEnabler"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "<init>", "()V", false); mv.visitFieldInsn(PUTFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); if (DEBUG) { // debug("created JigsawAccessEnabler") mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("created JigsawAccessEnabler"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return mv.visitInsn(RETURN); // } mv.visitMaxs(5, 3); mv.visitEnd(); } { // public boolean requiresAccess(Class<?> klazz) mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/Class;)Z", "(Ljava/lang/Class<*>;)Z", null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/SecurityException"); // debug("JigsawAccessEnabler.requiresAccess( klazz == " + klazz.getName() + ")"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_3); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_2); mv.visitLdcInsn(")"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } Label l3 = new Label(); mv.visitLabel(l3); // while (Modifier.isPublic(klazz.getModifiers())) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l4 = new Label(); mv.visitJumpInsn(IFEQ, l4); // { // Module module = klazz.getModule(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 2); // if (module.isNamed()) mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l5 = new Label(); mv.visitJumpInsn(IFEQ, l5); // { // debug(" module == " + module.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" module == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // Package pkg = klazz.getPackage(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackage", "()Ljava/lang/Package;", false); mv.visitVarInsn(ASTORE, 3); // if (pkg == null) mv.visitVarInsn(ALOAD, 3); Label l6 = new Label(); mv.visitJumpInsn(IFNONNULL, l6); // { // debug (" (pkg == null) ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" (pkg == null) ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l6); // if (!module.isExported(pkg.getName())) mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Package", "getName", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported", "(Ljava/lang/String;)Z", false); mv.visitJumpInsn(IFNE, l5); // { // debug (" !module.isExported(pkg.getName()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" !module.isExported(pkg.getName()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true; mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } // } mv.visitLabel(l5); // if (!klazz.isMemberClass()) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false); mv.visitJumpInsn(IFNE, l0); // { // debug(" !klazz.isMemberClass() ==> false") ; if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" !klazz.isMemberClass() ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } // try { mv.visitLabel(l0); // klazz = klazz.getDeclaringClass(); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ASTORE, 1); // debug(" klazz == " + klazz.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitLabel(l1); Label l7 = new Label(); mv.visitJumpInsn(GOTO, l7); // } catch (SecurityException se) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // debug ("SecurityException ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("SecurityException ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l7); // } mv.visitJumpInsn(GOTO, l3); mv.visitLabel(l4); // debug (" ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitMaxs(5, 4); mv.visitEnd(); } { // public boolean requiresAccess(AccessibleObject) { mv = cw.visitMethod(ACC_PUBLIC, "requiresAccess", "(Ljava/lang/reflect/AccessibleObject;)Z", null, null); mv.visitCode(); // Member member = (Member)accessible; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member"); mv.visitVarInsn(ASTORE, 2); // debug("JigsawAccessEnabler.requiresAccess( accessible == " + member.getDeclaringClass().getName() + member.getName() + ")"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_5); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("JigsawAccessEnabler.requiresAccess( accessible == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_2); mv.visitLdcInsn("."); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_3); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getName", "()Ljava/lang/String;", true); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_4); mv.visitLdcInsn(")"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (!Modifier.isPublic(member.getModifiers()) mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getModifiers", "()I", true); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l0 = new Label(); mv.visitJumpInsn(IFNE, l0); // { // debug ("!Modifier.isPublic(member.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(member.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l0); // Class<?> clazz = member.getDeclaringClass(); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitVarInsn(ASTORE, 3); // if (!Modifier.isPublic(clazz.getModifiers())) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); Label l1 = new Label(); mv.visitJumpInsn(IFNE, l1); // { // debug("!Modifier.isPublic(clazz.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitLabel(l1); // while (clazz.isMemberClass()) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "isMemberClass", "()Z", false); Label l2 = new Label(); mv.visitJumpInsn(IFEQ, l2); // do { // clazz = clazz.getEnclosingClass(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getEnclosingClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ASTORE, 3); // debug("klazz == " + clazz.getName()); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("klazz == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (!Modifier.isPublic(clazz.getModifiers())) mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModifiers", "()I", false); mv.visitMethodInsn(INVOKESTATIC, "java/lang/reflect/Modifier", "isPublic", "(I)Z", false); mv.visitJumpInsn(IFNE, l1); // { // debug("!Modifier.isPublic(clazz.getModifiers()) ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!Modifier.isPublic(clazz.getModifiers()) ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } // } done mv.visitLabel(l2); // Module module = clazz.getModule(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 4); // if (!module.isNamed()) mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l3 = new Label(); mv.visitJumpInsn(IFNE, l3); // { // debug ("!module.isNamed() ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("!module.isNamed() ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return false mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l3); if (DEBUG) { // debug("module == " + module.getName()); mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("module == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "getName", "()Ljava/lang/String;", false); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // String pkg = clazz.getPackageName(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, 5); if (DEBUG) { // debug("pkg == " + pkg); mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_2); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("pkg == "); mv.visitInsn(AASTORE); mv.visitInsn(DUP); mv.visitInsn(ICONST_1); mv.visitVarInsn(ALOAD, 5); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // if (module.isExported(pkg, UNPRIVILEGED_MODULE)) mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "UNPRIVILEGED_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isExported", "(Ljava/lang/String;Ljava/lang/Module;)Z", false); Label l4 = new Label(); mv.visitJumpInsn(IFEQ, l4); // { // debug ("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn("module.isExported(pkg, UNPRIVILEGED_MODULE) ==> false"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return false mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); // } mv.visitLabel(l4); // debug(" ==> true"); if (DEBUG) { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(ICONST_1); mv.visitTypeInsn(ANEWARRAY, "java/lang/String"); mv.visitInsn(DUP); mv.visitInsn(ICONST_0); mv.visitLdcInsn(" ==> true"); mv.visitInsn(AASTORE); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "debug", "([Ljava/lang/String;)V", false); } // return true mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); // } mv.visitMaxs(5, 6); mv.visitEnd(); } { // public void ensureAccess(AccessibleObject) { mv = cw.visitMethod(ACC_PUBLIC, "ensureAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null, null); mv.visitCode(); // ensureModuleAccess(accessible); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // accessible.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/AccessibleObject", "setAccessible", "(Z)V", false); mv.visitInsn(RETURN); // } mv.visitMaxs(2, 2); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createMethodInvoker", "(Ljava/lang/reflect/Method;)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException"); Label l3 = new Label(); mv.visitTryCatchBlock(l0, l1, l3, "java/lang/IllegalAccessException"); // ensureModuleAccess(method); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(method.getDeclaringClass(), theLookup); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // method.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Method", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createMethodInvoker(method, true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createMethodInvoker", "(Ljava/lang/reflect/Method;Z)Lorg/jboss/byteman/agent/AccessibleMethodInvoker;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleMethodInvoker(privateLookup, method); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleMethodInvoker", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Method;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createConstructorInvoker", "(Ljava/lang/reflect/Constructor;)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException"); Label l3 = new Label(); mv.visitTryCatchBlock(l0, l1, l3, "java/lang/IllegalAccessException"); // ensureModuleAccess(constructor); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(constructor.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // constructor.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Constructor", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createConstructorInvoker(constructor); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createConstructorInvoker", "(Ljava/lang/reflect/Constructor;Z)Lorg/jboss/byteman/agent/AccessibleConstructorInvoker;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleConstructorInvoker(privateLookup, constructor); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleConstructorInvoker", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Constructor;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createFieldGetter", "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException"); Label l3 = new Label(); mv.visitTryCatchBlock(l0, l1, l3, "java/lang/IllegalAccessException"); // ensureModuleAccess(field); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // field.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createFieldGetter(method); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldGetter", "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldGetter;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleFieldGetter(privateLookup, field); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldGetter", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PUBLIC, "createFieldSetter", "(Ljava/lang/reflect/Field;)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/IllegalArgumentException"); Label l3 = new Label(); mv.visitTryCatchBlock(l0, l1, l3, "java/lang/IllegalAccessException"); // ensureModuleAccess(field); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", false); // Lookup privateLookup = null; mv.visitInsn(ACONST_NULL); mv.visitVarInsn(ASTORE, 2); // try { mv.visitLabel(l0); // privateLookup = MethodHandles.privateLookupIn(field.getDeclaringClass(), theLookup) mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "getDeclaringClass", "()Ljava/lang/Class;", false); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "theLookup", "Ljava/lang/invoke/MethodHandles$Lookup;"); mv.visitMethodInsn(INVOKESTATIC, "java/lang/invoke/MethodHandles", "privateLookupIn", "(Ljava/lang/Class;Ljava/lang/invoke/MethodHandles$Lookup;)Ljava/lang/invoke/MethodHandles$Lookup;", false); mv.visitVarInsn(ASTORE, 2); mv.visitLabel(l1); Label l4 = new Label(); mv.visitJumpInsn(GOTO, l4); // } catch (IllegalArgumentException e) { mv.visitLabel(l2); mv.visitVarInsn(ASTORE, 3); // field.setAccessible(true); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/reflect/Field", "setAccessible", "(Z)V", false); // return defaultAccessEnabler.createFieldSetter(method); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "defaultAccessEnabler", "Lorg/jboss/byteman/agent/DefaultAccessEnabler;"); mv.visitVarInsn(ALOAD, 1); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKEVIRTUAL, "org/jboss/byteman/agent/DefaultAccessEnabler", "createFieldSetter", "(Ljava/lang/reflect/Field;Z)Lorg/jboss/byteman/agent/AccessibleFieldSetter;", false); mv.visitInsn(ARETURN); // } catch (IllegalAccessException e) { mv.visitLabel(l3); mv.visitVarInsn(ASTORE, 3); // } mv.visitLabel(l4); // return new JigsawAccessibleFieldSetter(privateLookup, field); mv.visitTypeInsn(NEW, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESPECIAL, "org/jboss/byteman/jigsaw/JigsawAccessibleFieldSetter", "<init>", "(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/reflect/Field;)V", false); mv.visitInsn(ARETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } { mv = cw.visitMethod(ACC_PRIVATE, "ensureModuleAccess", "(Ljava/lang/reflect/AccessibleObject;)V", null, null); mv.visitCode(); // Member member = (Member)accessible; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, "java/lang/reflect/Member"); mv.visitVarInsn(ASTORE, 2); // Class<?> clazz = member.getDeclaringClass(); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/reflect/Member", "getDeclaringClass", "()Ljava/lang/Class;", true); mv.visitVarInsn(ASTORE, 3); // Module module = clazz.getModule(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getModule", "()Ljava/lang/Module;", false); mv.visitVarInsn(ASTORE, 4); // if (!module.isNamed()) { mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isNamed", "()Z", false); Label l0 = new Label(); mv.visitJumpInsn(IFNE, l0); // if (!THIS_MODULE.canRead(module)) { mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "canRead", "(Ljava/lang/Module;)Z", false); Label ltmp0 = new Label(); mv.visitJumpInsn(IFNE, ltmp0); // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, EMPTY_OPENS_MAP, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); // } mv.visitLabel(ltmp0); // return; mv.visitInsn(RETURN); // } mv.visitLabel(l0); // String pkg = clazz.getPackageName(); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Class", "getPackageName", "()Ljava/lang/String;", false); mv.visitVarInsn(ASTORE, 5); // if (!module.isOpen(pkg, THIS_MODULE)) { mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Module", "isOpen", "(Ljava/lang/String;Ljava/lang/Module;)Z", false); Label l1 = new Label(); mv.visitJumpInsn(IFNE, l1); // Map<String, Set<Module>> extraOpens = Map.of(pkg, THIS_MODULE_SET); mv.visitVarInsn(ALOAD, 5); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE_SET", "Ljava/util/Set;"); mv.visitMethodInsn(INVOKESTATIC, "java/util/Map", "of", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/util/Map;", true); mv.visitVarInsn(ASTORE, 6); // inst.redefineModule(module, EMPTY_READS_SET, EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 4); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_READS_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 6); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); // inst.redefineModule(THIS_MODULE, Set.of(module), EMPTY_EXPORTS_MAP, extraOpens, EMPTY_USES_SET, EMPTY_PROVIDES_MAP); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "inst", "Ljava/lang/instrument/Instrumentation;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "THIS_MODULE", "Ljava/lang/Module;"); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKESTATIC, "java/util/Set", "of", "(Ljava/lang/Object;)Ljava/util/Set;", true); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_EXPORTS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_OPENS_MAP", "Ljava/util/Map;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_USES_SET", "Ljava/util/Set;"); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, "org/jboss/byteman/jigsaw/JigsawAccessEnabler", "EMPTY_PROVIDES_MAP", "Ljava/util/Map;"); mv.visitMethodInsn(INVOKEINTERFACE, "java/lang/instrument/Instrumentation", "redefineModule", "(Ljava/lang/Module;Ljava/util/Set;Ljava/util/Map;Ljava/util/Map;Ljava/util/Set;Ljava/util/Map;)V", true); mv.visitLabel(l1); // } mv.visitInsn(RETURN); mv.visitMaxs(7, 7); mv.visitEnd(); } { if (DEBUG) { mv = cw.visitMethod(ACC_PRIVATE + ACC_VARARGS, "debug", "([Ljava/lang/String;)V", null, null); mv.visitCode(); // StringBuilder builder = new StringBuilder(); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false); mv.visitVarInsn(ASTORE, 2); // for (String s : args) mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ASTORE, 3); mv.visitVarInsn(ALOAD, 3); mv.visitInsn(ARRAYLENGTH); mv.visitVarInsn(ISTORE, 4); mv.visitInsn(ICONST_0); mv.visitVarInsn(ISTORE, 5); Label l0 = new Label(); mv.visitLabel(l0); // { // mv.visitVarInsn(ILOAD, 5); mv.visitVarInsn(ILOAD, 4); Label l1 = new Label(); mv.visitJumpInsn(IF_ICMPGE, l1); mv.visitVarInsn(ALOAD, 3); mv.visitVarInsn(ILOAD, 5); mv.visitInsn(AALOAD); // builder.append(s); mv.visitVarInsn(ASTORE, 6); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 6); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false); mv.visitInsn(POP); mv.visitIincInsn(5, 1); mv.visitJumpInsn(GOTO, l0); // } mv.visitLabel(l1); // System.out.println(builder.toString()); mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); mv.visitInsn(RETURN); mv.visitMaxs(2, 7); mv.visitEnd(); } } cw.visitEnd(); return cw.toByteArray(); }
From source file:org.spongepowered.test.ast.LambdaTest.java
License:Open Source License
@Test public void testLambda() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start);//from w w w. jav a 2 s. c o m 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); }
From source file:org.spongepowered.test.ast.LambdaTest.java
License:Open Source License
@Test public void testConsumer() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start);// ww w. j av a 2s .co m 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); }
From source file:org.spongepowered.test.ast.LambdaTest.java
License:Open Source License
@Test public void testProducer() { TestMethodBuilder builder = new TestMethodBuilder("test_mth", "()V"); MethodVisitor mv = builder.getGenerator(); Label start = new Label(); mv.visitLabel(start);// w w w . j a v a2s .c o m if (TestHelper.IS_ECLIPSE) { mv.visitInvokeDynamicInsn("call", "()Ljava/util/concurrent/Callable;", 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;"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$2", "()Ljava/lang/Object;"), Type.getType("()Ljava/lang/Object;") }); } else { // javac adds an extra decoration to the lambda method name with the // name of the calling method mv.visitInvokeDynamicInsn("call", "()Ljava/util/concurrent/Callable;", 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;"), new Handle(H_INVOKESTATIC, "org/spongepowered/test/ast/LambdaTest", "lambda$test_producer$2", "()Ljava/lang/Object;"), Type.getType("()Ljava/lang/Object;") }); } mv.visitVarInsn(ASTORE, 1); Label l1 = new Label(); mv.visitLabel(l1); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEINTERFACE, "java/util/concurrent/Callable", "call", "()Ljava/lang/Object;", true); mv.visitInsn(POP); 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/concurrent/Callable;", "Ljava/util/concurrent/Callable<Ljava/lang/Object;>;", l1, end, 1); String insn = TestHelper.getAsString(builder.finish(), "test_mth"); String good = "java.util.concurrent.Callable<Object> r = () -> null;\n" + "r.call();"; Assert.assertEquals(good, insn); }
From source file:org.spongepowered.test.ast.LambdaTest.java
License:Open Source License
@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);/*from w w w .ja v a 2s .c o m*/ 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); }
From source file:org.spongepowered.test.ast.LambdaTest.java
License:Open Source License
@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);/*from w w w . j a v a 2 s. com*/ 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); }
From source file:st.redline.compiler.SmalltalkGeneratingVisitor.java
License:Open Source License
private void pushNewLambda(MethodVisitor mv, String className, String name, String sig, int line) { visitLine(mv, line);/*from www . j a va 2 s . co m*/ pushReceiver(mv); mv.visitInvokeDynamicInsn("apply", "()Lst/redline/core/LambdaBlock;", 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(sig), new Handle(Opcodes.H_INVOKESTATIC, className, name, sig), Type.getType(sig) }); }
From source file:suneido.runtime.DynamicIndy.java
License:Open Source License
public MethodHandle invokeDynamic(String name, MethodType desc, Class<?> bsmClass, String bsmName, MethodType bsmType, Object... bsmArgs) { ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(V1_7, ACC_PUBLIC | ACC_SUPER, "Gen" + (ID_GENERATOR++), null, "java/lang/Object", null); MethodVisitor init = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); init.visitCode();//from ww w .j a v a 2 s . c o m init.visitVarInsn(ALOAD, 0); init.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); init.visitInsn(RETURN); init.visitMaxs(-1, -1); init.visitEnd(); String descriptor = desc.toMethodDescriptorString(); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC | ACC_STATIC, "invokedynamic", descriptor, null, null); int slot = 0; for (Type parameterType : Type.getArgumentTypes(descriptor)) { mv.visitVarInsn(parameterType.getOpcode(ILOAD), slot); slot += parameterType.getSize(); } mv.visitInvokeDynamicInsn(name, descriptor, new org.objectweb.asm.Handle(H_INVOKESTATIC, bsmClass.getName().replace('.', '/'), bsmName, bsmType.toMethodDescriptorString(), false), bsmArgs); Type returnType = Type.getReturnType(descriptor); mv.visitInsn(returnType.getOpcode(IRETURN)); mv.visitMaxs(-1, -1); mv.visitEnd(); cw.visitEnd(); byte[] array = cw.toByteArray(); Class<?> clazz = defineClass(null, array, 0, array.length); try { return MethodHandles.lookup().findStatic(clazz, "invokedynamic", desc); } catch (IllegalAccessException | NoSuchMethodException e) { throw (AssertionError) new AssertionError().initCause(e); } }