List of usage examples for org.objectweb.asm MethodVisitor visitVarInsn
public void visitVarInsn(final int opcode, final int var)
From source file:bluejelly.runtime.ModuleLoader.java
License:BSD License
/** * Generate a {@link Caf} subclass for the given method information. * // w ww .j av a 2 s.c om * @param module module declaring the method to process * @param ci code info for the method to process * * @return * a {@link Caf} subclass whose <code>fastEnter</code> will call * module.ci.getMethod() with an {@link ExecutionContext} as argument. */ @SuppressWarnings("unchecked") private Class<Caf> generateCaf(Module module, CodeInfo ci) { String nodeName = this.genNodeName(ci); String cafName = Type.getInternalName(Caf.class); String moduleName = Type.getInternalName(module.getClass()); String methodName = ci.getMethod().getName(); ClassWriter cw = new ClassWriter(0); cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL, nodeName, null, cafName, null); { String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(Module.class), Type.getType(String.class) }); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", consDesc, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESPECIAL, cafName, "<init>", consDesc); mv.visitInsn(RETURN); mv.visitMaxs(3, 3); mv.visitEnd(); } this.generateFastEnter(cw, cafName, moduleName, methodName); cw.visitEnd(); byte[] b = cw.toByteArray(); Class<?> clazz = this.loader.defineClass(nodeName, b); return (Class<Caf>) clazz; }
From source file:bluejelly.runtime.ModuleLoader.java
License:BSD License
/** * Generate a {@link Code} subclass for the given method information. * //from ww w .j a v a2s .c om * @param module module declaring the method to process * @param ci code info for the method to process * * @return * a {@link Code} subclass whose <code>fastEnter</code> will call * module.ci.getMethod() with an {@link ExecutionContext} as argument. */ @SuppressWarnings("unchecked") private Class<Code> generateCode(Module module, CodeInfo ci) { String nodeName = this.genNodeName(ci); String codeName = Type.getInternalName(Code.class); String moduleName = Type.getInternalName(module.getClass()); String methodName = ci.getMethod().getName(); ClassWriter cw = new ClassWriter(0); cw.visit(V1_6, ACC_PUBLIC + ACC_FINAL, nodeName, null, codeName, null); { String consDesc = Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.getType(int.class), Type.getType(Module.class), Type.getType(String.class) }); MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", consDesc, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ILOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitVarInsn(ALOAD, 3); mv.visitMethodInsn(INVOKESPECIAL, codeName, "<init>", consDesc); mv.visitInsn(RETURN); mv.visitMaxs(4, 4); mv.visitEnd(); } this.generateFastEnter(cw, codeName, moduleName, methodName); cw.visitEnd(); byte[] b = cw.toByteArray(); Class<?> clazz = this.loader.defineClass(nodeName, b); return (Class<Code>) clazz; }
From source file:bluejelly.runtime.ModuleLoader.java
License:BSD License
/** * Override <code>fastEnter</code> method in class being visited * by <code>cw</code>, subclass of <code>superName</code>. Method * will call <code>methodName</code>. declared in class * <code>moduleName</code>. So , assuming class generated by * <code>cw</code> is named <code>X</code>, we will have: * /* w w w . ja v a 2 s . c o m*/ * <p> * <code> * class X extends superName { * public void fastEnter(ExecutionContext ctx) { * ((moduleName)this.module).methodName(ctx); * } * } * </code> * * @param cw class writer generating class code * @param superName internal name of superclass: Code or Caf * @param moduleName internal name of module class * @param methodName name of method to invoke in module moduleName */ private void generateFastEnter(ClassWriter cw, String superName, String moduleName, String methodName) { String fieldDesc = Type.getDescriptor(Module.class); String methodDesc = "(" + Type.getDescriptor(ExecutionContext.class) + ")V"; MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "fastEnter", methodDesc, null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, superName, "module", fieldDesc); mv.visitTypeInsn(CHECKCAST, moduleName); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, moduleName, methodName, methodDesc); mv.visitInsn(RETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
From source file:blusunrize.immersiveengineering.common.util.compat.jei.arcfurnace.ArcFurnaceRecipeWrapper.java
private static Class<? extends ArcFurnaceRecipeWrapper> createSubWrapper(String subtype) throws Exception { String entitySuperClassName = Type.getInternalName(ArcFurnaceRecipeWrapper.class); String entityProxySubClassName = ArcFurnaceRecipeWrapper.class.getSimpleName().concat(subtype); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS); cw.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC + Opcodes.ACC_SUPER, entityProxySubClassName, null, entitySuperClassName, null); cw.visitSource(entityProxySubClassName.concat(".java"), null); //create constructor String methodDescriptor = "(L" + Type.getInternalName(ArcFurnaceRecipe.class) + ";)V"; MethodVisitor mv = cw.visitMethod(Opcodes.ACC_PUBLIC, "<init>", methodDescriptor, null, null); mv.visitCode();/*w w w . ja v a2 s . c o m*/ mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, entitySuperClassName, "<init>", methodDescriptor, false); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(0, 0); mv.visitEnd(); cw.visitEnd(); return (Class<? extends ArcFurnaceRecipeWrapper>) new ProxyClassLoader( Thread.currentThread().getContextClassLoader(), cw.toByteArray()) .loadClass(entityProxySubClassName.replaceAll("/", ".")); }
From source file:boilerplate.processor.adapters.EqualsAdapter.java
License:Open Source License
private void addEqualsMethod(List<FieldInfo> fields) { // CODE: public boolean equals(Object obj) { MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); mv.visitCode();//from w w w .j a va 2 s.co m // CODE: if (this == obj) return true; mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); Label l0 = new Label(); mv.visitJumpInsn(IF_ACMPNE, l0); mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitLabel(l0); mv.visitFrame(F_SAME, 0, null, 0, null); // CODE: if (!(obj instanceof Foo)) return false; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(INSTANCEOF, typeInfo.type); Label l1 = new Label(); mv.visitJumpInsn(IFNE, l1); mv.visitInsn(ICONST_0); mv.visitInsn(IRETURN); mv.visitLabel(l1); mv.visitFrame(F_SAME, 0, null, 0, null); // CODE: final Foo other = (Foo) obj; mv.visitVarInsn(ALOAD, 1); mv.visitTypeInsn(CHECKCAST, typeInfo.type); mv.visitVarInsn(ASTORE, 2); for (FieldInfo info : fields) { addTest(mv, info); } // CODE: return true; } mv.visitInsn(ICONST_1); mv.visitInsn(IRETURN); mv.visitMaxs(1, 2); mv.visitEnd(); }
From source file:boilerplate.processor.adapters.EqualsAdapter.java
License:Open Source License
private void addHashCodeMethod(List<FieldInfo> fields) { // CODE: public int hashCode() { MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "hashCode", "()I", null, null); mv.visitCode();/*from w w w . j av a2 s. c o m*/ // CODE: final int prime = 31; mv.visitIntInsn(BIPUSH, 31); mv.visitVarInsn(ISTORE, 1); mv.visitInsn(ICONST_1); // CODE: int result = 1; mv.visitVarInsn(ISTORE, 2); for (FieldInfo fieldInfo : fields) { addCalculation(mv, fieldInfo); } // CODE: return result; } mv.visitVarInsn(ILOAD, 2); mv.visitInsn(IRETURN); mv.visitMaxs(1, 3); mv.visitEnd(); }
From source file:boilerplate.processor.adapters.ToStringAdapter.java
License:Open Source License
private void addMethod() { List<String> fieldNames = new ArrayList<String>(typeInfo.fields.size()); Map<String, FieldInfo> fields = new HashMap<String, FieldInfo>(typeInfo.fields.size()); boolean hasAnnotatedFields = typeInfo.hasAnnotatedFields(); for (FieldInfo info : typeInfo.fields) { if (!(hasAnnotatedFields ^ info.mark == Mark.INCLUDE)) { fieldNames.add(info.name);//from w w w . j a va 2 s .co m fields.put(info.name, info); } } Collections.sort(fieldNames); MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); mv.visitCode(); mv.visitTypeInsn(NEW, "java/lang/StringBuilder"); mv.visitInsn(DUP); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V"); mv.visitVarInsn(ASTORE, 1); for (String name : fieldNames) { FieldInfo info = fields.get(name); addField(mv, info); } mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;"); mv.visitInsn(ARETURN); mv.visitMaxs(4, 2); mv.visitEnd(); }
From source file:boilerplate.processor.adapters.ToStringMethodInsertion.java
License:Open Source License
public void generateCode(MethodVisitor mv, TypeInfo typeInfo, FieldInfo fieldInfo) { mv.visitVarInsn(ALOAD, 1); mv.visitLdcInsn(fieldInfo.name);//ww w. j a va2 s .c om mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, typeInfo.type, fieldInfo.name, fieldInfo.type.getDescriptor()); mv.visitMethodInsn(INVOKESTATIC, "boilerplate/tostring/ToStringUtils", methodName, methodSignature); }
From source file:br.usp.each.saeg.badua.core.internal.instr.IntegerInitProbe.java
License:Open Source License
@Override public void accept(final MethodVisitor mv) { mv.visitInsn(Opcodes.ICONST_0);//from w w w. ja v a2s . c o m mv.visitVarInsn(Opcodes.ISTORE, vCovered); mv.visitInsn(Opcodes.ICONST_0); mv.visitVarInsn(Opcodes.ISTORE, vAlive); mv.visitInsn(Opcodes.ICONST_M1); mv.visitVarInsn(Opcodes.ISTORE, vSleepy); }
From source file:br.usp.each.saeg.badua.core.internal.instr.IntegerProbe.java
License:Open Source License
@Override public void accept(final MethodVisitor mv) { // update covered if (potcov != 0) { mv.visitVarInsn(Opcodes.ILOAD, vAlive); if (!singlePredecessor && potcovpuse != 0) { mv.visitVarInsn(Opcodes.ILOAD, vSleepy); mv.visitInsn(Opcodes.IAND);/*from www . ja va2s . c o m*/ } InstrSupport.push(mv, (int) potcov); mv.visitInsn(Opcodes.IAND); mv.visitVarInsn(Opcodes.ILOAD, vCovered); mv.visitInsn(Opcodes.IOR); mv.visitVarInsn(Opcodes.ISTORE, vCovered); } // update alive if (disabled != 0) { InstrSupport.push(mv, ~(int) disabled); mv.visitVarInsn(Opcodes.ILOAD, vAlive); mv.visitInsn(Opcodes.IAND); } if (born != 0) { if (disabled == 0) { mv.visitVarInsn(Opcodes.ILOAD, vAlive); } InstrSupport.push(mv, (int) born); mv.visitInsn(Opcodes.IOR); } if (disabled != 0 || born != 0) { mv.visitVarInsn(Opcodes.ISTORE, vAlive); } // update sleepy InstrSupport.push(mv, ~(int) sleepy); mv.visitVarInsn(Opcodes.ISTORE, vSleepy); }