Skip to content

Clear callInfo in Enumerable Java-based blocks#8389

Merged
headius merged 4 commits intojruby:masterfrom
headius:clear_callinfo_in_enumerable
Oct 28, 2024
Merged

Clear callInfo in Enumerable Java-based blocks#8389
headius merged 4 commits intojruby:masterfrom
headius:clear_callinfo_in_enumerable

Conversation

@headius
Copy link
Member

@headius headius commented Oct 28, 2024

Enumerable#to_a does not take keywords but also was not handling any incoming callInfo bits. As a result an incoming CALL_KEYWORD_EMPTY bit can get stuck and propagte through to the next call. This does not process any kwargs because it is effectively a block with signature like |a, *b| but whether it should do more than clearing callInfo is unknown.

Fixes #8382

Enumerable#to_a does not take keywords but also was not handling
any incoming callInfo bits. As a result an incoming
CALL_KEYWORD_EMPTY bit can get stuck and propagte through to the
next call. This does not process any kwargs because it is
effectively a block with signature like |a, *b| but whether it
should do more than clearing callInfo is unknown.

Fixes jruby#8382
@headius headius added this to the JRuby 9.4.9.0 milestone Oct 28, 2024
See jruby#8382 and the same fix for Enumerable#to_a.
@headius headius changed the title Clear callInfo in this block body Clear callInfo in Enumerable Java-based blocks Oct 28, 2024
For jruby#8382 we added calls to resetCallInfo in Enumerable
Java-based blocks for `to_a`, `to_h`, and `tally` because they
could leave the CALL_KEYWORD_EMPTY bit stuck for a subsequent call
and break kwarg processing. The Java block for Enumerable `chunk`
also fails to clear callInfo, but since it immediately invokes
`each` on self it is difficult or impossible to reproduce. each
can't take kwargs without breaking, and clears callInfo when done
so there's no way to observe the stuck bit. However, I believe we
should still resetCallInfo here for sanitary reasons, and some
weird Enumerable consumer in the future may find a way to hit this
improbable case.
@headius headius force-pushed the clear_callinfo_in_enumerable branch from e930581 to 44290af Compare October 28, 2024 16:15
@headius headius merged commit 75b6b87 into jruby:master Oct 28, 2024
@headius headius deleted the clear_callinfo_in_enumerable branch October 28, 2024 16:38
headius added a commit to headius/jruby that referenced this pull request Jan 8, 2025
When passing kwargs from a ruby2_keywords method to a core "real
keywords" method, we lose the keywordiness of the incoming hash
and raise an argument error for the arity mismatch. By using the
same logic as IR here, we properly handle the incoming r2k hash.

This same patch could be applied generally to all core methods that
accept keywords, but given the rarity of r2k to core "real
keywords" methods we have chosen to only do targeted fixes. This
reduces the potential impact (versus a new, more general solution)
and the required work (9.4.10 is eagerly awaited). We will explore
more reliable, general improvements to core method kwarg handling
in JRuby 10.

Fixes jruby#8389.
headius added a commit to headius/jruby that referenced this pull request Jan 8, 2025
When passing kwargs from a ruby2_keywords method to a core "real
keywords" method, we lose the keywordiness of the incoming hash
and raise an argument error for the arity mismatch. By using the
same logic as IR here, we properly handle the incoming r2k hash.

This same patch could be applied generally to all core methods that
accept keywords, but given the rarity of r2k to core "real
keywords" methods we have chosen to only do targeted fixes. This
reduces the potential impact (versus a new, more general solution)
and the required work (9.4.10 is eagerly awaited). We will explore
more reliable, general improvements to core method kwarg handling
in JRuby 10.

Fixes jruby#8389.
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.

Incorrect ArgumentError: wrong number of arguments

1 participant