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.