Example usage for org.objectweb.asm MethodVisitor visitLdcInsn

List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitLdcInsn.

Prototype

public void visitLdcInsn(final Object value) 

Source Link

Document

Visits a LDC instruction.

Usage

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();

}