List of usage examples for org.objectweb.asm MethodVisitor visitCode
public void visitCode()
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); }/*w w w. j ava2 s . com*/ 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 ww w .j ava2s . com*/ 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) {/*from ww w.ja v a2s . c o 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) {/*from w w w .j a v a2s . com*/ 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);/*from w w w . j a v a 2s .com*/ 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 ww .j a v a 2 s .c o m 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(); mv.visitVarInsn(ALOAD, 0);//w w w .ja v a 2s .co m 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(); }
From source file:jtaint.InstrumentationLockBuilder.java
License:Apache License
private static final void buildDecAndTestLock(ClassVisitor cv, String className) { MethodVisitor mv; mv = cv.visitMethod(ACC_PUBLIC, ByteCodeUtil.internalName("decAndTestLock"), "()I", null, null); mv.visitCode(); mv.visitVarInsn(ALOAD, 0);/* www .j a v a2 s . c om*/ mv.visitInsn(DUP); mv.visitFieldInsn(GETFIELD, className, ByteCodeUtil.internalName("lock"), "I"); mv.visitInsn(ICONST_1); mv.visitInsn(ISUB); mv.visitInsn(DUP_X1); mv.visitFieldInsn(PUTFIELD, className, ByteCodeUtil.internalName("lock"), "I"); mv.visitInsn(IRETURN); mv.visitMaxs(3, 1); mv.visitEnd(); }
From source file:jtaint.RemappingStringClassAdapter.java
License:Apache License
private void buildToString(int access, boolean hasOffset) { /* Do not call super.visitMethod, we don't want remapping done here */ MethodVisitor mv = cv.visitMethod(access, "toString", "()Ljava/lang/String;", null, null); if (mv == null) return;//from w ww .j a va 2 s . co m if ((access & ACC_ABSTRACT) != 0) { mv.visitEnd(); return; } mv.visitCode(); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, "jtaint/OrigStringUtil", "toBaseString", "(L" + className + ";)Ljava/lang/String;"); mv.visitInsn(ARETURN); mv.visitMaxs(1, 1); mv.visitEnd(); }
From source file:jtaint.ServletAdapter.java
License:Apache License
private void buildTaintedReturnWrapper(MethodVisitor mv, Klass k, int access, String name, String desc) { mv.visitCode(); Type[] args = Type.getArgumentTypes(desc); Type ret = Type.getReturnType(desc); boolean isStatic = (access & ACC_STATIC) != 0; int l = 0;//from w w w .j a v a2 s . com if (!isStatic) { mv.visitVarInsn(ALOAD, 0); l = 1; } for (int i = 0; i < args.length; l += args[i].getSize(), i++) mv.visitVarInsn(args[i].getOpcode(ILOAD), l); mv.visitMethodInsn(isStatic ? INVOKESTATIC : INVOKESPECIAL, className, ByteCodeUtil.internalName(name), desc); String taintDesc = Type.getMethodDescriptor(ret, new Type[] { ret }); if (k.isExact()) { /* We already know that we need to wrap...no runtime check needed */ mv.visitMethodInsn(INVOKESTATIC, "jtaint/StringUtil", "toTainted", taintDesc); mv.visitInsn(ARETURN); mv.visitMaxs(l, l); mv.visitEnd(); return; } /* Now taint the return type, if we need to */ mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, className, ByteCodeUtil.internalName("is" + k.simpleName()), "Z"); Label l0 = new Label(); mv.visitJumpInsn(IFEQ, l0); mv.visitMethodInsn(INVOKESTATIC, "jtaint/StringUtil", "toTainted", taintDesc); mv.visitLabel(l0); if (version == V1_6) mv.visitFrame(F_SAME1, 0, null, 1, new Object[] { ret.getInternalName() }); mv.visitInsn(ARETURN); mv.visitMaxs(Math.max(l, 2), l); mv.visitEnd(); }