List of usage examples for org.objectweb.asm Opcodes H_INVOKESTATIC
int H_INVOKESTATIC
To view the source code for org.objectweb.asm Opcodes H_INVOKESTATIC.
Click Source Link
From source file:org.decojer.cavaj.readers.asm.ReadMethodVisitor.java
License:Open Source License
@Nonnull private M handle2m(@Nonnull final Handle handle) { final String ownerName = handle.getOwner(); assert ownerName != null; final T ownerT = getDu().getT(ownerName); if (handle.getTag() == Opcodes.H_INVOKEINTERFACE) { ownerT.setInterface(true); // static also possible in interface since JVM 8 }/*from w ww . j a va 2 s. c o m*/ final String name = handle.getName(); final String desc = handle.getDesc(); assert name != null && desc != null; final M refM = ownerT.getM(name, desc); refM.setStatic(handle.getTag() == Opcodes.H_INVOKESTATIC); return refM; }
From source file:org.elasticsearch.painless.FunctionRef.java
License:Apache License
/** * Creates a new FunctionRef (already resolved) * @param expected interface type to implement * @param method functional interface method * @param impl implementation method//from w w w .j a v a2 s. c o m * @param numCaptures number of captured arguments */ public FunctionRef(Definition.Type expected, Definition.Method method, Definition.Method impl, int numCaptures) { // e.g. compareTo invokedName = method.name; // e.g. (Object)Comparator MethodType implType = impl.getMethodType(); // only include captured parameters as arguments invokedType = MethodType.methodType(expected.clazz, implType.dropParameterTypes(numCaptures, implType.parameterCount())); // e.g. (Object,Object)int interfaceMethodType = method.getMethodType().dropParameterTypes(0, 1); final int tag; if ("<init>".equals(impl.name)) { tag = Opcodes.H_NEWINVOKESPECIAL; } else if (Modifier.isStatic(impl.modifiers)) { tag = Opcodes.H_INVOKESTATIC; } else if (impl.owner.clazz.isInterface()) { tag = Opcodes.H_INVOKEINTERFACE; } else { tag = Opcodes.H_INVOKEVIRTUAL; } final String owner; final boolean ownerIsInterface; if (impl.owner == null) { // owner == null: script class itself ownerIsInterface = false; owner = WriterConstants.CLASS_TYPE.getInternalName(); } else if (impl.augmentation) { ownerIsInterface = false; owner = WriterConstants.AUGMENTATION_TYPE.getInternalName(); } else { ownerIsInterface = impl.owner.clazz.isInterface(); owner = impl.owner.type.getInternalName(); } implMethodASM = new Handle(tag, owner, impl.name, impl.method.getDescriptor(), ownerIsInterface); implMethod = impl.handle; // remove any prepended captured arguments for the 'natural' signature. samMethodType = adapt(interfaceMethodType, impl.getMethodType().dropParameterTypes(0, numCaptures)); }
From source file:org.elasticsearch.painless.node.SFunction.java
License:Apache License
private void initializeConstant(MethodWriter writer) { final Handle handle = new Handle(Opcodes.H_INVOKESTATIC, CLASS_TYPE.getInternalName(), name, method.method.getDescriptor(), false); writer.push(handle);//w ww .j a v a2 s . com }
From source file:org.jacoco.core.internal.instr.CondyProbeArrayStrategy.java
License:Open Source License
public int storeInstance(final MethodVisitor mv, final boolean clinit, final int variable) { final Handle bootstrapMethod = new Handle(Opcodes.H_INVOKESTATIC, className, InstrSupport.INITMETHOD_NAME, B_DESC, isInterface);/*from www . ja v a2s.com*/ // As a workaround for https://bugs.openjdk.java.net/browse/JDK-8216970 // constant should have type Object mv.visitLdcInsn(new ConstantDynamic(InstrSupport.DATAFIELD_NAME, "Ljava/lang/Object;", bootstrapMethod)); mv.visitTypeInsn(Opcodes.CHECKCAST, "[Z"); mv.visitVarInsn(Opcodes.ASTORE, variable); return 1; }
From source file:org.jacoco.core.internal.instr.CondyProbeArrayStrategyTest.java
License:Open Source License
@Test public void should_store_instance_using_condy_and_checkcast() { final MethodNode m = new MethodNode(); final int maxStack = strategy.storeInstance(m, false, 1); assertEquals(1, maxStack);//from w w w. ja v a 2 s. c o m final ConstantDynamic constantDynamic = (ConstantDynamic) ((LdcInsnNode) m.instructions.get(0)).cst; assertEquals("$jacocoData", constantDynamic.getName()); assertEquals("Ljava/lang/Object;", constantDynamic.getDescriptor()); final Handle bootstrapMethod = constantDynamic.getBootstrapMethod(); assertEquals(Opcodes.H_INVOKESTATIC, bootstrapMethod.getTag()); assertEquals("ClassName", bootstrapMethod.getOwner()); assertEquals("$jacocoInit", bootstrapMethod.getName()); assertEquals("(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/Class;)[Z", bootstrapMethod.getDesc()); assertTrue(bootstrapMethod.isInterface()); final TypeInsnNode castInstruction = (TypeInsnNode) m.instructions.get(1); assertEquals(Opcodes.CHECKCAST, castInstruction.getOpcode()); assertEquals("[Z", castInstruction.desc); final VarInsnNode storeInstruction = (VarInsnNode) m.instructions.get(2); assertEquals(Opcodes.ASTORE, storeInstruction.getOpcode()); assertEquals(1, storeInstruction.var); assertEquals(3, m.instructions.size()); }
From source file:org.jacoco.core.test.validation.BootstrapMethodReferenceTest.java
License:Open Source License
@Test public void test() throws Exception { final String className = "Example"; final ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); cw.visit(Opcodes.V1_7, Opcodes.ACC_PUBLIC, className, null, "java/lang/Object", null); final MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "run", "()I", null, null); mv.visitCode();/* w ww . j ava2s . co m*/ addCauseOfResizeInstructions(mv); final MethodType methodType = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class); final Handle handle = new Handle(Opcodes.H_INVOKESTATIC, this.getClass().getCanonicalName().replace('.', '/'), "bootstrap", methodType.toMethodDescriptorString(), false); mv.visitInvokeDynamicInsn("invoke", "()I", handle); mv.visitInsn(Opcodes.IRETURN); mv.visitMaxs(1, 0); mv.visitEnd(); cw.visitEnd(); final byte[] original = cw.toByteArray(); assertEquals(42, run(className, original)); final byte[] instrumented = instrumenter.instrument(original, className); assertEquals(42, run(className, instrumented)); }
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 ww w. jav 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.jooby.internal.apitool.Lambda.java
License:Apache License
public static Stream<Lambda> create(ClassLoader loader, Predicate<MethodInsnNode> scriptRoute, String declaringClass, InvokeDynamicInsnNode node, MethodNode implementation) { return new Insn<>(null, node).next().filter(Filters.is(MethodInsnNode.class)).findFirst() .map(MethodInsnNode.class::cast).filter(scriptRoute).map(method -> { return Arrays.asList(node.bsmArgs).stream().filter(Handle.class::isInstance) .map(Handle.class::cast).findFirst().map(handle -> { Lambda lambda = new Lambda(declaringClass, method, handle); // Collect pattern List<Type> args = Arrays.asList(Type.getArgumentTypes(method.desc)); AtomicInteger count = new AtomicInteger(IntStream.range(0, args.size()) .filter(i -> !args.get(i).getClassName().equals(String.class.getName())) .findFirst().orElse(0)); int from = 0; // use(verb, pattern) if ("use".equals(method.name) && count.get() == 2) { from += 1; }//from w ww. j a v a2 s. co m MethodInsnNode start = method; // Instance method reference but not Static method reference: if ((!method.owner.equals(lambda.owner) && handle.getTag() != Opcodes.H_INVOKESTATIC) && !routeGroupOwner().test(method)) { // get("pattern", instance::methodReference) start = new Insn<>(null, method.getPrevious()).prev() .filter(Filters.is(MethodInsnNode.class)).findFirst() .map(MethodInsnNode.class::cast).orElse(method); } List<String> ldc = ldcFor(start).stream() .map(it -> Route.normalize(it.cst.toString())).collect(Collectors.toList()); if (routeGroupOwner().test(method)) { // use("/pattern") // .get(pattern?, () -> {}); new Insn<>(null, method).prev().filter(Filters.is(MethodInsnNode.class)) .map(MethodInsnNode.class::cast) .filter(Filters.call(loader, lambda.owner, "use", String.class)) .findFirst().ifPresent(use -> { List<String> prefix = ldcFor(use).stream() .map(it -> Route.normalize(it.cst.toString())) .collect(Collectors.toList()); if (ldc.size() == 0) { count.incrementAndGet(); ldc.add(""); } IntStream.range(0, ldc.size()) .forEach(i -> ldc.set(i, prefix.get(0) + ldc.get(i))); }); } if (ldc.size() == 0) { // default path: ldc.add("/"); count.incrementAndGet(); } return ldc.stream().skip(from).limit(Math.min(count.get(), ldc.size())) .flatMap(pattern -> Stream.of(new Lambda(lambda.declaringClass, lambda.owner, lambda.desc, lambda.implementationName, lambda.name, pattern, implementation))); }).orElse(Stream.of()); }).orElse(Stream.of()); }
From source file:org.jruby.runtime.invokedynamic.InvokeDynamicSupport.java
License:LGPL
public static Handle getBootstrapHandle(String name, Class type, String sig) { return new Handle(Opcodes.H_INVOKESTATIC, p(type), name, sig); }
From source file:org.rascalmpl.library.experiments.Compiler.RVM.Interpreter.BytecodeGenerator.java
License:Open Source License
/********************************************************************************************************************/ Handle bootstrapMuPrimitive() {/*from w w w. j a v a 2 s.co m*/ MethodType bmt = MethodType.methodType(CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class); Handle bootstrap = new Handle(Opcodes.H_INVOKESTATIC, (MuPrimitive.class.getName()).replace('.', '/'), "bootstrapMuPrimitive", bmt.toMethodDescriptorString()); return bootstrap; }