Skip to content
  • Jason Zaugg's avatar
    Call interpreter.copyOperation consistently · f77c2bc1
    Jason Zaugg authored
    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.
    f77c2bc1