List of usage examples for org.objectweb.asm MethodVisitor visitLdcInsn
public void visitLdcInsn(final Object value)
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 ww . j a va2 s . co 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.LongRootProbe.java
License:Open Source License
@Override public void accept(final MethodVisitor mv) { if (born != 0) { mv.visitLdcInsn(born); mv.visitVarInsn(Opcodes.LSTORE, vAlive); }//from ww w.jav a2 s. c o m if (sleepy != 0) { mv.visitLdcInsn(~sleepy); mv.visitVarInsn(Opcodes.LSTORE, vSleepy); } }
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 w w .j ava 2s. c o 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.//from w w w . ja v a 2 s . co m * 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.DirectInstrumenter.java
License:Apache License
@Override public void instrument(MethodVisitor mv, int opCode) { mv.visitLdcInsn(reaction.value()); mv.visitLdcInsn(logFileName);/*from w w w . j a v a 2 s . c o m*/ Arg arg = Arg.fromOpCode(opCode); if (arg != null) { stats.incrementCounterValue(opCode);// arg invocations.get(opCode).invokeStatic(mv); } }
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);/* w ww . j av a2 s . co 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 static void explodeOnStack(MethodVisitor mv, ConversionContext cc, boolean wantTheConversion) { Type[] args = wantTheConversion ? cc.outArgs : cc.inArgs; // stack >> ... allParamsArr for (int i = 0; i < args.length; i++) { // stack >> ... allParamsArr Type oa = args[i];// ww w . j a v a 2 s . co m int oaSort = oa.getSort(); mv.visitInsn(DUP); mv.visitLdcInsn(i); mv.visitInsn(AALOAD); boolean keepBothVersions = (oa.getSort() == Type.ARRAY); if (keepBothVersions) { mv.visitTypeInsn(CHECKCAST, "[" + OBJ_TYPE.getDescriptor()); mv.visitLdcInsn(wantTheConversion ? 1 : 0); mv.visitInsn(AALOAD); } if (oaSort == Type.ARRAY || oaSort == Type.OBJECT) { // else: primitive type mv.visitTypeInsn(CHECKCAST, oa.getInternalName()); } else { String jWrapperName = getJWrapper(oa).getInternalName(); mv.visitTypeInsn(CHECKCAST, jWrapperName); mv.visitMethodInsn(INVOKEVIRTUAL, jWrapperName, getWrapperToPrimitiveMethod(oa), "()" + oa.getDescriptor(), false); } if (oa.getSize() == 2) { // Object DD Swap when double or long mv.visitInsn(DUP2_X1); // DD Object DD mv.visitInsn(POP2); // DD Object } else { mv.visitInsn(SWAP); } // stack >> ... nprmI allParamsArr } mv.visitInsn(POP); // stack >> ... nprm0 nprm1 nprm2... }
From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java
License:Apache License
private void createConvertMethod(String convertDesc, ConversionContext cc) { if (ccv.isProxyMethod(COJAC_TYPE_CONVERT_NAME, convertDesc)) return; // the method already exists MethodVisitor newMv = ccv.addProxyMethod(ACC_STATIC, COJAC_TYPE_CONVERT_NAME, convertDesc, null, null); int varIndex = 0; newMv.visitLdcInsn(cc.outArgs.length + 1); // additional cell for the AllAsObjects array newMv.visitTypeInsn(ANEWARRAY, OBJ_TYPE.getInternalName()); // stack >> prmsArr newMv.visitInsn(DUP);/* w ww .ja va 2 s . co m*/ newMv.visitLdcInsn(cc.outArgs.length); newMv.visitInsn(DUP); newMv.visitTypeInsn(ANEWARRAY, OBJ_TYPE.getInternalName()); // stack >> prmsArr prmsArr n asObjArr newMv.visitInsn(AASTORE); // stack >> prmsArr for (int i = 0; i < cc.outArgs.length; i++) { Type ia = cc.inArgs[i]; newMv.visitInsn(DUP); newMv.visitInsn(DUP); newMv.visitLdcInsn(cc.outArgs.length); // stack >> prmsArr prmsArr prmsArr n newMv.visitInsn(AALOAD); newMv.visitTypeInsn(CHECKCAST, "[" + OBJ_TYPE.getDescriptor()); // stack >> prmsArr prmsArr asObjArr newMv.visitLdcInsn(i); // stack >> prmsArr prmsArr asObjArr i newMv.visitVarInsn(getLoadOpcode(ia), varIndex); convertPrimitiveToObject(newMv, cc.inArgs[i]); // stack >> prmsArr prmsArr asObjArr i pi newMv.visitInsn(AASTORE); // stack >> prmsArr prmsArr newMv.visitLdcInsn(i); // stack >> prmsArr prmsArr i newMv.visitVarInsn(getLoadOpcode(ia), varIndex); varIndex += cc.inArgs[i].getSize(); // stack >> prmsArr prmsArr i pi boolean keepBothVersions = (ia.getSort() == Type.ARRAY); if (keepBothVersions) { // keep the old reference (the Cojac one) newMv.visitLdcInsn(2); newMv.visitTypeInsn(ANEWARRAY, OBJ_TYPE.getInternalName()); // stack >> prmsArr prmsArr i pi piArr newMv.visitInsn(DUP_X1); // stack >> prmsArr prmsArr i piArr pi piArr newMv.visitInsn(SWAP); // stack >> prmsArr prmsArr i piArr piArr pi newMv.visitInsn(DUP_X1); newMv.visitLdcInsn(0); newMv.visitInsn(SWAP); // stack >> prmsArr prmsArr i piArr pi piArr pi 0 newMv.visitInsn(AASTORE); // stack >> prmsArr prmsArr i piArr } // stack >> prmsArr prmsArr i pi if (cc.needsConversion(i)) { convertCojacToRealType(cc.asOriginalJavaType(i), newMv); } else if (cc.shouldObjParamBeConverted && (ia.equals(OBJ_TYPE) || ia.equals(OBJ_ARRAY_TYPE))) { convertObjectToReal(newMv, ia); } /* This is where we could decide to convert back to JavaWrapper * when the argument is declared as Object * We don't do that to keep "enriched numbers" in collections * but sometimes we would like to convert, eg printf, format... */ convertPrimitiveToObject(newMv, cc.outArgs[i]); // stack >> prmsArr prmsArr i pi if (keepBothVersions) { // keep the new reference (the java one) newMv.visitInsn(SWAP); newMv.visitInsn(DUP_X1); newMv.visitInsn(SWAP); newMv.visitLdcInsn(1); newMv.visitInsn(SWAP); newMv.visitInsn(AASTORE); } // stack >> prmsArr prmsArr i pi newMv.visitInsn(AASTORE); // stack >> prmsArr } newMv.visitInsn(ARETURN); newMv.visitMaxs(0, 0); }
From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java
License:Apache License
private static void checkArraysAfterCall(MethodVisitor mv, Map<Integer, Type> convertedArrays, String desc) { // stack >> allParamsArr [possibleResult] Type returnType = Type.getReturnType(desc); int returnTypeSize = returnType.getSize(); if (returnTypeSize == 1) { mv.visitInsn(SWAP);//from ww w .j av a 2s . c om } else if (returnTypeSize == 2) { // mv.visitInsn(NOP); just a marker as a debugging helper mv.visitInsn(DUP2_X1); // D D Object D D mv.visitInsn(POP2); // D D Object } // stack >> [possibleResult] allParamsArr for (int pos : convertedArrays.keySet()) { // Type type = convertedArrays.get(pos); mv.visitInsn(DUP); // stack >> [possibleResult] allParamsArr allParamsArr mv.visitLdcInsn(pos); // stack >> [possibleResult] allParamsArr allParamsArr i mv.visitInsn(AALOAD); // stack >> [possibleResult] allParamsArr allParamsArr[i] mv.visitTypeInsn(CHECKCAST, "[" + OBJ_TYPE.getDescriptor()); // stack >> [possibleResult] allParamsArr allParamsArr[i] (of type Object[]) mv.visitInsn(DUP); // stack >> [possibleResult] allParamsArr allParamsArr[i] allParamsArr[i] mv.visitLdcInsn(0); // stack >> [possibleResult] allParamsArr allParamsArr[i] allParamsArr[i] 0 mv.visitInsn(AALOAD); // stack >> [possibleResult] allParamsArr allParamsArr[i] allParamsArr[i][0] mv.visitInsn(SWAP); // stack >> [possibleResult] allParamsArr allParamsArr[i][0] allParamsArr[i] mv.visitLdcInsn(1); // stack >> [possibleResult] allParamsArr allParamsArr[i][0] allParamsArr[i] 1 mv.visitInsn(AALOAD); // stack >> [possibleResult] allParamsArr allParamsArr[i][0] allParamsArr[i][1] // mergeOriginalArrayIntoCojac mv.visitMethodInsn(INVOKESTATIC, DN_NAME, "mergeOriginalArrayIntoCojac", "(" + OBJ_DESC + OBJ_DESC + ")V", false); // stack >> [possibleResult] allParamsArr } // stack >> [possibleResult] allParamsArr mv.visitInsn(POP); // stack >> [possibleResult] }
From source file:ch.eiafr.cojac.instrumenters.FloatProxyMethod.java
License:Apache License
public static void convertRealToCojacType(Type realType, MethodVisitor mv) { // WRAPPER SPEC: FW.fromFloat(float) -> FW, FW.fromRealFloatWrapper(Float) -> FW // WRAPPER SPEC: DW.fromDouble(double) -> DW, DW.fromRealDoubleWrapper(Double) -> DW if (realType.equals(Type.FLOAT_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "fromFloat", "(F)" + COJAC_FLOAT_WRAPPER_TYPE_DESCR, false); } else if (realType.equals(JWRAPPER_FLOAT_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, COJAC_FLOAT_WRAPPER_INTERNAL_NAME, "fromRealFloatWrapper", "(" + JWRAPPER_FLOAT_TYPE.getDescriptor() + ")" + COJAC_FLOAT_WRAPPER_TYPE_DESCR, false); } else if (realType.equals(Type.DOUBLE_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "fromDouble", "(D)" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR, false); } else if (realType.equals(JWRAPPER_DOUBLE_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, COJAC_DOUBLE_WRAPPER_INTERNAL_NAME, "fromRealDoubleWrapper", "(" + JWRAPPER_DOUBLE_TYPE.getDescriptor() + ")" + COJAC_DOUBLE_WRAPPER_TYPE_DESCR, false); } else if (isPrimitiveFloatOrDoubleArray(realType)) { mv.visitTypeInsn(CHECKCAST, OBJ_TYPE.getInternalName()); mv.visitLdcInsn(realType.getDimensions()); if (realType.getElementType().equals(Type.FLOAT_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, FN_NAME, "convertPrimitiveArrayToCojac", "(" + OBJ_DESC + "I)" + OBJ_DESC, false); } else if (realType.getElementType().equals(Type.DOUBLE_TYPE)) { mv.visitMethodInsn(INVOKESTATIC, DN_NAME, "convertPrimitiveArrayToCojac", "(" + OBJ_DESC + "I)" + OBJ_DESC, false); }/* w w w . j a v a 2 s. c om*/ mv.visitTypeInsn(CHECKCAST, afterFloatReplacement(realType).getInternalName()); } }