List of usage examples for org.objectweb.asm MethodVisitor visitInsn
public void visitInsn(final int opcode)
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 }