Skip to content

Conversation

@retronym
Copy link
Owner

@retronym retronym commented Jun 11, 2018

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.

@retronym retronym force-pushed the unfork/copy-instruction branch 2 times, most recently from fd115de to ca5eed6 Compare June 11, 2018 01:28
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant