Example usage for org.objectweb.asm MethodVisitor visitCode

List of usage examples for org.objectweb.asm MethodVisitor visitCode

Introduction

In this page you can find the example usage for org.objectweb.asm MethodVisitor visitCode.

Prototype

public void visitCode() 

Source Link

Document

Starts the visit of the method's code, if any (i.e.

Usage

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();
}