@SuppressWarnings("unchecked") static java.lang.reflect.Type localVariable(final ClassLoader loader, final MethodNode m, final VarInsnNode varInsn) { if (varInsn.getOpcode() == Opcodes.ALOAD) { List<LocalVariableNode> vars = m.localVariables; LocalVariableNode var = vars.stream() .filter(v -> v.index == varInsn.var) .findFirst() .orElse(null); if (var != null) { String signature = "()" + Optional.ofNullable(var.signature).orElse(var.desc); return TypeDescriptorParser.parse(loader, signature); } } return Object.class; }
private void convertVarInsn(VarInsnNode insn) { int op = insn.getOpcode(); if (op >= ILOAD && op <= ALOAD) { convertVarLoadInsn(insn); } else if (op >= ISTORE && op <= ASTORE) { convertVarStoreInsn(insn); } else if (op == RET) { /* we handle it, even thought it should be removed */ if (!units.containsKey(insn)) { setUnit(insn, Jimple.v().newRetStmt(getLocal(insn.var))); } } else { throw new AssertionError("Unknown var op: " + op); } }
private void convertVarLoadInsn(VarInsnNode insn) { int op = insn.getOpcode(); boolean dword = op == LLOAD || op == DLOAD; StackFrame frame = getFrame(insn); Operand[] out = frame.out(); Operand opr; if (out == null) { opr = new Operand(insn, getLocal(insn.var)); frame.out(opr); } else { opr = out[0]; } if (dword) { pushDual(opr); } else { push(opr); } }
private void convertVarStoreInsn(VarInsnNode insn) { int op = insn.getOpcode(); boolean dword = op == LSTORE || op == DSTORE; StackFrame frame = getFrame(insn); Operand opr = dword ? popDual() : pop(); Local local = getLocal(insn.var); if (!units.containsKey(insn)) { DefinitionStmt as = Jimple.v().newAssignStmt(local, opr.stackOrValue()); opr.addBox(as.getRightOpBox()); frame.boxes(as.getRightOpBox()); frame.in(opr); setUnit(insn, as); } else { frame.mergeIn(opr); } assignReadOps(local); }
/** * We try to detect such a last 2 instructions and extract the enum signature. */ private String tryToFindSignatureOfConditionEnum() { // mv.visitMethodInsn(INVOKESTATIC, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter", "$SWITCH_TABLE$net$sourceforge$cobertura$instrument$FindTouchPointsMethodAdapter$Abc", "()[I"); // mv.visitVarInsn(ALOAD, 1); // mv.visitMethodInsn(INVOKEVIRTUAL, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter$Abc", "ordinal", "()I"); // mv.visitInsn(IALOAD); if (backlog == null || backlog.size() < 4) return null; int last = backlog.size() - 1; if ((backlog.get(last) instanceof InsnNode) && (backlog.get(last - 1) instanceof MethodInsnNode) && (backlog.get(last - 2) instanceof VarInsnNode)) { VarInsnNode i2 = (VarInsnNode) backlog.get(last - 2); MethodInsnNode i3 = (MethodInsnNode) backlog.get(last - 1); InsnNode i4 = (InsnNode) backlog.get(last); if ((i2.getOpcode() == Opcodes.ALOAD) && (i3.getOpcode() == Opcodes.INVOKEVIRTUAL && i3.name .equals("ordinal")) && (i4.getOpcode() == Opcodes.IALOAD)) { return i3.owner; } } return null; }
private AbstractInsnNode dup(VarInsnNode load) { switch (load.getOpcode()) { case Opcodes.DLOAD: case Opcodes.LLOAD: return new InsnNode(Opcodes.DUP2); default: return new InsnNode(Opcodes.DUP); } } }
/** * We try to detect such a last 2 instructions and extract the enum signature. */ private String tryToFindSignatureOfConditionEnum() { // mv.visitMethodInsn(INVOKESTATIC, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter", "$SWITCH_TABLE$net$sourceforge$cobertura$instrument$FindTouchPointsMethodAdapter$Abc", "()[I"); // mv.visitVarInsn(ALOAD, 1); // mv.visitMethodInsn(INVOKEVIRTUAL, "net/sourceforge/cobertura/instrument/FindTouchPointsMethodAdapter$Abc", "ordinal", "()I"); // mv.visitInsn(IALOAD); if (backlog == null || backlog.size() < 4) return null; int last = backlog.size() - 1; if ((backlog.get(last) instanceof InsnNode) && (backlog.get(last - 1) instanceof MethodInsnNode) && (backlog.get(last - 2) instanceof VarInsnNode)) { VarInsnNode i2 = (VarInsnNode) backlog.get(last - 2); MethodInsnNode i3 = (MethodInsnNode) backlog.get(last - 1); InsnNode i4 = (InsnNode) backlog.get(last); if ((i2.getOpcode() == Opcodes.ALOAD) && (i3.getOpcode() == Opcodes.INVOKEVIRTUAL && i3.name .equals("ordinal")) && (i4.getOpcode() == Opcodes.IALOAD)) { return i3.owner; } } return null; }
VarInsnNode varNode = (VarInsnNode) node; int varIndex = varNode.var; switch (varNode.getOpcode()) { case Opcodes.ALOAD: case Opcodes.ILOAD:
@Override protected AbstractInsnNode transformVarInsnNode(MethodNode mn, VarInsnNode varNode) { if (varNode.getOpcode() == Opcodes.ISTORE && this.booleanTestabilityTransformation.isBooleanVariable(varNode.var, mn)) { return varNode; if (insn.getASMNode().getOpcode() != varNode.getOpcode()) { BooleanTestabilityTransformation.logger.info("Found wrong bytecode instruction at this index!"); insn = BytecodeInstructionPool.getInstance(this.booleanTestabilityTransformation.classLoader).getInstruction(this.booleanTestabilityTransformation.className,
} else if (ai instanceof VarInsnNode) { VarInsnNode n = ((VarInsnNode)ai); writer.write("\n\t\t\t\tlocalVariable(" + n.getOpcode() + ", " + n.var + ")"); } else if (ai instanceof LdcInsnNode) { LdcInsnNode n = ((LdcInsnNode)ai);
distance.add(new VarInsnNode(node.getOpcode(), node.var)); if (type.getDescriptor().startsWith("L") || type.getDescriptor().startsWith("["))
poppedThis = false; Type type = ByteCodeUtils.getTypeForStoreOpcode(var.getOpcode()); if (type != null && var.var >= firstLocal) {
mutation.add(new VarInsnNode(node.getOpcode(), node.var)); mutation.add(new InsnNode(getNegation(node.getOpcode()))); mutationCode.add(mutation); descriptions.add("Negation"); if (node.getOpcode() == Opcodes.ILOAD) { if (frame.getStack(frame.getStackSize() - 1) != BooleanValueInterpreter.BOOLEAN_VALUE) { mutation = new InsnList(); mutation.add(new IincInsnNode(node.var, 1)); mutation.add(new VarInsnNode(node.getOpcode(), node.var)); if (!mn.localVariables.isEmpty()) descriptions.add("IINC 1 " + getName(mn, node)); mutation.add(new VarInsnNode(node.getOpcode(), node.var)); if (!mn.localVariables.isEmpty()) descriptions.add("IINC -1 " + getName(mn, node));
poppedThis = false; Type type = ByteCodeUtils.getTypeForStoreOpcode(var.getOpcode()); if (type != null && var.var >= firstLocal) {
copy.add(new VarInsnNode(vn.getOpcode(), vn.var)); } else if (node instanceof FieldInsnNode) { FieldInsnNode fn = (FieldInsnNode) node;
index = foundVar; VarInsnNode cloned = new VarInsnNode(donorVarInsn.getOpcode(), index); result.instructions.add(cloned);
if (varInsnNode.getOpcode() == Opcodes.ALOAD && varInsnNode.var != 5 && varInsnNode.var != 29)