List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
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 <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); } }