Bug #20195
closed3.3.0 YJIT mishandles ruby2_keywords splat into methods taking a rest parameter
Description
Check with:
ruby2_keywords def foo(*args) = args
def bar(*args, **kw) = [args, kw]
def pass_bar(*args) = bar(*args)
def body
args = foo(a: 1)
pass_bar(*args)
end
p body
$ ruby ../test.rb
[[{:a=>1}], {}]
$ ruby --yjit-call-threshold=1 ../test.rb
[[], {:a=>1}]
Updated by alanwu (Alan Wu) 7 months ago
- Subject changed from 3.3.0 YJIT mishandles splat into methods taking a rest parameter to 3.3.0 YJIT mishandles ruby2_keywords splat into methods taking a rest parameter
Updated by jeremyevans0 (Jeremy Evans) 7 months ago
- Status changed from Open to Closed
Updated by alanwu (Alan Wu) 7 months ago
- Description updated (diff)
- Status changed from Closed to Open
Updated by alanwu (Alan Wu) 7 months ago
- Status changed from Open to Closed
Applied in changeset git|ac1e9e443a0d6a4d4c0801c26d1d8bd33d9eb431.
YJIT: Fix ruby2_keywords splat+rest and drop bogus checks
YJIT didn't guard for ruby2_keywords hash in case of splat calls that
land in methods with a rest parameter, creating incorrect results.
The compile-time checks didn't correspond to any actual effects of
ruby2_keywords, so it was masking this bug and YJIT was needlessly
refusing to compile some code. About 16% of fallback reasons in
lobsters
was due to the ISeq check.
We already handle the tagging part with
exit_if_supplying_kw_and_has_no_kw() and should now have a dynamic guard
for all splat cases.
Note for backporting: You also need 7f51959ff1.
[Bug #20195]
Updated by k0kubun (Takashi Kokubun) 3 months ago
ยท Edited
- Backport changed from 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: REQUIRED to 3.0: DONTNEED, 3.1: DONTNEED, 3.2: DONTNEED, 3.3: DONE
ruby_3_3 6383d0afac6aa02b3e72d08128cc1d8327f149fa merged revision(s) 015b0e2e1d312e2be60551587389c8da5c585e6f,ac1e9e443a0d6a4d4c0801c26d1d8bd33d9eb431.