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:org.eclipse.objectteams.otredyn.bytecode.asm.AddGlobalTeamActivationAdapter.java

License:Open Source License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    synchronized (AddGlobalTeamActivationAdapter.class) {
        if (!done && isMainMethod(name, desc, access)) {
            done = true;/*from   ww w. j  a  v a  2 s .  c o m*/
            final MethodVisitor methodVisitor = cv.visitMethod(access, name, desc, null, null);
            return new AdviceAdapter(this.api, methodVisitor, access, name, desc) {
                @Override
                protected void onMethodEnter() {
                    List<String> teams = getTeamsFromConfigFile();
                    for (String aTeam : teams) {
                        Label start, end, typeHandler, ctorHandler, after;

                        String aTeamSlash = aTeam.replace('.', '/');

                        // new SomeTeam():
                        methodVisitor.visitLabel(start = new Label());
                        methodVisitor.visitTypeInsn(Opcodes.NEW, aTeamSlash);
                        //       .activate(Team.ALL_THREADS):
                        methodVisitor.visitInsn(Opcodes.DUP);
                        methodVisitor.visitMethodInsn(Opcodes.INVOKESPECIAL, aTeamSlash, "<init>", "()V",
                                false);
                        methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, ClassNames.TEAM_SLASH, "ALL_THREADS",
                                "Ljava/lang/Thread;");
                        methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, aTeamSlash, "activate",
                                "(Ljava/lang/Thread;)V", false);

                        methodVisitor.visitLabel(end = new Label());
                        methodVisitor.visitJumpInsn(Opcodes.GOTO, after = new Label());

                        // catch (ClassNotFoundException, NoClassDefFoundError):
                        //   System.err.println(...)
                        methodVisitor.visitLabel(typeHandler = new Label());
                        methodVisitor.visitInsn(Opcodes.POP); // discard the exception
                        methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err",
                                "Ljava/io/PrintStream;");
                        methodVisitor.visitLdcInsn("Config error: Team class '" + aTeam + "' in config file '"
                                + TEAM_CONFIG_FILE + "' can not be found!");
                        methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                "(Ljava/lang/String;)V", false);
                        methodVisitor.visitJumpInsn(Opcodes.GOTO, after);
                        methodVisitor.visitTryCatchBlock(start, end, typeHandler,
                                "java/lang/ClassNotFoundException");
                        // dup to avoid stackmap errors (ASM bug at 1.8)
                        methodVisitor.visitLabel(typeHandler = new Label());
                        methodVisitor.visitInsn(Opcodes.POP); // discard the exception
                        methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err",
                                "Ljava/io/PrintStream;");
                        methodVisitor.visitLdcInsn("Config error: Team class '" + aTeam + "' in config file '"
                                + TEAM_CONFIG_FILE + "' can not be found!");
                        methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                "(Ljava/lang/String;)V", false);
                        methodVisitor.visitJumpInsn(Opcodes.GOTO, after);
                        //
                        methodVisitor.visitTryCatchBlock(start, end, typeHandler,
                                "java/lang/NoClassDefFoundError");

                        // catch (NoSuchMethodError):
                        //   System.err.println(...)
                        methodVisitor.visitLabel(ctorHandler = new Label());
                        methodVisitor.visitInsn(Opcodes.POP); // discard the exception
                        methodVisitor.visitFieldInsn(Opcodes.GETSTATIC, "java/lang/System", "err",
                                "Ljava/io/PrintStream;");
                        methodVisitor.visitLdcInsn(
                                "Activation failed: Team class '" + aTeam + "' has no default constuctor!");
                        methodVisitor.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/io/PrintStream", "println",
                                "(Ljava/lang/String;)V", false);
                        methodVisitor.visitTryCatchBlock(start, end, ctorHandler,
                                "java/lang/NoSuchMethodError");

                        methodVisitor.visitLabel(after);
                    }
                }

                @Override
                public void visitMaxs(int maxStack, int maxLocals) {
                    super.visitMaxs(Math.max(maxStack, 3), maxLocals);
                }
            };
        }
        return null;
    }
}

From source file:org.eclipse.wb.internal.core.utils.reflect.AbstractMethodsImplementorVisitor.java

License:Open Source License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    // replace abstract method with method that throws java.lang.Error
    if ((access & ACC_ABSTRACT) != 0) {
        if (!m_interface) {
            MethodVisitor mv = cv.visitMethod(access & ~ACC_ABSTRACT, name, desc, signature, exceptions);
            mv.visitCode();/*from   w w w.j av a  2 s  .c  o m*/
            // throw exception
            if (!Type.getReturnType(desc).getClassName().equals("void")) {
                mv.visitTypeInsn(NEW, "java/lang/Error");
                mv.visitInsn(DUP);
                mv.visitLdcInsn("Designer implemented stub for abstract method " + m_className + "." + name
                        + desc
                        + " however you can not use this method (we just can not know what it should do).");
                mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Error", "<init>", "(Ljava/lang/String;)V");
                mv.visitInsn(ATHROW);
            } else {
                mv.visitInsn(RETURN);
            }
            // end
            mv.visitMaxs(0, 0);
            mv.visitEnd();
            return mv;
        }
    }
    // default handling
    return super.visitMethod(access, name, desc, signature, exceptions);
}

From source file:org.eclipse.wb.internal.rcp.model.util.ActivatorGetImagesByteCodeProcessor.java

License:Open Source License

private byte[] transformActivatorClass(byte[] bytes) {
    final boolean[] apply = { false };
    ClassReader classReader = new ClassReader(bytes);
    ToBytesClassAdapter codeRewriter = new ToBytesClassAdapter(ClassWriter.COMPUTE_MAXS) {
        @Override//from w  ww  . j  a  v a2s. com
        public MethodVisitor visitMethod(int access, String name, String desc, String signature,
                String[] exceptions) {
            final MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);
            final int pathParameterIndex = (access & ACC_STATIC) != 0 ? 0 : 1;
            // transform Activator.getImageDescriptor()
            if (name.equals("getImageDescriptor")
                    && desc.equals("(Ljava/lang/String;)Lorg/eclipse/jface/resource/ImageDescriptor;")) {
                apply[0] = true;
                return new EmptyVisitor() {
                    @Override
                    public void visitCode() {
                        mv.visitLdcInsn(m_activatorProjectPath);
                        mv.visitVarInsn(ALOAD, pathParameterIndex);
                        mv.visitMethodInsn(INVOKESTATIC,
                                "org/eclipse/wb/internal/rcp/model/util/InternalImageManager",
                                "getImageDescriptor",
                                "(Ljava/lang/String;Ljava/lang/String;)Lorg/eclipse/jface/resource/ImageDescriptor;");
                        mv.visitInsn(ARETURN);
                    }

                    @Override
                    public void visitMaxs(int maxStack, int maxLocals) {
                        mv.visitMaxs(maxStack, maxLocals);
                    }
                };
            }
            // transform Activator.getImage()
            if (name.equals("getImage")
                    && desc.equals("(Ljava/lang/String;)Lorg/eclipse/swt/graphics/Image;")) {
                apply[0] = true;
                return new EmptyVisitor() {
                    @Override
                    public void visitCode() {
                        mv.visitLdcInsn(m_activatorProjectPath);
                        mv.visitVarInsn(ALOAD, pathParameterIndex);
                        mv.visitMethodInsn(INVOKESTATIC,
                                "org/eclipse/wb/internal/rcp/model/util/InternalImageManager", "getImage",
                                "(Ljava/lang/String;Ljava/lang/String;)Lorg/eclipse/swt/graphics/Image;");
                        mv.visitInsn(ARETURN);
                    }

                    @Override
                    public void visitMaxs(int maxStack, int maxLocals) {
                        mv.visitMaxs(maxStack, maxLocals);
                    }
                };
            }
            return mv;
        }
    };
    classReader.accept(codeRewriter, 0);
    return apply[0] ? codeRewriter.toByteArray() : bytes;
}

From source file:org.enerj.enhancer.ClassEnhancer.java

License:Open Source License

/**
 * Emits the &lt;clinit> method when one does not already exist.
 * Initializes the value of the class Id.
 *//*from ww  w.ja va2 s.  c o  m*/
private void emitClassInit() {
    MethodVisitor mv = cv.visitMethod(ACC_STATIC, "<clinit>", sNoArgMethodSignature, null, null);
    mv.visitCode();
    mv.visitLdcInsn((Long) mClassId);
    mv.visitFieldInsn(PUTSTATIC, mThisClassNameSlashed, sClassIdFieldName, "J");
    mv.visitInsn(RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();
}

From source file:org.evosuite.instrumentation.CreateClassResetClassAdapter.java

License:Open Source License

private void createEmptyStaticReset() {
    logger.info("Creating brand-new static initializer in class {}", className);
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, ClassResetter.STATIC_RESET,
            "()V", null, null);
    mv.visitCode();//from   w  w w.  jav a 2s  . com
    for (StaticField staticField : static_fields) {

        if (!finalFields.contains(staticField.name)) {

            logger.info("Adding bytecode for initializing field {}", staticField.name);

            if (staticField.value != null) {
                mv.visitLdcInsn(staticField.value);
            } else {
                Type type = Type.getType(staticField.desc);
                switch (type.getSort()) {
                case Type.BOOLEAN:
                case Type.BYTE:
                case Type.CHAR:
                case Type.SHORT:
                case Type.INT:
                    mv.visitInsn(Opcodes.ICONST_0);
                    break;
                case Type.FLOAT:
                    mv.visitInsn(Opcodes.FCONST_0);
                    break;
                case Type.LONG:
                    mv.visitInsn(Opcodes.LCONST_0);
                    break;
                case Type.DOUBLE:
                    mv.visitInsn(Opcodes.DCONST_0);
                    break;
                case Type.ARRAY:
                case Type.OBJECT:
                    mv.visitInsn(Opcodes.ACONST_NULL);
                    break;
                }
            }
            mv.visitFieldInsn(Opcodes.PUTSTATIC, className, staticField.name, staticField.desc);

        }
    }
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

}

From source file:org.evosuite.instrumentation.EndOfClassInitializerVisitor.java

License:Open Source License

private void createEmptyClassInit() {
    logger.info("Creating <clinit> in class " + className);
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
    mv.visitCode();/*from  w w w.  ja  v a 2  s .  c  o m*/

    String executionTracerClassName = ExecutionTracer.class.getName().replace('.', '/');
    String executionTracerDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, Type.getType(String.class));

    String classNameWithDots = className.replace('/', '.');
    mv.visitLdcInsn(classNameWithDots);
    mv.visitMethodInsn(INVOKESTATIC, executionTracerClassName, EXIT_CLASS_INIT, executionTracerDescriptor,
            false);

    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

}

From source file:org.evosuite.runtime.instrumentation.CreateClassResetClassAdapter.java

License:Open Source License

/**
 * Creates an empty __STATIC_RESET method where no <clinit> was found.
 *//*from www  .  ja  v  a2 s .  c o m*/
private void createEmptyStaticReset() {
    logger.info("Creating brand-new static initializer in class " + className);
    MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC,
            ClassResetter.STATIC_RESET, "()V", null, null);
    mv.visitCode();
    for (StaticField staticField : static_fields) {

        if (!finalFields.contains(staticField.name) && !staticField.name.startsWith("__cobertura")
                && !staticField.name.startsWith("$jacoco") && !staticField.name.startsWith("$VRc") // Old
        // Emma
        ) {

            logger.info("Adding bytecode for initializing field " + staticField.name);

            if (staticField.value != null) {
                mv.visitLdcInsn(staticField.value);
            } else {
                Type type = Type.getType(staticField.desc);
                switch (type.getSort()) {
                case Type.BOOLEAN:
                case Type.BYTE:
                case Type.CHAR:
                case Type.SHORT:
                case Type.INT:
                    mv.visitInsn(Opcodes.ICONST_0);
                    break;
                case Type.FLOAT:
                    mv.visitInsn(Opcodes.FCONST_0);
                    break;
                case Type.LONG:
                    mv.visitInsn(Opcodes.LCONST_0);
                    break;
                case Type.DOUBLE:
                    mv.visitInsn(Opcodes.DCONST_0);
                    break;
                case Type.ARRAY:
                case Type.OBJECT:
                    mv.visitInsn(Opcodes.ACONST_NULL);
                    break;
                }
            }
            mv.visitFieldInsn(Opcodes.PUTSTATIC, className, staticField.name, staticField.desc);

        }
    }
    mv.visitInsn(Opcodes.RETURN);
    mv.visitMaxs(0, 0);
    mv.visitEnd();

}

From source file:org.fluidity.composition.maven.AbstractAnnotationProcessorMojo.java

License:Apache License

@SuppressWarnings("ResultOfMethodCallIgnored")
private void generateBindingClass(final String className, final Collection<String> bindings,
        final File classesDirectory) throws MojoExecutionException {
    final ClassWriter generator = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
    generator.visit(V1_5, ACC_FINAL | ACC_PUBLIC, ClassReaders.internalName(className), null,
            EMPTY_BINDINGS_CLASS_NAME, null);

    {/*from ww  w .j a  va 2 s .  com*/
        final String constructorDesc = Type.getMethodDescriptor(Type.getType(void.class));
        final MethodVisitor method = generator.visitMethod(ACC_PUBLIC, ClassReaders.CONSTRUCTOR_METHOD_NAME,
                constructorDesc, null, null);
        method.visitCode();

        method.visitVarInsn(ALOAD, 0);
        method.visitMethodInsn(INVOKESPECIAL, EMPTY_BINDINGS_CLASS_NAME, ClassReaders.CONSTRUCTOR_METHOD_NAME,
                constructorDesc, false);
        method.visitInsn(RETURN);

        method.visitMaxs(0, 0);
        method.visitEnd();
    }

    {
        final String implementedDesc = Type.getMethodDescriptor(implementedMethod);
        final String invokedDesc = Type.getMethodDescriptor(invokedMethod);

        final MethodVisitor method = generator.visitMethod(ACC_PUBLIC, implementedMethod.getName(),
                implementedDesc, null, null);
        method.visitCode();

        for (final String implementationName : bindings) {
            method.visitVarInsn(ALOAD, 1);
            method.visitLdcInsn(Type.getObjectType(ClassReaders.internalName(implementationName)));
            method.visitInsn(ACONST_NULL);
            method.visitTypeInsn(CHECKCAST, Type.getInternalName(Class[].class));
            method.visitMethodInsn(INVOKEINTERFACE, Type.getInternalName(invokedMethod.getDeclaringClass()),
                    invokedMethod.getName(), invokedDesc, true);
        }

        method.visitInsn(Type.getReturnType(implementedDesc).getOpcode(IRETURN));

        method.visitMaxs(0, 0);
        method.visitEnd();
    }

    generator.visitEnd();

    final File file = new File(classesDirectory, ClassReaders.fileName(className));
    file.getParentFile().mkdirs();

    writeClassContents(file, generator);
}

From source file:org.forgerock.openidm.shell.felixgogo.FelixGogoCommandsServiceGenerator.java

License:Apache License

/**
 * Generate CommandProvider class and newBuilder for this class based on parameters.
 *
 * @param service  commands service/*w ww.j a  va  2 s . co m*/
 * @param commands commands map (name=help)
 * @param suffix   unique class suffix
 * @return generated CommandProvider newBuilder
 * @throws Exception if something went wrong
 */
public static Object generate(CustomCommandScope service, Map<String, String> commands, String suffix)
        throws Exception {
    // generate class with unique name
    //javassist.CtClass ctClass = POOL.makeClass(AbstractFelixCommandsService.class.getName() + suffix);

    try {
        ClassWriter cw = new ClassWriter(0);
        MethodVisitor mv;
        AnnotationVisitor av0;
        String className = AbstractFelixCommandsService.class.getName().replace('.', '/') + suffix;
        cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, className, null,
                AbstractFelixCommandsService.class.getName().replace('.', '/'), null);

        //cw.visitSource("AbstractFelixCommandsServiceSample.java", null);

        mv = cw.visitMethod(ACC_PUBLIC, "<init>", "(Ljava/lang/Object;)V", null, null);
        mv.visitCode();
        Label l0 = new Label();
        mv.visitLabel(l0);
        mv.visitLineNumber(10, l0);
        mv.visitVarInsn(ALOAD, 0);
        mv.visitVarInsn(ALOAD, 1);
        mv.visitMethodInsn(INVOKESPECIAL, AbstractFelixCommandsService.class.getName().replace('.', '/'),
                "<init>", "(Ljava/lang/Object;)V");
        Label l1 = new Label();
        mv.visitLabel(l1);
        mv.visitLineNumber(11, l1);
        mv.visitInsn(RETURN);
        Label l2 = new Label();
        mv.visitLabel(l2);
        mv.visitLocalVariable("this", "L" + className + ";", null, l0, l2, 0);
        mv.visitLocalVariable("service", "Ljava/lang/Object;", null, l0, l2, 1);
        mv.visitMaxs(2, 2);
        mv.visitEnd();

        /*javassist.bytecode.ClassFile ccFile = ctClass.getClassFile();
        ccFile.setVersionToJava5();
        javassist.bytecode.ConstPool constPool = ccFile.getConstPool();
                
        // set superclass
        javassist.CtClass abstractCtClass = POOL.getCtClass(AbstractFelixCommandsService.class.getName());
        ctClass.setSuperclass(abstractCtClass);
                
        // add constructor
        javassist.CtClass serviceCtClass = POOL.getCtClass(Object.class.getName());
        javassist.CtConstructor ctConstructor = new javassist.CtConstructor(new javassist.CtClass[]{serviceCtClass},
            ctClass);
        ctConstructor.setModifiers(javassist.Modifier.PUBLIC);
        ctConstructor.setBody("super($1);");
        ctClass.addConstructor(ctConstructor);
                
        // add method for each command
        javassist.CtClass sessionCtClass = POOL.getCtClass(CommandSession.class.getName());
        javassist.CtClass stringArrayCtClass = POOL.getCtClass(String[].class.getName());*/
        Set<String> names = commands.keySet();
        for (String name : names) {
            if (isMethodAvailable(service, name)) {
                mv = cw.visitMethod(ACC_PUBLIC, name,
                        "(Lorg/apache/felix/service/command/CommandSession;[Ljava/lang/String;)V", null, null);

                av0 = mv.visitAnnotation("Lorg/apache/felix/service/command/Descriptor;", true);
                av0.visit("value", commands.get(name));
                av0.visitEnd();

                mv.visitCode();
                l0 = new Label();
                mv.visitLabel(l0);
                mv.visitLineNumber(15, l0);
                mv.visitVarInsn(ALOAD, 0);
                mv.visitLdcInsn(name);
                mv.visitVarInsn(ALOAD, 1);
                mv.visitVarInsn(ALOAD, 2);
                mv.visitMethodInsn(INVOKEVIRTUAL, className, "runCommand",
                        "(Ljava/lang/String;Lorg/apache/felix/service/command/CommandSession;"
                                + "[Ljava/lang/String;)V");
                l1 = new Label();
                mv.visitLabel(l1);
                mv.visitLineNumber(16, l1);
                mv.visitInsn(RETURN);
                l2 = new Label();
                mv.visitLabel(l2);
                mv.visitLocalVariable("this", "L" + className + ";", null, l0, l2, 0);
                mv.visitLocalVariable("session", "Lorg/apache/felix/service/command/CommandSession;", null, l0,
                        l2, 1);
                mv.visitLocalVariable("args", "[Ljava/lang/String;", null, l0, l2, 2);
                mv.visitMaxs(4, 3);
                mv.visitEnd();

                /*javassist.CtMethod ctMethod = new javassist.CtMethod(javassist.CtClass.voidType, name,
                    new javassist.CtClass[]{
                        sessionCtClass, stringArrayCtClass
                    }, ctClass);
                ctMethod.setModifiers(javassist.Modifier.PUBLIC);
                ctMethod.setBody("runCommand(\"" + name + "\", $1, $2);");
                ctClass.addMethod(ctMethod);
                        
                // add GoGo descriptor for this shell command
                javassist.bytecode.AnnotationsAttribute annotationsAttribute =
                    new javassist.bytecode.AnnotationsAttribute(constPool,
                        javassist.bytecode.AnnotationsAttribute.visibleTag);
                javassist.bytecode.annotation.Annotation annotation =
                    new javassist.bytecode.annotation.Annotation(Descriptor.class.getName(), constPool);
                annotation.addMemberValue("value",
                    new javassist.bytecode.annotation.StringMemberValue(commands.get(name), constPool));
                annotationsAttribute.addAnnotation(annotation);
                ctMethod.getMethodInfo().addAttribute(annotationsAttribute);*/
            }
        }

        cw.visitEnd();
        // create new newBuilder
        /*Class<?> aClass = ctClass.toClass(FelixGogoCommandsServiceGenerator.class.getClassLoader(), null);
        */
        Class<?> aClass = classLoader.defineClass(className, cw.toByteArray());
        Constructor<?> constructor = aClass.getConstructor(Object.class);
        return constructor.newInstance(service);
    } catch (Exception e) {
        //ctClass.detach();
        throw e;
    }
}

From source file:org.glassfish.pfl.tf.spi.Util.java

License:Open Source License

public void emitIntConstant(MethodVisitor mv, int val) {
    info(2, "Emitting constant " + val);
    if (val <= 5) {
        switch (val) {
        case 0://from ww w  .java  2 s  .co m
            mv.visitInsn(Opcodes.ICONST_0);
            break;
        case 1:
            mv.visitInsn(Opcodes.ICONST_1);
            break;
        case 2:
            mv.visitInsn(Opcodes.ICONST_2);
            break;
        case 3:
            mv.visitInsn(Opcodes.ICONST_3);
            break;
        case 4:
            mv.visitInsn(Opcodes.ICONST_4);
            break;
        case 5:
            mv.visitInsn(Opcodes.ICONST_5);
            break;
        }
    } else {
        mv.visitLdcInsn(val);
    }
}