Example usage for org.objectweb.asm MethodVisitor visitInsn

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

Introduction

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

Prototype

public void visitInsn(final int opcode) 

Source Link

Document

Visits a zero operand instruction.

Usage

From source file:br.usp.each.saeg.badua.core.internal.instr.LongInitProbe.java

License:Open Source License

@Override
public void accept(final MethodVisitor mv) {
    mv.visitInsn(Opcodes.LCONST_0);
    mv.visitVarInsn(Opcodes.LSTORE, vCovered);
    mv.visitInsn(Opcodes.LCONST_0);/*from   w  w  w  . j a va  2 s.co  m*/
    mv.visitVarInsn(Opcodes.LSTORE, vAlive);
    mv.visitLdcInsn(-1L);
    mv.visitVarInsn(Opcodes.LSTORE, vSleepy);
}

From source file:br.usp.each.saeg.badua.core.internal.instr.LongProbe.java

License:Open Source License

@Override
public void accept(final MethodVisitor mv) {

    // update covered
    if (potcov != 0) {
        mv.visitVarInsn(Opcodes.LLOAD, vAlive);

        if (!singlePredecessor && potcovpuse != 0) {
            mv.visitVarInsn(Opcodes.LLOAD, vSleepy);
            mv.visitInsn(Opcodes.LAND);
        }//  w w  w. ja v a2s  .c o m

        mv.visitLdcInsn(potcov);
        mv.visitInsn(Opcodes.LAND);
        mv.visitVarInsn(Opcodes.LLOAD, vCovered);
        mv.visitInsn(Opcodes.LOR);
        mv.visitVarInsn(Opcodes.LSTORE, vCovered);
    }

    // update alive
    if (disabled != 0) {
        mv.visitLdcInsn(~disabled);
        mv.visitVarInsn(Opcodes.LLOAD, vAlive);
        mv.visitInsn(Opcodes.LAND);
    }
    if (born != 0) {
        if (disabled == 0) {
            mv.visitVarInsn(Opcodes.LLOAD, vAlive);
        }
        mv.visitLdcInsn(born);
        mv.visitInsn(Opcodes.LOR);
    }
    if (disabled != 0 || born != 0) {
        mv.visitVarInsn(Opcodes.LSTORE, vAlive);
    }

    // update sleepy
    if (sleepy != 0) {
        mv.visitLdcInsn(~sleepy);
    } else {
        mv.visitLdcInsn(-1L);
    }
    mv.visitVarInsn(Opcodes.LSTORE, vSleepy);
}

From source file:br.usp.each.saeg.badua.core.internal.instr.LongUpdateProbe.java

License:Open Source License

@Override
public void accept(final MethodVisitor mv) {
    mv.visitVarInsn(Opcodes.LLOAD, vCovered);
    mv.visitMethodInsn(Opcodes.INVOKESTATIC, owner, InstrSupport.DATAMETHOD_NAME, InstrSupport.DATAMETHOD_DESC,
            false);/*from  w  ww  .ja  va2s .  c  o m*/
    InstrSupport.push(mv, index);
    mv.visitInsn(Opcodes.DUP2_X2);
    mv.visitInsn(Opcodes.LALOAD);
    mv.visitInsn(Opcodes.LOR);
    mv.visitInsn(Opcodes.LASTORE);
}

From source file:br.usp.each.saeg.badua.test.validation.MaxTest.java

License:Open Source License

@Override
@Before/*w  w  w . j a va2  s.co m*/
public void setUp() throws Exception {
    super.setUp();

    final int classVersion = Opcodes.V1_6;
    final int classAccessor = Opcodes.ACC_PUBLIC | Opcodes.ACC_SUPER;
    final String className = "Max";
    final String superName = "java/lang/Object";

    final int methodAccessor = Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC;
    final String methodName = "max";
    final String methodDesc = "([II)I";

    final ClassWriter cw = new ClassWriter(0);
    final MethodVisitor mw;

    cw.visit(classVersion, classAccessor, className, null, superName, null);
    mw = cw.visitMethod(methodAccessor, methodName, methodDesc, null, null);
    mw.visitCode();
    // block 0 (definitions {0, 1, 2, 3})
    mw.visitInsn(Opcodes.ICONST_0);
    mw.visitVarInsn(Opcodes.ISTORE, 2);
    mw.visitVarInsn(Opcodes.ALOAD, 0);
    mw.visitVarInsn(Opcodes.ILOAD, 2);
    mw.visitIincInsn(2, 1);
    mw.visitInsn(Opcodes.IALOAD);
    mw.visitVarInsn(Opcodes.ISTORE, 3);
    // block 1 (p-uses {1, 2})
    final Label backLoop = new Label();
    mw.visitLabel(backLoop);
    mw.visitVarInsn(Opcodes.ILOAD, 2);
    mw.visitVarInsn(Opcodes.ILOAD, 1);
    final Label breakLoop = new Label();
    mw.visitJumpInsn(Opcodes.IF_ICMPGE, breakLoop);
    // block 3 (p-uses {0, 2, 3})
    mw.visitVarInsn(Opcodes.ALOAD, 0);
    mw.visitVarInsn(Opcodes.ILOAD, 2);
    mw.visitInsn(Opcodes.IALOAD);
    mw.visitVarInsn(Opcodes.ILOAD, 3);
    final Label jump = new Label();
    mw.visitJumpInsn(Opcodes.IF_ICMPLE, jump);
    // block 5 (definitions {3}, uses {0, 2})
    mw.visitVarInsn(Opcodes.ALOAD, 0);
    mw.visitVarInsn(Opcodes.ILOAD, 2);
    mw.visitInsn(Opcodes.IALOAD);
    mw.visitVarInsn(Opcodes.ISTORE, 3);
    // block 4 (definitions {2}, uses {2})
    mw.visitLabel(jump);
    mw.visitIincInsn(2, 1);
    mw.visitJumpInsn(Opcodes.GOTO, backLoop);
    // block 2 ( uses {3})
    mw.visitLabel(breakLoop);
    mw.visitVarInsn(Opcodes.ILOAD, 3);
    mw.visitInsn(Opcodes.IRETURN);
    mw.visitMaxs(2, 4);
    mw.visitEnd();
    cw.visitEnd();

    final byte[] bytes = cw.toByteArray();
    klass = addClass(className, bytes);
    method = klass.getMethod(methodName, int[].class, int.class);
    classId = CRC64.checksum(bytes);

    RT.init(new RuntimeData());
}

From source file:cc.adf.metrics.agent.visitor.ApplicationModuleImplModifier.java

public static void addDetailNameMethod(ClassWriter cw) {
    MethodVisitor mv = cw.visitMethod(ACC_PRIVATE, "getDetailName", "()Ljava/lang/String;", null, null);
    mv.visitCode();/*from  w  ww.  ja  v a2s. co  m*/
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKEVIRTUAL, "oracle/jbo/server/ApplicationModuleImpl", "isRoot", "()Z", false);
    Label l0 = new Label();
    mv.visitJumpInsn(IFEQ, l0);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "oracle/jbo/server/ApplicationModuleImpl", "getName",
            "()Ljava/lang/String;", false);
    mv.visitInsn(ARETURN);
    mv.visitLabel(l0);
    mv.visitFrame(Opcodes.F_SAME, 0, null, 0, null);
    mv.visitTypeInsn(NEW, "java/lang/StringBuilder");
    mv.visitInsn(DUP);
    mv.visitMethodInsn(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "oracle/jbo/server/ApplicationModuleImpl", "getRootApplicationModule",
            "()Loracle/jbo/server/ApplicationModuleImpl;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "oracle/jbo/server/ApplicationModuleImpl", "getName",
            "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitLdcInsn("::");
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitVarInsn(ALOAD, 0);
    mv.visitMethodInsn(INVOKESPECIAL, "oracle/jbo/server/ApplicationModuleImpl", "getName",
            "()Ljava/lang/String;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "append",
            "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false);
    mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false);
    mv.visitInsn(ARETURN);
    mv.visitMaxs(2, 1);
    mv.visitEnd();
}

From source file:ch.eiafr.cojac.Agent.java

License:Apache License

/**
* This method works only with the FloatReplacerClasses class
* It instruments it to create a static initializer block to set
* all the static variables used by the agent and injected in the 
* instrumented application./*  w w w  .  ja  v  a  2 s .  c  om*/
* Warning: this is not the only place to set these variables, see class
* "CojacReferences" !
* This is used when there is more than one classloader in the application
*/
private byte[] setGlobalFields(byte[] byteCode, ClassLoader loader) {
    ClassReader cr = new ClassReader(byteCode);
    ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES);
    ClassVisitor cv = new ClassVisitor(Opcodes.ASM5, cw) {
        @Override
        public void visit(int version, int access, String name, String signature, String superName,
                String[] interfaces) {
            super.visit(version, access, name, signature, superName, interfaces);
            MethodVisitor mv = cv.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
            mv.visitLdcInsn(references.getDoubleWrapper());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setNgWrapper", "(Ljava/lang/String;)V", false);
            mv.visitLdcInsn(references.getNgWrapper());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setDoubleWrapper", "(Ljava/lang/String;)V", false);
            mv.visitLdcInsn(references.getFloatWrapper());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setFloatWrapper", "(Ljava/lang/String;)V", false);
            mv.visitLdcInsn(references.getBigDecimalPrecision());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setBigDecimalPrecision", "(I)V", false);
            mv.visitLdcInsn(references.getStabilityThreshold());
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setStabilityThreshold", "(D)V", false);
            mv.visitLdcInsn(references.getCheckUnstableComparisons() ? 1 : 0);
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, name, "setCheckUnstableComparisons", "(Z)V", false);
            mv.visitInsn(Opcodes.RETURN);
            mv.visitMaxs(0, 0);
        }
    };
    cr.accept(cv, ClassReader.EXPAND_FRAMES);
    return cw.toByteArray();
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

public void nativeCall(MethodVisitor mv, int access, String owner, String name, String desc) {
    boolean isStatic = (access & ACC_STATIC) > 0;
    String newDesc = replaceFloatMethodDescription(desc);
    MethodVisitor newMv = ccv.addProxyMethod(access & ~ACC_NATIVE, name, newDesc, null, null);
    int varIndex = 0;
    int opcode = INVOKESTATIC;
    if (!isStatic) {
        newMv.visitVarInsn(ALOAD, 0);// ww w.j  a  v  a2 s  .c om
        varIndex = 1;
        opcode = INVOKEVIRTUAL;
    }
    ConversionContext cc = new ConversionContext(opcode, owner, name, desc);
    Type args[] = Type.getArgumentTypes(newDesc);
    for (Type type : args) {
        newMv.visitVarInsn(getLoadOpcode(type), varIndex);
        varIndex += type.getSize();
    }
    convertArgumentsToReal(mv, cc);
    // stack >> [target] allParamsArr [target] allParamsArr
    maybeConvertTarget(mv, cc.opcode, cc.owner);
    // stack >> [target] allParamsArr [newTarget] allParamsArr
    explodeOnStack(mv, cc, true);
    // stack >> [target] allParamsArr [newTarget] nprm0 nprm1 nprm2...
    newMv.visitMethodInsn(opcode, owner, name, desc, false);
    // stack >> [target] allParamsArr [possibleResult]
    checkArraysAfterCall(newMv, cc.convertedArrays, desc);
    // stack >> [target] [possibleResult]
    convertReturnType(newMv, desc);
    // stack >> [target] [newPossibleResult]
    newMv.visitInsn(afterFloatReplacement(Type.getReturnType(desc)).getOpcode(IRETURN));
    // stack >> [target]       // left on the stack... not a problem!
    newMv.visitMaxs(0, 0);
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

public void proxyCall(MethodVisitor mv, ConversionContext cc, boolean tryUnproxied) {
    if (tryUnproxied && cc.opcode == INVOKEVIRTUAL || cc.opcode == INVOKEINTERFACE) { //|| opcode==INVOKEINTERFACE  false && 
        //proxyCallAndStupidVars(mv, opcode, owner, name, desc);
        proxyCallBetterWithVars(mv, cc);
        return;/*from   w w  w. ja  v a2s. com*/
    }
    // stack >> [target] nprm0 nprm1 nprm2...
    convertArgumentsToReal(mv, cc);
    // stack >> [target] allParamsArr [target] allParamsArr
    maybeConvertTarget(mv, cc.opcode, cc.owner);
    // stack >> [target] allParamsArr [newTarget] allParamsArr
    explodeOnStack(mv, cc, true);
    // stack >> [target] allParamsArr [newTarget] nprm0 nprm1 nprm2...
    mv.visitMethodInsn(cc.opcode, cc.owner, cc.name, cc.jDesc, (cc.opcode == INVOKEINTERFACE));
    // stack >> [target] allParamsArr [possibleResult]
    checkArraysAfterCall(mv, cc.convertedArrays, cc.jDesc);
    // stack >> [target] [possibleResult]
    int resultWidth = Type.getReturnType(cc.jDesc).getSize();
    if (hasTarget(cc.opcode)) {
        if (resultWidth == 0) {
            mv.visitInsn(POP);
        } else if (resultWidth == 1) {
            mv.visitInsn(SWAP);
            mv.visitInsn(POP);
        } else { // resultWidth==2) 
            mv.visitInsn(DUP2_X1);
            // stack >> possibleResult target possibleResult
            mv.visitInsn(POP2);
            // stack >> possibleResult target
            mv.visitInsn(POP);
            // stack >> possibleResult
        }
    }
    // stack >> [possibleResult]
    convertReturnType(mv, cc.jDesc);
    // stack >> [newPossibleResult]
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

public void proxyCallBetterWithVars(MethodVisitor mv, ConversionContext cc) {
    final String pm = "possibleMethod";
    final String pmDesc = "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/reflect/Method;";
    final String myInvoke = "myInvoke";
    final String myInvokeDesc = "(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;";
    // checkNotNullStack();
    // int paramArrayVar = mla.paramArrayVar();
    // int targetVar = mla.targetVar();
    // Label lEndTry = new Label(); 
    Label lBeginHandler = new Label(), lEndHandler = new Label();
    Type cojReturnType = Type.getReturnType(cc.cDesc);
    // stack >> target prm0 prm1 prm2...
    convertArgumentsToReal(mv, cc);//from   w ww .ja  v a 2 s  . c o  m
    // stack >> target allParamsArr target allParamsArr
    // {
    //            mv.visitVarInsn(ASTORE, paramArrayVar);
    //            // stack >> target allParamsArr target
    //            //--------- String targetType=stackTopClass();
    //            mv.visitVarInsn(ASTORE, targetVar);
    // }
    mv.visitInsn(POP);
    mv.visitInsn(POP);
    // stack >> target allParamsArr
    Object[] localsInFrame = aaAfter.locals.toArray();
    mv.visitInsn(SWAP);
    // stack >> allParamsArr target
    mv.visitInsn(DUP_X1);
    // stack >> target allParamsArr target
    mv.visitLdcInsn(cc.name);
    // stack >> target allParamsArr target methName
    mv.visitLdcInsn(cc.cDesc);
    // stack >> target allParamsArr target methName methDesc
    mv.visitMethodInsn(INVOKESTATIC, DN_NAME, pm, pmDesc, false);
    // stack >> target allParamsArr nullOrMeth
    mv.visitInsn(DUP);
    // stack >> target allParamsArr nullOrMeth nullOrMeth

    ArrayList<Object> scl = new ArrayList<Object>(aaAfter.stack);
    scl.remove(scl.size() - 1); // remove the last nullOrMeth
    Object[] stackContent = scl.toArray(); //target allParamsArr nullOrMeth

    mv.visitJumpInsn(IFNULL, lBeginHandler);
    aaAfter.visitFrame(F_NEW, localsInFrame.length, localsInFrame, stackContent.length, stackContent);
    // stack >> target allParamsArr meth
    mv.visitInsn(DUP_X2);
    // stack >> meth target allParamsArr meth
    mv.visitInsn(POP);
    // stack >> meth target allParamsArr
    mv.visitLdcInsn(cc.inArgs.length);
    // stack >> meth target allParamsArr n
    mv.visitInsn(AALOAD);
    // stack >> meth target asObjPrm
    mv.visitTypeInsn(CHECKCAST, "[" + OBJ_TYPE.getDescriptor());
    // stack >> meth target appropriatePrmArr 
    mv.visitMethodInsn(INVOKESTATIC, DN_NAME, myInvoke, myInvokeDesc, false);
    // stack >> [ResultOrNull]
    if (cc.hasReturn()) {
        if (cc.hasPrimitiveResultInCojacVersion()) {
            String jWrapperName = getJWrapper(cojReturnType).getInternalName();
            mv.visitTypeInsn(CHECKCAST, jWrapperName);
            mv.visitMethodInsn(INVOKEVIRTUAL, jWrapperName, getWrapperToPrimitiveMethod(cojReturnType),
                    "()" + cojReturnType.getDescriptor(), false);
        } else {
            mv.visitTypeInsn(CHECKCAST, cojReturnType.getInternalName());
        }
    } else {
        mv.visitInsn(POP); // discard the dummy null result
    }
    // stack >> [possibleResult]
    //;; mv.visitLabel(lEndTry);
    mv.visitJumpInsn(GOTO, lEndHandler); // and we're done !

    ;
    ;
    mv.visitLabel(lBeginHandler);
    // stack >> target allParamsArr null
    // CAUTION: we bypass 'mv' and directly talk to the AnalyzerAdapter!
    aaAfter.visitFrame(F_NEW, localsInFrame.length, localsInFrame, stackContent.length, stackContent);
    //checkNotNullStack();  //was during debugging - removed
    mv.visitInsn(POP); // we drop the null (no-method) slot
    maybeConvertTarget(mv, cc.opcode, cc.owner);
    // stack >> newTarget allParamsArr
    mv.visitInsn(DUP_X1);
    // stack >> allParamsArr newTarget allParamsArr
    explodeOnStack(mv, cc, true);
    // stack >> allParamsArr newTarget nprm0 nprm1 nprm2...
    mv.visitMethodInsn(cc.opcode, cc.owner, cc.name, cc.jDesc, (cc.opcode == INVOKEINTERFACE));
    // stack >> allParamsArr [possibleResult]
    checkArraysAfterCall(mv, cc.convertedArrays, cc.jDesc);
    // stack >> [possibleResult]
    convertReturnType(mv, cc.jDesc);
    // stack >> [newPossibleResult]
    ;
    ;
    mv.visitLabel(lEndHandler);
    scl.remove(scl.size() - 1); // remove 3 slots: target allParamsArr nullOrMeth
    scl.remove(scl.size() - 1);
    scl.remove(scl.size() - 1);
    stackContent = scl.toArray();
    stackContent = addReturnTypeTo(stackContent, cojReturnType);
    aaAfter.visitFrame(F_NEW, localsInFrame.length, localsInFrame, stackContent.length, stackContent);
}

From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java

License:Apache License

private void convertArgumentsToReal(MethodVisitor mv, ConversionContext cc) {
    String convertDesc = Type.getMethodDescriptor(OBJ_ARRAY_TYPE, cc.inArgs);
    createConvertMethod(convertDesc, cc);
    // stack >> [target] prm0 prm1 prm2...
    mv.visitMethodInsn(INVOKESTATIC, crtClassName, COJAC_TYPE_CONVERT_NAME, convertDesc, false);
    // stack >> [target] allParamsArr
    // We'll need a reference to converted arrays (for merging purposes)
    // and a copy of the target (trying first without proxy)...
    if (hasTarget(cc.opcode)) {
        mv.visitInsn(DUP2);
    } else {/*from w  w  w  .j a v a 2  s .co  m*/
        mv.visitInsn(DUP);
    }
    // stack >> [target] allParamsArr [target] allParamsArr
}