use of org.freud.analysed.classbytecode.method.instruction.Instruction in project freud by LMAX-Exchange.
the class AsmMethod method visitVarInsn.
public void visitVarInsn(final int opcodeUsed, final int var) {
final Instruction instruction = new VarInstruction(instructionList.size(), OPCODES_ARRAY[opcodeUsed], currentLineNumber, var);
updateCurrentState(instruction);
}
use of org.freud.analysed.classbytecode.method.instruction.Instruction in project freud by LMAX-Exchange.
the class AsmMethod method visitLdcInsn.
public void visitLdcInsn(final Object constant) {
final Instruction instruction;
if (constant instanceof Type) {
instruction = new ReferenceOperandInstruction(instructionList.size(), Opcode.LDC, currentLineNumber, constant.toString());
} else {
instruction = new ConstInstruction(instructionList.size(), Opcode.LDC, currentLineNumber, constant);
}
updateCurrentState(instruction);
}
use of org.freud.analysed.classbytecode.method.instruction.Instruction in project freud by LMAX-Exchange.
the class ClassByteCodeDsl method methodInvokedWithParams.
public static boolean methodInvokedWithParams(final ClassByteCodeMethod analysed, final Class expectedOwner, final String expectedMethodName, final Class... expectedParamTypes) {
final String expectedOwnerName = typeEncoding(expectedOwner);
final boolean[] found = new boolean[1];
found[0] = false;
analysed.findInstruction(new AbstractInstructionVisitor() {
@Override
public void methodInvocation(final Instruction instruction, final String owner, final String methodName, final String... args) {
if (!found[0] && expectedOwnerName.equals(owner) && expectedMethodName.equals(methodName)) {
Instruction prevInstruction = analysed.getInstruction(instruction.getInstructionIndex() - 1);
OperandStack operandStack = prevInstruction.getOperandStack();
found[0] = true;
for (int i = expectedParamTypes.length - 1; i >= 0; i--) {
final String expectedType = typeEncoding(expectedParamTypes[i]);
if (!expectedType.equals(operandStack.getOperandType())) {
found[0] = false;
break;
}
operandStack = operandStack.next();
}
}
}
});
return found[0];
}
use of org.freud.analysed.classbytecode.method.instruction.Instruction in project freud by LMAX-Exchange.
the class ClassByteCodeDsl method containsInstructions.
public static boolean containsInstructions(final ClassByteCodeMethod analysed, final Opcode... opcodes) {
final Instruction[] found = new Instruction[1];
analysed.findInstruction(new AbstractInstructionVisitor() {
@Override
public void noArgInstruction(final Instruction instruction) {
for (int i = 0; i < opcodes.length; i++) {
Opcode opcode = opcodes[i];
if (instruction.getOpcode() == opcode) {
found[0] = instruction;
break;
}
}
}
});
return found[0] != null;
}
use of org.freud.analysed.classbytecode.method.instruction.Instruction in project freud by LMAX-Exchange.
the class ClassByteCodeMethodMatchers method hasMethodInvocation.
public static FreudExtendedMatcher<ClassByteCodeMethod> hasMethodInvocation(final Class expectedOwner, final String expectedMethodName, final Class... expectedParamsDeclared) {
return new FreudExtendedMatcher<ClassByteCodeMethod>() {
private String expectedOwnerName;
private String[] expectedParamNames;
{
expectedOwnerName = typeEncoding(expectedOwner);
expectedParamNames = (expectedParamsDeclared.length == 0) ? EMPTY_ARGS : new String[expectedParamsDeclared.length];
for (int i = 0, size = expectedParamsDeclared.length; i < size; i++) {
expectedParamNames[i] = typeEncoding(expectedParamsDeclared[i]);
}
}
@Override
protected boolean matchesSafely(final ClassByteCodeMethod item) {
final boolean[] found = new boolean[] { false };
found[0] = false;
item.findInstruction(new AbstractInstructionVisitor() {
@Override
public void methodInvocation(final Instruction instruction, final String owner, final String methodName, final String... args) {
if (!found[0] && expectedOwnerName.equals(owner) && expectedMethodName.equals(methodName) && Arrays.equals(expectedParamNames, args)) {
found[0] = true;
}
}
});
return found[0];
}
@Override
public void describeTo(final Description description) {
description.appendText("hasMethodInvocation(" + expectedOwner.getName() + ", " + expectedMethodName + ", " + Arrays.toString(expectedParamNames) + ")");
}
};
}
Aggregations