Example usage for org.objectweb.asm MethodVisitor visitMaxs

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

Introduction

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

Prototype

public void visitMaxs(final int maxStack, final int maxLocals) 

Source Link

Document

Visits the maximum stack size and the maximum number of local variables of the method.

Usage

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