List of usage examples for org.objectweb.asm MethodVisitor visitMaxs
public void visitMaxs(final int maxStack, final int maxLocals)
From source file:jerl.bcm.inj.InjectionClassMethodAdd.java
License:Apache License
@Override public void inject(ClassVisitor cv) { MethodVisitor mv = cv.visitMethod(getAccess(), getName(), getDesc(), getSignature(), getExceptions()); mv.visitCode();/* ww w.java 2s.co m*/ mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 0); mv.visitEnd(); }
From source file:jpcsp.Allegrex.compiler.CodeBlock.java
License:Open Source License
private void addConstructor(ClassVisitor cv) { MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, "<init>", "()V", null, null); mv.visitCode();//from w w w. j a va 2 s . co m mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitMethodInsn(Opcodes.INVOKESPECIAL, objectInternalName, "<init>", "()V"); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 1); mv.visitEnd(); }
From source file:jpcsp.Allegrex.compiler.CodeBlock.java
License:Open Source License
private void addNonStaticMethods(CompilerContext context, ClassVisitor cv) { MethodVisitor mv; // public int exec(int returnAddress, int alternativeReturnAddress, boolean isJump) throws Exception; mv = cv.visitMethod(Opcodes.ACC_PUBLIC, context.getExecMethodName(), context.getExecMethodDesc(), null, exceptions);//from w w w . j ava2s . c o m mv.visitCode(); mv.visitMethodInsn(Opcodes.INVOKESTATIC, getClassName(), context.getStaticExecMethodName(), context.getStaticExecMethodDesc()); mv.visitInsn(Opcodes.IRETURN); mv.visitMaxs(1, 1); mv.visitEnd(); // private static IExecutable e; FieldVisitor fv = cv.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, context.getReplaceFieldName(), executableDescriptor, null, null); fv.visitEnd(); // public void setExecutable(IExecutable e); mv = cv.visitMethod(Opcodes.ACC_PUBLIC, context.getReplaceMethodName(), context.getReplaceMethodDesc(), null, exceptions); mv.visitCode(); mv.visitVarInsn(Opcodes.ALOAD, 1); mv.visitFieldInsn(Opcodes.PUTSTATIC, getClassName(), context.getReplaceFieldName(), executableDescriptor); mv.visitInsn(Opcodes.RETURN); mv.visitMaxs(1, 2); mv.visitEnd(); // public IExecutable getExecutable(); mv = cv.visitMethod(Opcodes.ACC_PUBLIC, context.getGetMethodName(), context.getGetMethodDesc(), null, exceptions); mv.visitCode(); mv.visitFieldInsn(Opcodes.GETSTATIC, getClassName(), context.getReplaceFieldName(), executableDescriptor); mv.visitInsn(Opcodes.ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); }
From source file:jpcsp.Allegrex.compiler.CodeBlock.java
License:Open Source License
private Class<IExecutable> interpret(CompilerContext context) { Class<IExecutable> compiledClass = null; context.setCodeBlock(this); String className = getInternalClassName(); if (log.isInfoEnabled()) { log.info("Compiling for Interpreter " + className); }/* ww w. j a va2s . c o m*/ int computeFlag = ClassWriter.COMPUTE_FRAMES; if (context.isAutomaticMaxLocals() || context.isAutomaticMaxStack()) { computeFlag |= ClassWriter.COMPUTE_MAXS; } ClassWriter cw = new ClassWriter(computeFlag); ClassVisitor cv = cw; if (log.isDebugEnabled()) { cv = new CheckClassAdapter(cv); } StringWriter debugOutput = null; if (log.isDebugEnabled()) { debugOutput = new StringWriter(); PrintWriter debugPrintWriter = new PrintWriter(debugOutput); cv = new TraceClassVisitor(cv, debugPrintWriter); } cv.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null, objectInternalName, interfacesForExecutable); context.startClass(cv); addConstructor(cv); addNonStaticMethods(context, cv); MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, context.getStaticExecMethodName(), context.getStaticExecMethodDesc(), null, exceptions); mv.visitCode(); context.setMethodVisitor(mv); context.startMethod(); context.compileExecuteInterpreter(getStartAddress()); mv.visitMaxs(context.getMaxStack(), context.getMaxLocals()); mv.visitEnd(); cv.visitEnd(); if (debugOutput != null) { log.debug(debugOutput.toString()); } compiledClass = loadExecutable(context, className, cw.toByteArray()); return compiledClass; }
From source file:jpcsp.Allegrex.compiler.CodeBlock.java
License:Open Source License
private Class<IExecutable> compile(CompilerContext context) throws ClassFormatError { Class<IExecutable> compiledClass = null; context.setCodeBlock(this); String className = getInternalClassName(); if (log.isDebugEnabled()) { String functionName = Utilities.getFunctionNameByAddress(getStartAddress()); if (functionName != null) { log.debug(String.format("Compiling %s (%s)", className, functionName)); } else {//from w w w . j a v a 2 s . c o m log.debug(String.format("Compiling %s", className)); } } prepare(context, context.getMethodMaxInstructions()); currentSequence = null; int computeFlag = ClassWriter.COMPUTE_FRAMES; if (context.isAutomaticMaxLocals() || context.isAutomaticMaxStack()) { computeFlag |= ClassWriter.COMPUTE_MAXS; } ClassWriter cw = new ClassWriter(computeFlag); ClassVisitor cv = cw; if (log.isDebugEnabled()) { cv = new CheckClassAdapter(cv); } StringWriter debugOutput = null; if (log.isTraceEnabled()) { debugOutput = new StringWriter(); PrintWriter debugPrintWriter = new PrintWriter(debugOutput); cv = new TraceClassVisitor(cv, debugPrintWriter); } cv.visit(Opcodes.V1_6, Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER, className, null, objectInternalName, interfacesForExecutable); context.startClass(cv); addConstructor(cv); addNonStaticMethods(context, cv); MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, context.getStaticExecMethodName(), context.getStaticExecMethodDesc(), null, exceptions); mv.visitCode(); context.setMethodVisitor(mv); context.startMethod(); // Jump to the block start if other instructions have been inserted in front if (!codeInstructions.isEmpty() && codeInstructions.getFirst().getAddress() != getStartAddress()) { mv.visitJumpInsn(Opcodes.GOTO, getCodeInstruction(getStartAddress()).getLabel()); } compile(context, mv, codeInstructions); mv.visitMaxs(context.getMaxStack(), context.getMaxLocals()); mv.visitEnd(); for (SequenceCodeInstruction sequenceCodeInstruction : sequenceCodeInstructions) { if (log.isDebugEnabled()) { log.debug("Compiling Sequence " + sequenceCodeInstruction.getMethodName(context)); } currentSequence = sequenceCodeInstruction; mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, sequenceCodeInstruction.getMethodName(context), "()V", null, exceptions); mv.visitCode(); context.setMethodVisitor(mv); context.startSequenceMethod(); compile(context, mv, sequenceCodeInstruction.getCodeSequence().getInstructions()); context.endSequenceMethod(); mv.visitMaxs(context.getMaxStack(), context.getMaxLocals()); mv.visitEnd(); } currentSequence = null; cv.visitEnd(); if (debugOutput != null) { log.trace(debugOutput.toString()); } try { compiledClass = loadExecutable(context, className, cw.toByteArray()); } catch (NullPointerException e) { log.error("Error while compiling " + className + ": " + e); } return compiledClass; }
From source file:jtaint.ByteCodeUtil.java
License:Apache License
public static void buildGetter(ClassVisitor cv, String owner, String fieldName, String fieldDesc, int accFlags, String methodName) {// www. j a v a 2 s . co m MethodVisitor mv = cv.visitMethod(accFlags + ACC_PUBLIC, methodName, "()" + fieldDesc, null, null); Type t = Type.getType(fieldDesc); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, owner, fieldName, fieldDesc); mv.visitInsn(t.getOpcode(IRETURN)); mv.visitMaxs(t.getSize(), 1); mv.visitEnd(); }
From source file:jtaint.ByteCodeUtil.java
License:Apache License
public static void buildSetter(ClassVisitor cv, String owner, String fieldName, String fieldDesc, int accFlags, String methodName) {/* www.ja v a 2 s . c o m*/ MethodVisitor mv = cv.visitMethod(accFlags + ACC_PUBLIC, methodName, "(" + fieldDesc + ")V", null, null); Type t = Type.getType(fieldDesc); mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(t.getOpcode(ILOAD), 1); mv.visitFieldInsn(PUTFIELD, owner, fieldName, fieldDesc); mv.visitInsn(RETURN); mv.visitMaxs(1 + t.getSize(), 1 + t.getSize()); mv.visitEnd(); }
From source file:jtaint.ClassLoaderAdapter.java
License:Apache License
private void addDefineClassWrapper(String methodName, String methodDesc) { MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, ByteCodeUtil.internalName("defineClass"), methodDesc, null, null);/* w w w. ja v a 2 s .c o m*/ mv.visitCode(); mv.visitVarInsn(ALOAD, 0); /* This */ mv.visitVarInsn(ALOAD, 1); /* String name */ mv.visitVarInsn(ALOAD, 2); /* Buffer (byte[] or ByteBuffer */ mv.visitVarInsn(ILOAD, 3); /* offset */ mv.visitVarInsn(ILOAD, 4); /* len */ Type[] args = Type.getArgumentTypes(methodDesc); Type[] newArgs = new Type[3]; System.arraycopy(args, 1, newArgs, 0, 3); /* Buffer, offset, len */ String newDesc = Type.getMethodDescriptor(newArgs[0], newArgs); mv.visitMethodInsn(INVOKESTATIC, "jtaint/InstrumentationUtils", "instrument", newDesc); if ("Ljava/nio/ByteBuffer;".equals(newArgs[0].getDescriptor())) { mv.visitInsn(DUP); mv.visitMethodInsn(INVOKEVIRTUAL, "java/nio/ByteBuffer", "position", "()I"); mv.visitInsn(SWAP); mv.visitInsn(DUP_X1); mv.visitMethodInsn(INVOKEVIRTUAL, "java/nio/ByteBuffer", "remaining", "()I"); } else { mv.visitInsn(DUP); mv.visitInsn(ARRAYLENGTH); mv.visitInsn(ICONST_0); mv.visitInsn(SWAP); } /* Now push all additional arguments */ int l = 5; for (int i = 4; i < args.length; l += args[i].getSize(), i++) mv.visitVarInsn(args[i].getOpcode(ILOAD), l); mv.visitMethodInsn(INVOKESPECIAL, className, methodName, methodDesc); mv.visitInsn(ARETURN); mv.visitMaxs(l, l); mv.visitEnd(); }
From source file:jtaint.ClassLoaderAdapter.java
License:Apache License
private void addExportWrapper() { String desc = "(Ljava/lang/String;)Ljava/lang/Class;"; MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, ByteCodeUtil.internalName("findLoadedClass"), desc, null, null);//from w w w . j a v a2 s . c om mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, className, "findLoadedClass", desc); mv.visitInsn(ARETURN); mv.visitMaxs(2, 2); mv.visitEnd(); }
From source file:jtaint.InstrumentationLockBuilder.java
License:Apache License
private static final void buildIncLock(ClassVisitor cv, String className) { MethodVisitor mv; mv = cv.visitMethod(ACC_PUBLIC, ByteCodeUtil.internalName("incLock"), "()V", null, null); mv.visitCode();/*from ww w. j a v a2 s . com*/ mv.visitVarInsn(ALOAD, 0); mv.visitInsn(DUP); mv.visitFieldInsn(GETFIELD, className, ByteCodeUtil.internalName("lock"), "I"); mv.visitInsn(ICONST_1); mv.visitInsn(IADD); mv.visitFieldInsn(PUTFIELD, className, ByteCodeUtil.internalName("lock"), "I"); mv.visitInsn(RETURN); mv.visitMaxs(3, 1); mv.visitEnd(); }