List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
public static void fail(MethodVisitor mv, String s) { System.err.println("Warning, emitting fail case for '" + s + "'"); mv.visitLdcInsn(s); mv.visitMethodInsn(INVOKESTATIC, "com/sun/fortress/runtimeSystem/InstantiatingClassloader", "fail", "(Ljava/lang/String;)Ljava/lang/Error;"); mv.visitInsn(ATHROW);//from w w w .j av a 2s. com }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
private static byte[] instantiateArrowRTTI(String name) { ManglingClassWriter cw = new ManglingClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // Tuple,N$RTTIc int dollar_at = name.indexOf('$'); String stem_name = name.substring(0, dollar_at); String nstring = name.substring(Naming.ARROW_RTTI_TAG.length(), dollar_at); final int n = Integer.parseInt(nstring); String[] superInterfaces = null; cw.visit(JVM_BYTECODE_VERSION, ACC_PUBLIC, name, null, Naming.ARROW_RTTI_CONTAINER_TYPE, superInterfaces); // init/*w w w.j av a2 s .c om*/ { String init_sig = InstantiatingClassloader.jvmSignatureForOnePlusNTypes("java/lang/Class", n, Naming.RTTI_CONTAINER_TYPE, "V"); MethodVisitor mv = cw.visitNoMangleMethod(ACC_PUBLIC, "<init>", init_sig, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); // this mv.visitVarInsn(ALOAD, 1); // class // allocate and init array for next parameter int first_element = 2; // new array mv.visitLdcInsn(new Integer(n)); mv.visitTypeInsn(ANEWARRAY, Naming.RTTI_CONTAINER_TYPE); for (int i = 0; i < n; i++) { mv.visitInsn(DUP); mv.visitLdcInsn(new Integer(i)); mv.visitVarInsn(ALOAD, first_element + i); mv.visitInsn(AASTORE); } // invoke super.<init> mv.visitMethodInsn(INVOKESPECIAL, Naming.ARROW_RTTI_CONTAINER_TYPE, "<init>", "(Ljava/lang/Class;[" + Naming.RTTI_CONTAINER_DESC + ")V"); int pno = 2; // skip the java class parameter for (int i = Naming.STATIC_PARAMETER_ORIGIN; i < n + Naming.STATIC_PARAMETER_ORIGIN; i++) { String spn = "T" + i; // not yet this; sp.getKind(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, pno); mv.visitFieldInsn(PUTFIELD, name, spn, Naming.RTTI_CONTAINER_DESC); pno++; } voidEpilogue(mv); } // fields and getters for (int i = Naming.STATIC_PARAMETER_ORIGIN; i < n + Naming.STATIC_PARAMETER_ORIGIN; i++) { fieldAndGetterForStaticParameter(cw, stem_name, "T" + i, i); } // clinit -- part of the dictionary call // dictionary // factory // ought to create bogus xldata for tuples and arrows, instead we pass null emitDictionaryAndFactoryForGenericRTTIclass(cw, name, n, null); cw.visitEnd(); return cw.toByteArray(); }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
private static byte[] instantiateTupleRTTI(String name) { ManglingClassWriter cw = new ManglingClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES); // Tuple,N$RTTIc int dollar_at = name.indexOf('$'); String stem_name = name.substring(0, dollar_at); String nstring = name.substring(Naming.TUPLE_RTTI_TAG.length(), dollar_at); final int n = Integer.parseInt(nstring); String[] superInterfaces = null; cw.visit(JVM_BYTECODE_VERSION, ACC_PUBLIC, name, null, Naming.TUPLE_RTTI_CONTAINER_TYPE, superInterfaces); // init//from www. j a va 2s. c o m { String init_sig = InstantiatingClassloader.jvmSignatureForOnePlusNTypes("java/lang/Class", n, Naming.RTTI_CONTAINER_TYPE, "V"); MethodVisitor mv = cw.visitNoMangleMethod(ACC_PUBLIC, "<init>", init_sig, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); // this mv.visitVarInsn(ALOAD, 1); // class // allocate and init array for next parameter int first_element = 2; // new array mv.visitLdcInsn(new Integer(n)); mv.visitTypeInsn(ANEWARRAY, Naming.RTTI_CONTAINER_TYPE); for (int i = 0; i < n; i++) { mv.visitInsn(DUP); mv.visitLdcInsn(new Integer(i)); mv.visitVarInsn(ALOAD, first_element + i); mv.visitInsn(AASTORE); } // invoke super.<init> mv.visitMethodInsn(INVOKESPECIAL, Naming.TUPLE_RTTI_CONTAINER_TYPE, "<init>", "(Ljava/lang/Class;[" + Naming.RTTI_CONTAINER_DESC + ")V"); int pno = 2; // skip the java class parameter for (int i = Naming.STATIC_PARAMETER_ORIGIN; i < n + Naming.STATIC_PARAMETER_ORIGIN; i++) { String spn = "T" + i; // not yet this; sp.getKind(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, pno); mv.visitFieldInsn(PUTFIELD, name, spn, Naming.RTTI_CONTAINER_DESC); pno++; } voidEpilogue(mv); } // fields and getters for (int i = Naming.STATIC_PARAMETER_ORIGIN; i < n + Naming.STATIC_PARAMETER_ORIGIN; i++) { fieldAndGetterForStaticParameter(cw, stem_name, "T" + i, i); } // clinit -- part of the dictionary call // dictionary // factory // ought to create bogus xldata for tuples and arrows, instead we pass null emitDictionaryAndFactoryForGenericRTTIclass(cw, name, n, null); cw.visitEnd(); return cw.toByteArray(); }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
/** * @param mv/*from w w w. ja v a 2 s . c o m*/ * @param cast_to */ public static void generalizedInstanceOf(MethodVisitor mv, String cast_to) { if (cast_to.startsWith(Naming.UNION_OX)) { List<String> cast_to_parameters = RTHelpers.extractStringParameters(cast_to); Label done = new Label(); for (int i = 0; i < cast_to_parameters.size(); i++) { mv.visitInsn(DUP); // object to test generalizedInstanceOf(mv, cast_to_parameters.get(i)); // replaces obj w/ 1/0 mv.visitInsn(DUP); // copy for branch test. leave one on TOS // eepI(mv,"union instanceof subtest " + cast_to_parameters.get(i)); mv.visitJumpInsn(IFNE, done); mv.visitInsn(POP); // discard unnecessary zero. } mv.visitLdcInsn(0); // failure mv.visitLabel(done); mv.visitInsn(SWAP); // put tested obj on TOS mv.visitInsn(POP); // discard } else if (cast_to.startsWith(Naming.TUPLE_OX)) { mv.visitMethodInsn(Opcodes.INVOKESTATIC, CONCRETE_ + cast_to, IS_A, "(Ljava/lang/Object;)Z"); } else if (cast_to.startsWith(Naming.ARROW_OX)) { mv.visitMethodInsn(Opcodes.INVOKESTATIC, ABSTRACT_ + cast_to, IS_A, "(Ljava/lang/Object;)Z"); } else { String type = cast_to.equals(Naming.INTERNAL_SNOWMAN) ? Naming.specialFortressTypes.get(Naming.INTERNAL_SNOWMAN) : cast_to; mv.visitTypeInsn(Opcodes.INSTANCEOF, type); } }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
public static void pushArgsIntoArray(MethodVisitor mv, int first_arg, int n_args, int array_offset) { for (int arg = 0; arg < n_args; arg++) { mv.visitVarInsn(Opcodes.ALOAD, array_offset); mv.visitLdcInsn(arg); //index is the static param number mv.visitVarInsn(Opcodes.ALOAD, arg + first_arg); mv.visitInsn(Opcodes.AASTORE);//from www . j a v a 2 s.c o m } mv.visitVarInsn(ALOAD, array_offset); }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
public static void pushArgsIntoArray(MethodVisitor mv, int first_arg, int n_args, int array_offset, List<Boolean> nulls) { int nulls_pushed = 0; for (int arg = 0; arg < n_args; arg++) { mv.visitVarInsn(Opcodes.ALOAD, array_offset); mv.visitLdcInsn(arg); //index is the static param number if (nulls.get(arg)) { mv.visitInsn(Opcodes.ACONST_NULL); nulls_pushed++;//from w ww. ja va 2 s. co m } else { mv.visitVarInsn(Opcodes.ALOAD, arg + first_arg - nulls_pushed); } mv.visitInsn(Opcodes.AASTORE); } mv.visitVarInsn(ALOAD, array_offset); }
From source file:com.sun.fortress.runtimeSystem.InstantiatingClassloader.java
License:Open Source License
/** * @param rttiClassName/*from w ww . jav a 2 s . c o m*/ * @param sparams_size */ static public void emitDictionaryAndFactoryForGenericRTTIclass(ManglingClassWriter cw, String rttiClassName, int sparams_size, final Naming.XlationData xldata) { // Push nulls for opr parameters in the factory call. List<Boolean> spks; int type_sparams_size = sparams_size; if (xldata != null) { spks = xldata.isOprKind(); sparams_size = spks.size(); } else { spks = new InfiniteList<Boolean>(false); } // FIELD // static, initialized to Map-like thing cw.visitField(ACC_PRIVATE + ACC_STATIC + ACC_FINAL, "DICTIONARY", Naming.RTTI_MAP_DESC, null, null); // CLINIT // factory, consulting map, optionally invoking constructor. MethodVisitor mv = cw.visitNoMangleMethod(ACC_STATIC, "<clinit>", "()V", null, null); mv.visitCode(); // new mv.visitTypeInsn(NEW, Naming.RTTI_MAP_TYPE); // init mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, Naming.RTTI_MAP_TYPE, "<init>", "()V"); // store mv.visitFieldInsn(PUTSTATIC, rttiClassName, "DICTIONARY", Naming.RTTI_MAP_DESC); mv.visitInsn(RETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); // FACTORY boolean useSparamsArray = sparams_size > 6; int sparamsArrayIndex = sparams_size; String fact_sig = Naming.rttiFactorySig(type_sparams_size); String init_sig = InstantiatingClassloader.jvmSignatureForOnePlusNTypes("java/lang/Class", type_sparams_size, Naming.RTTI_CONTAINER_TYPE, "V"); String get_sig; String put_sig; String getClass_sig; if (useSparamsArray) { get_sig = Naming.makeMethodDesc(Naming.RTTI_CONTAINER_ARRAY_DESC, Naming.RTTI_CONTAINER_DESC); put_sig = Naming.makeMethodDesc(Naming.RTTI_CONTAINER_ARRAY_DESC + Naming.RTTI_CONTAINER_DESC, Naming.RTTI_CONTAINER_DESC); getClass_sig = Naming.makeMethodDesc(NamingCzar.descString + Naming.RTTI_CONTAINER_ARRAY_DESC, NamingCzar.descClass); } else { get_sig = InstantiatingClassloader.jvmSignatureForNTypes(sparams_size, Naming.RTTI_CONTAINER_TYPE, Naming.RTTI_CONTAINER_DESC); put_sig = InstantiatingClassloader.jvmSignatureForNTypes(sparams_size + 1, Naming.RTTI_CONTAINER_TYPE, Naming.RTTI_CONTAINER_DESC); getClass_sig = InstantiatingClassloader.jvmSignatureForOnePlusNTypes(NamingCzar.internalString, sparams_size, Naming.RTTI_CONTAINER_TYPE, NamingCzar.descClass); } mv = cw.visitNoMangleMethod(ACC_PUBLIC + ACC_STATIC, Naming.RTTI_FACTORY, fact_sig, null, null); mv.visitCode(); /* * First arg is java class, necessary for creation of type. * * rCN x = DICTIONARY.get(args) * if x == null then * x = new rCN(args) * x = DICTIONARY.put(args, x) * end * return x */ // object mv.visitFieldInsn(GETSTATIC, rttiClassName, "DICTIONARY", Naming.RTTI_MAP_DESC); // push args int l = sparams_size; if (useSparamsArray) { mv.visitLdcInsn(sparams_size); mv.visitTypeInsn(Opcodes.ANEWARRAY, Naming.RTTI_CONTAINER_TYPE); mv.visitVarInsn(Opcodes.ASTORE, sparamsArrayIndex); InstantiatingClassloader.pushArgsIntoArray(mv, 0, l, sparamsArrayIndex, spks); } else { InstantiatingClassloader.pushArgs(mv, 0, l, spks); } // invoke Dictionary.get mv.visitMethodInsn(INVOKEVIRTUAL, Naming.RTTI_MAP_TYPE, "get", get_sig); Label not_null = new Label(); mv.visitInsn(DUP); mv.visitJumpInsn(IFNONNULL, not_null); mv.visitInsn(POP); // discard dup'd null // doing it all on the stack -- (unless too many static params, then use an array for human coded stuff) // 1) first push the dictionary and args (array if used) // 2) create new RTTI object // 3) push args again (array if used) and create the class for this object // 4) push the args again (never array) to init RTTI object // 5) add to dictionary //1) mv.visitFieldInsn(GETSTATIC, rttiClassName, "DICTIONARY", Naming.RTTI_MAP_DESC); if (useSparamsArray) { mv.visitVarInsn(ALOAD, sparamsArrayIndex); } else { InstantiatingClassloader.pushArgs(mv, 0, l, spks); } // 2) invoke constructor mv.visitTypeInsn(NEW, rttiClassName); mv.visitInsn(DUP); // 3) create class for this object String stem = Naming.rttiClassToBaseClass(rttiClassName); if (true || xldata == null) { // NOT symbolic (and a problem if we pretend that it is) mv.visitLdcInsn(stem); } else { RTHelpers.symbolicLdc(mv, stem); } if (useSparamsArray) { mv.visitVarInsn(ALOAD, sparamsArrayIndex); } else { InstantiatingClassloader.pushArgs(mv, 0, l, spks); } //(mv, "before getRTTIclass"); mv.visitMethodInsn(Opcodes.INVOKESTATIC, Naming.RT_HELPERS, "getRTTIclass", getClass_sig); //eep(mv, "after getRTTIclass"); // 4) init RTTI object (do not use array) // NOTE only pushing type_sparams here. InstantiatingClassloader.pushArgs(mv, 0, type_sparams_size); mv.visitMethodInsn(INVOKESPECIAL, rttiClassName, "<init>", init_sig); // 5) add to dictionary mv.visitMethodInsn(INVOKEVIRTUAL, Naming.RTTI_MAP_TYPE, "putIfNew", put_sig); mv.visitLabel(not_null); mv.visitInsn(ARETURN); mv.visitMaxs(Naming.ignoredMaxsParameter, Naming.ignoredMaxsParameter); mv.visitEnd(); }
From source file:com.sun.tdk.jcov.instrument.DeferringMethodClassAdapter.java
License:Open Source License
@Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if (!params.isInstrumentSynthetic() && (access & ACC_SYNTHETIC) != 0) { return super.visitMethod(access, name, desc, signature, exceptions); // return null; }//from w ww .ja v a2 s .co m MethodVisitor mv = visitMethodCoverage(access, name, desc, signature, exceptions); if ("<clinit>".equals(name) && !params.isDynamicCollect() && (k.getPackageName().startsWith("java/lang/"))) { mv = new MethodVisitor(Opcodes.ASM4, mv) { public void visitCode() { mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/Collect", "init", "()V"); super.visitCode(); } }; } if (params.isCallerFilterOn() && params.isCallerFilterAccept(k.getFullname()) && !params.isDynamicCollect()) { if (name.equals("<clinit>")) { int id = (name + desc).hashCode(); mv.visitLdcInsn(id); mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/CollectDetect", "setExpected", "(I)V"); } } if (params.isInnerInvacationsOff() && Utils.isAdvanceStaticInstrAllowed(k.getFullname(), name)) { if (name.equals("<clinit>")) { mv.visitMethodInsn(INVOKESTATIC, "com/sun/tdk/jcov/runtime/CollectDetect", "enterClinit", "()V"); } } // System.out.println("Seeing " + k.fullname + "." + name); if (params.isDataSaveFilterAccept(k.getFullname(), name, true)) { mv = new SavePointsMethodAdapter(mv, true); } if (params.isDataSaveFilterAccept(k.getFullname(), name, false)) { mv = new SavePointsMethodAdapter(mv, false); } mv = new MethodVisitor(Opcodes.ASM4, mv) { @Override public void visitLocalVariable(String arg0, String arg1, String arg2, Label arg3, Label arg4, int arg5) { //super.visitLocalVariable(arg0, arg1, arg2, arg3, arg4, arg5); } }; if (params.isDynamicCollect()) { mv = new InvokeMethodAdapter(mv, k.getFullname(), params); } else { mv = new StaticInvokeMethodAdapter(mv, k.getFullname(), name, access, params); } return mv; }
From source file:com.taobao.asm.AsmExample.java
License:Apache License
public static void main(String[] args) throws IOException, IllegalArgumentException, SecurityException, IllegalAccessException, InvocationTargetException { ClassReader cr = new ClassReader(Foo.class.getName()); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new MethodChangeClassAdapter(cw); cr.accept(cv, Opcodes.ASM4);//ww w . j a va 2 s .c o m // MethodVisitor mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "add", "([Ljava/lang/String;)V", null, null); // pushes the 'out' field (of type PrintStream) of the System class mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); // pushes the "Hello World!" String constant mw.visitLdcInsn("this is add method print!"); // invokes the 'println' method (defined in the PrintStream class) mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mw.visitInsn(RETURN); // this code uses a maximum of two stack elements and two local // variables mw.visitMaxs(0, 0); mw.visitEnd(); // gets the bytecode of the Example class, and loads it dynamically byte[] code = cw.toByteArray(); AsmExample loader = new AsmExample(); Class<?> exampleClass = loader.defineClass(Foo.class.getName(), code, 0, code.length); for (Method method : exampleClass.getMethods()) { System.out.println(method); } System.out.println("*************"); // uses the dynamically generated class to print 'Helloworld' exampleClass.getMethods()[0].invoke(null); //changeMethodContent System.out.println("*************"); exampleClass.getMethods()[1].invoke(null); //execute,?? // gets the bytecode of the Example class, and loads it dynamically FileOutputStream fos = new FileOutputStream("e:\\logs\\Example.class"); fos.write(code); fos.close(); }
From source file:com.taobao.asm.AsmTest.java
License:Apache License
@Test public void test() throws Throwable { ClassReader cr = new ClassReader(Config.class.getName()); ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_MAXS); ClassVisitor cv = new MethodChangeClassAdapter(cw); cr.accept(cv, Opcodes.ASM5);/*from w w w .j av a 2s .co m*/ // MethodVisitor mw = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "add", "([Ljava/lang/String;)V", null, null); // pushes the 'out' field (of type PrintStream) of the System class mw.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); // pushes the "Hello World!" String constant mw.visitLdcInsn("this is add method print!"); // invokes the 'println' method (defined in the PrintStream class) mw.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V"); mw.visitInsn(RETURN); // this code uses a maximum of two stack elements and two local // variables mw.visitMaxs(0, 0); mw.visitEnd(); //Type.getDescriptor(AdviceFlowOuterHolder.class) FieldVisitor fv = cw.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "age", Type.INT_TYPE.toString(), null, 1); fv.visitEnd(); FieldVisitor fv2 = cw.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "name2", Type.getDescriptor(String.class), null, "name2"); fv2.visitEnd(); ModifyClassVisiter cv2 = new ModifyClassVisiter(Opcodes.ASM5); cv2.addRemoveField("name"); cr.accept(cv2, Opcodes.ASM5); FieldVisitor fv3 = cw.visitField(ACC_PUBLIC + ACC_STATIC + ACC_FINAL, "name", Type.getDescriptor(String.class), null, "name"); fv3.visitEnd(); byte[] code = cw.toByteArray(); File file = new File("Config.class"); System.out.println(file.getAbsolutePath()); FileOutputStream fos = new FileOutputStream(file); fos.write(code); fos.close(); }