diff options
author | Alan Wu <XrXr@users.noreply.github.com> | 2024-01-29 12:21:17 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-29 12:21:17 -0500 |
commit | b0711b1cf152afad0a480ee2f9bedd142a0d24ac (patch) | |
tree | 68b67cf497e01fd59944900338131b7d0b459883 /parser_bits.h | |
parent | 9a5a11f3d0e5d9b595d51aafe8fdadfe384568ad (diff) | |
download | ruby-b0711b1cf152afad0a480ee2f9bedd142a0d24ac.tar.gz |
YJIT: Fix tailcall and JIT entry eating up FINISH frames (#9729)
Suppose YJIT runs a rb_vm_opt_send_without_block()
fallback and the control frame stack looks like:
```
will_tailcall_bar [FINISH]
caller_that_used_fallback
```
will_tailcall_bar() runs in the interpreter and sets up a tailcall.
Right before JIT_EXEC() in the `send` instruction, the stack will look like:
```
bar [FINISH]
caller_that_used_fallback
```
Previously, JIT_EXEC() ran bar() in JIT code, which caused the `FINISH`
flag to return to the interpreter instead of to the JIT code running
caller_that_used_fallback(), causing code to run twice and probably
crash. Recent flaky failures on CI about "each stub expects a particular
iseq" are probably due to leaving methods twice in
`test_optimizations.rb`.
Only run JIT code from the interpreter if a new frame is pushed.
Diffstat (limited to 'parser_bits.h')
0 files changed, 0 insertions, 0 deletions