Skip to content

Call interpreter.copyOperation consistently

Jason Zaugg requested to merge retronymm/asm:unfork/copy-instruction into master

Before this change, Frame.execute did not invoke the interpreter's copyOperation method for all values that are pushed on the frame's when executing some copying instructions.

For example, in the case of SWAP, copyOperation is invoked:

value2 = pop();
value1 = pop();
push(interpreter.copyOperation(insn, value2));
push(interpreter.copyOperation(insn, value1));

For DUP on the other hand, the original value is pushed onto the stack without notifying the interpreter:

value1 = pop();
push(value1);
push(interpreter.copyOperation(insn, value1));

This leads to a problem for the SourceInterpreter, which collects for every value a set of potential producer instructions. Given the bytecode sequence

NEW java/lang/Object
DUP
INVOKESPECIAL java/lang/Object.<init> ()V

In the frame of the INVOKESPECIAL instruction, the value on the stack lists as its producer the NEW operation instead of the DUP, which not expected.

Merge request reports