Refine search
boolean isStatic = targetMethod.getOpcode() == Opcodes.INVOKESTATIC; Type[] argumentTypes = Type.getArgumentTypes(targetMethod.desc); instructions.add(new LdcInsnNode(argumentTypes.length)); instructions.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Object")); int argWidth = type.getSize(); instructions.add(new InsnNode(Opcodes.DUP_X1)); // A B [] C [] instructions.add(new InsnNode(Opcodes.SWAP)); // A B [] [] C instructions.add(new LdcInsnNode(i)); // A B [] [] C 2 instructions.add(new InsnNode(Opcodes.SWAP)); // A B [] [] 2 C instructions.add(new InsnNode(Opcodes.AASTORE)); // A B [(C)] instructions.add(new LdcInsnNode(i)); // A B [] [] (C) 2 instructions.add(new InsnNode(Opcodes.SWAP)); // A B [] [] 2 (C) instructions.add(new InsnNode(Opcodes.AASTORE)); // A B [(C)] instructions.add(new LdcInsnNode(targetMethod.owner + "/" + targetMethod.name + targetMethod.desc)); // target method signature instructions.add(new LdcInsnNode(mutableClass.classType)); // signature instance [] class instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getType(RobolectricInternals.class).getInternalName(), "intercept", "(Ljava/lang/String;Ljava/lang/Object;[Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;", false));
private void mvc(Insn<MethodInsnNode> it, Consumer<Object> consumer) { log.debug("found mvc {}", it); it.prev() .filter(is(LdcInsnNode.class)) .findFirst() .map(LdcInsnNode.class::cast) .filter(ldc -> ldc.cst instanceof Type) .ifPresent(ldc -> { String arg0 = Type.getArgumentTypes(it.node.desc)[0].getClassName(); String prefix = ""; if (arg0.equals(String.class.getName())) { prefix = new Insn<>(it.method, ldc.getPrevious()) .prev() .filter(is(LdcInsnNode.class)) .findFirst() .map(LdcInsnNode.class::cast) .map(n -> n.cst.toString()) .orElse(""); } String mvcClass = ((Type) ldc.cst).getClassName(); mvcRoutes(prefix, (Class) loadType(loader, mvcClass), consumer::accept); }); }
public static InsnList getClassConstantReference(Type type, int majorVersion) { InsnList il = new InsnList(); if (majorVersion >= Opcodes.V1_5) { il.add(new LdcInsnNode(type)); } else { String fullyQualifiedName = type.getInternalName().replaceAll("/", "."); il.add(new LdcInsnNode(fullyQualifiedName)); il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "java/lang/Class", "forName", "(Ljava/lang/String;)Ljava/lang/Class;", false)); } return il; }
code.add(new FieldInsnNode( GETSTATIC, Type.getInternalName(Memory.class), "UNDEFINED", Type.getDescriptor(Memory.class) )); } else if (memory instanceof NullMemory) { code.add(new FieldInsnNode( GETSTATIC, Type.getInternalName(Memory.class), "NULL", Type.getDescriptor(Memory.class) )); } else if (memory instanceof FalseMemory) { return; } else if (memory instanceof ReferenceMemory) { code.add(new TypeInsnNode(NEW, Type.getInternalName(ReferenceMemory.class))); code.add(new InsnNode(DUP)); code.add(new MethodInsnNode(INVOKESPECIAL, Type.getInternalName(ReferenceMemory.class), Constants.INIT_METHOD, "()V", false)); } else if (memory instanceof ArrayMemory) { ArrayMemory array = (ArrayMemory) memory; switch (memory.type) { case INT: { code.add(new LdcInsnNode(memory.toLong())); type = Memory.Type.INT; code.add(new LdcInsnNode(memory.toDouble())); type = Memory.Type.DOUBLE; code.add(new LdcInsnNode(memory.toString())); type = Memory.Type.STRING;
/** * Insert a call to the reference equality check helper function * * @param opcode * @param position * @param list */ public void insertPushEquals(int opcode, JumpInsnNode position, InsnList list) { MethodInsnNode equalCheck = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "isEqual", Type.getMethodDescriptor(Type.INT_TYPE, new Type[] { Type.getType(Object.class), Type.getType(Object.class), Type.INT_TYPE }), false); list.insertBefore(position, new InsnNode(Opcodes.DUP2)); list.insertBefore(position, new LdcInsnNode(opcode)); list.insertBefore(position, equalCheck); //list.insertBefore(position, // new LdcInsnNode(getBranchID(currentMethodNode, position))); insertBranchIdPlaceholder(currentMethodNode, position); MethodInsnNode push = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "pushPredicate", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.INT_TYPE, Type.INT_TYPE }), false); list.insertBefore(position, push); }
public static InsnList toNumericalValue(String what) { Objects.requireNonNull(what); InsnList il = new InsnList(); il.add(new LdcInsnNode(what)); il.add(new MethodInsnNode( INVOKESTATIC, Type.getInternalName(Conversions.class), "toNumericalValue", Type.getMethodDescriptor( Type.getType(Number.class), Type.getType(Object.class), Type.getType(String.class)), false)); return il; }
FieldInsnNode fieldIns = null; for(int i = 0; i < instructions.size(); i++) ins = instructions.get(i); if(ins instanceof FieldInsnNode) if(opcode == Opcodes.GETFIELD || opcode == Opcodes.GETSTATIC ) final InsnList il = new InsnList(); Type fieldType = Type.getType(fieldIns.desc); if(fieldType.getSize() == 1) { instructions.insertBefore(fieldIns, new InsnNode(Opcodes.DUP)); il.add(new InsnNode(Opcodes.SWAP)); } else if(fieldType.getSize() == 2) { instructions.insertBefore(fieldIns, new InsnNode(Opcodes.DUP)); il.add(new InsnNode(Opcodes.ACONST_NULL)); il.add(new LdcInsnNode(this.captureId)); il.add(new LdcInsnNode(fieldIns.owner)); il.add(new LdcInsnNode(fieldIns.name)); il.add(new LdcInsnNode(fieldIns.desc)); il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, PackageInfo.getNameWithSlash(org.evosuite.testcarver.capture.FieldRegistry.class), "notifyReadAccess",
int foundcon = -1; for(int i=0; i<l.size(); i++) AbstractInsnNode n = l.get(i); +SUtil.firstToUpperCase(name), Type.getMethodDescriptor(Type.VOID_TYPE), null, null); init.add(new LdcInsnNode(Type.getType("L"+iclname+";"))); init.add(new LdcInsnNode(args.length)); init.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Class")); for(int i=0; i<args.length; i++) init.add(new InsnNode(Opcodes.DUP)); init.add(new LdcInsnNode(i)); init.add(new LdcInsnNode(args[i])); init.add(new InsnNode(Opcodes.AASTORE)); init.add( new LdcInsnNode(args.length)); init.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Object")); for(int i=0; i<args.length; i++) init.add(new InsnNode(Opcodes.DUP)); init.add(new LdcInsnNode(i)); init.add(new VarInsnNode(Opcodes.ALOAD, i+1)); // 0==this, 1==arg0, ... init.add(new InsnNode(Opcodes.AASTORE));
Type ret = Type.getReturnType(mn.desc); InsnList nl = new InsnList(); nl.add(new VarInsnNode(Opcodes.ALOAD, 0)); nl.add(new FieldInsnNode(Opcodes.GETFIELD, iclname, AGENT_FIELD_NAME, "Ljadex/bridge/IInternalAccess;")); nl.add(new VarInsnNode(Opcodes.ALOAD, 0)); nl.add(new FieldInsnNode(Opcodes.GETFIELD, iclname, GLOBALNAME_FIELD_NAME, "Ljava/lang/String;")); nl.add(new LdcInsnNode(belname)); if(ret.getClassName().equals("byte")) nl.add(new FieldInsnNode(Opcodes.GETSTATIC, "java/lang/Byte", "TYPE", "Ljava/lang/Class;")); nl.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/bdiv3/features/impl/BDIAgentFeature", "getAbstractBeliefValue", "(Ljadex/bridge/IInternalAccess;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;")); nl.add(new TypeInsnNode(Opcodes.CHECKCAST, "java/lang/Number")); nl.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, "java/lang/Number", "intValue", "()I")); nl.add(new InsnNode(Opcodes.I2B)); nl.add(new InsnNode(Opcodes.IRETURN)); else if(ret.getClassName().equals("short")) nl.add(new LdcInsnNode(ret)); nl.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/bdiv3/features/impl/BDIAgentFeature", "getAbstractBeliefValue", "(Ljadex/bridge/IInternalAccess;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;")); nl.add(new TypeInsnNode(Opcodes.CHECKCAST, ret.getInternalName()));
Type[] args = Type.getArgumentTypes(mn.desc); InsnList nl = new InsnList(); nl.add(new VarInsnNode(Opcodes.ALOAD, 0)); // loads the object nl.add(new FieldInsnNode(Opcodes.GETFIELD, iclname, AGENT_FIELD_NAME, Type.getDescriptor(IInternalAccess.class))); nl.add(new LdcInsnNode(belname)); nl.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/bdiv3/features/impl/BDIAgentFeature", "unobserveValue", nl.add(new InsnNode(Opcodes.ACONST_NULL)); nl.add(new InsnNode(Opcodes.ACONST_NULL)); // oldvalue ? nl.add(new InsnNode(Opcodes.ACONST_NULL)); // no index/key nl.add(new VarInsnNode(Opcodes.ALOAD, 0)); // loads the agent object nl.add(new FieldInsnNode(Opcodes.GETFIELD, iclname, AGENT_FIELD_NAME, Type.getDescriptor(IInternalAccess.class))); nl.add(new LdcInsnNode(belname)); nl.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/bdiv3/features/impl/BDIAgentFeature", "createChangeEvent",
LdcInsnNode lin = new LdcInsnNode(Type.getType("L" + typeNode.desc + ";")); mn.instructions.insertBefore(typeNode, lin); } else { LdcInsnNode lin = new LdcInsnNode(Type.getType(typeNode.desc + ";")); mn.instructions.insertBefore(typeNode, lin); LdcInsnNode lin = new LdcInsnNode(typeNode.desc.replace('/', '.')); mn.instructions.insertBefore(typeNode, lin); MethodInsnNode n = new MethodInsnNode( Opcodes.INVOKESTATIC, Type.getInternalName(Class.class), "forName", Type.getMethodDescriptor(Type.getType(Class.class), mn.instructions.insertBefore(typeNode, n); MethodInsnNode n = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(BooleanHelper.class), "instanceOf", Type.getMethodDescriptor(Type.INT_TYPE,
public static InsnList loadBoxedConstant(Object k, Class<?> castTo) { InsnList il = new InsnList(); if (k == null) { il.add(loadNull()); } else if (k instanceof Boolean) { il.add(BoxedPrimitivesMethods.loadBoxedBoolean((Boolean) k)); } else if (k instanceof Double || k instanceof Float) { il.add(ASMUtils.loadDouble(((Number) k).doubleValue())); il.add(BoxedPrimitivesMethods.box(Type.DOUBLE_TYPE, Type.getType(Double.class))); } else if (k instanceof Number) { il.add(ASMUtils.loadLong(((Number) k).longValue())); il.add(BoxedPrimitivesMethods.box(Type.LONG_TYPE, Type.getType(Long.class))); } else if (k instanceof String) { il.add(new LdcInsnNode(k)); } else { throw new UnsupportedOperationException("Illegal constant type: " + k.getClass()); } if (castTo != null) { Objects.requireNonNull(k); if (!castTo.isAssignableFrom(k.getClass())) { il.add(new TypeInsnNode(CHECKCAST, Type.getInternalName(castTo))); } } return il; }
private void addCaptureEnableStatement(final String className, final MethodNode mn, final InsnList il, final int returnValueVar) il.add(new LdcInsnNode(this.captureId)); il.add(new LdcInsnNode(className)); il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, PackageInfo.getNameWithSlash(CaptureUtil.class), "loadClass", il.add(new VarInsnNode(Opcodes.ALOAD, 0)); final Type returnType = Type.getReturnType(mn.desc); if(returnType.equals(Type.VOID_TYPE)) il.add(new FieldInsnNode(Opcodes.GETSTATIC, PackageInfo.getNameWithSlash(CaptureLog.class), "RETURN_TYPE_VOID", Type.getDescriptor(Object.class))); il.add(new VarInsnNode(Opcodes.ALOAD, returnValueVar)); il.add(new MethodInsnNode(Opcodes.INVOKESTATIC, PackageInfo.getNameWithSlash(org.evosuite.testcarver.capture.Capturer.class), "enable",
List<Mutation> mutations) { InsnList instructions = new InsnList(); instructions.add(mutation.getInfectionDistance()); instructions.add(new LdcInsnNode(mutation.getId())); MethodInsnNode touched = new MethodInsnNode(Opcodes.INVOKESTATIC, Type.getInternalName(ExecutionTracer.class), "passedMutation", Type.getMethodDescriptor(Type.VOID_TYPE, new Type[] { Type.DOUBLE_TYPE, Type.INT_TYPE }), false); instructions.add(touched); LabelNode nextLabel = new LabelNode(); LdcInsnNode mutationId = new LdcInsnNode(mutation.getId()); instructions.add(mutationId); FieldInsnNode activeId = new FieldInsnNode(Opcodes.GETSTATIC, Type.getInternalName(MutationObserver.class), "activeMutation", "I"); instructions.add(activeId); instructions.add(new JumpInsnNode(Opcodes.IF_ICMPNE, nextLabel));
if (insns.size() == 0) { continue; MethodInsnNode println = new MethodInsnNode(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); VarInsnNode var = new VarInsnNode(LSTORE, mn.maxLocals); mn.maxLocals += 2; insns.insert(var); insns.insert(currentTimeMillis()); VarInsnNode varEnd = new VarInsnNode(LSTORE, mn.maxLocals); list.add(new InsnNode(DUP)); list.add(new VarInsnNode(ALOAD, 0)); list.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;", false)); list.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;", list.add(new LdcInsnNode(" ")); list.add(new LdcInsnNode(mn.name)); list.add(new LdcInsnNode(" ")); list.add(new LdcInsnNode("cost ")); list.add(new InsnNode(LSUB));
private InsnList getMethodInstrumentation(BytecodeInstruction call, boolean staticContext, InsnList instrumentation, MethodNode mn) { String descriptor = call.getMethodCallDescriptor(); Type[] args = Type.getArgumentTypes(descriptor); int loc = getNextLocalNum(mn); Map<Integer, Integer> to = new HashMap<Integer, Integer>(); for (int i = args.length - 1; i >= 0; i--) { Type type = args[i]; instrumentation.add(new VarInsnNode(type.getOpcode(Opcodes.ISTORE), loc)); to.put(i, loc); loc++; } // instrumentation.add(new InsnNode(Opcodes.DUP));//callee addObjectInstrumentation(call, instrumentation, mn); addCallingObjectInstrumentation(staticContext, instrumentation); // field method calls get special treatment: // during instrumentation it is not clear whether a field method // call constitutes a definition or a use. So the instrumentation // will call a special function of the ExecutionTracer which will // redirect the call to either passedUse() or passedDefinition() // using the information available during runtime (the CCFGs) instrumentation.add(new LdcInsnNode(DefUsePool.getDefUseCounter())); instrumentation.add(new MethodInsnNode(Opcodes.INVOKESTATIC, PackageInfo.getNameWithSlash(ExecutionTracer.class), "passedFieldMethodCall", "(Ljava/lang/Object;Ljava/lang/Object;I)V")); for (int i = 0; i < args.length; i++) { Type type = args[i]; instrumentation.add(new VarInsnNode(type.getOpcode(Opcodes.ILOAD), to.get(i))); } return instrumentation; }
private void createVarFieldArray(RuleMethod method, InsnList instructions, AbstractInsnNode ret) { int count = method.getLocalVarVariables().size(); // stack: instructions.insertBefore(ret, new IntInsnNode(BIPUSH, count)); // stack: <length> instructions.insertBefore(ret, new TypeInsnNode(ANEWARRAY, VAR.getInternalName())); // stack: <array> for (int i = 0; i < count; i++) { LocalVariableNode var = method.getLocalVarVariables().get(i); // stack: <array> instructions.insertBefore(ret, new InsnNode(DUP)); // stack: <array> :: <array> instructions.insertBefore(ret, new IntInsnNode(BIPUSH, i)); // stack: <array> :: <array> :: <index> instructions.insertBefore(ret, new VarInsnNode(ALOAD, var.index)); // stack: <array> :: <array> :: <index> :: <var> instructions.insertBefore(ret, new InsnNode(DUP)); // stack: <array> :: <array> :: <index> :: <var> :: <var> instructions.insertBefore(ret, new LdcInsnNode(method.name + ':' + var.name)); // stack: <array> :: <array> :: <index> :: <var> :: <var> :: <varName> instructions.insertBefore(ret, new MethodInsnNode(INVOKEVIRTUAL, VAR.getInternalName(), "setName", "(Ljava/lang/String;)V", false)); // stack: <array> :: <array> :: <index> :: <var> instructions.insertBefore(ret, new InsnNode(AASTORE)); // stack: <array> } // stack: <array> }
MGoal mgoal = model.getCapability().getGoal(iclname.replaceAll("/", ".")); for(int i=0; i<ins.size(); i++) AbstractInsnNode n = ins.get(i); if(lab==null && n instanceof LabelNode) newins = new InsnList(); newins.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/commons/SReflect", "wrapValue", "(I)Ljava/lang/Object;")); newins = new InsnList(); newins.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/commons/SReflect", "wrapValue", "(J)Ljava/lang/Object;")); newins = new InsnList(); newins.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/commons/SReflect", "wrapValue", "(F)Ljava/lang/Object;")); newins.add(new VarInsnNode(Opcodes.ALOAD, 0)); newins.add(new LdcInsnNode(belname)); newins.add(new VarInsnNode(Opcodes.ALOAD, 0)); newins.add(new LdcInsnNode(paramname)); newins.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "jadex/bdiv3/features/impl/BDIAgentFeature", "writeArrayParameterField", "(Ljava/lang/Object;ILjava/lang/Object;Ljava/lang/Object;Ljava/lang/String;)V"));
public void process(ParserClassNode classNode, RuleMethod method) throws Exception { checkArgNotNull(classNode, "classNode"); checkArgNotNull(method, "method"); checkState(!method.isSuperMethod()); // super methods have flag moved to the overriding method InsnList instructions = method.instructions; AbstractInsnNode ret = instructions.getLast(); while (ret.getOpcode() != ARETURN) { ret = ret.getPrevious(); } LabelNode isNullLabel = new LabelNode(); // stack: <rule> instructions.insertBefore(ret, new InsnNode(DUP)); // stack: <rule> :: <rule> instructions.insertBefore(ret, new JumpInsnNode(IFNULL, isNullLabel)); // stack: <rule> instructions.insertBefore(ret, new LdcInsnNode(getLabelText(method))); // stack: <rule> :: <labelText> instructions.insertBefore(ret, new MethodInsnNode(INVOKEINTERFACE, Types.RULE.getInternalName(), "label", "(Ljava/lang/String;)" + Types.RULE_DESC, true)); // stack: <rule> instructions.insertBefore(ret, isNullLabel); // stack: <rule> }
private void createNewGroupClassInstance() { String internalName = group.getGroupClassType().getInternalName(); InstructionGraphNode root = group.getRoot(); insert(new TypeInsnNode(NEW, internalName)); insert(new InsnNode(DUP)); insert(new LdcInsnNode(method.name + (root.isActionRoot() ? "_Action" + ++actionNr : "_VarInit" + ++varInitNr))); insert(new MethodInsnNode(INVOKESPECIAL, internalName, "<init>", "(Ljava/lang/String;)V", false)); if (root.isActionRoot() && method.hasSkipActionsInPredicatesAnnotation()) { insert(new InsnNode(DUP)); insert(new MethodInsnNode(INVOKEVIRTUAL, internalName, "setSkipInPredicates", "()V", false)); } }