Add specs for Enumerable value packing rule (0->nil, 1->value, N->Array)#1363
Merged
Conversation
The rb_enum_values_pack rule in enum.c packs yielded source values when they flow through any Enumerable collection method or Lazy stage: 0 args -> nil, 1 arg -> the value, N args -> Array. Pin this explicitly via a shared describe used by both Enumerable#take and Enumerator::Lazy#take.
1e86572 to
5c4352c
Compare
eregon
approved these changes
May 27, 2026
This was referenced May 28, 2026
sampokuokkanen
added a commit
to sampokuokkanen/truffleruby
that referenced
this pull request
May 28, 2026
Apply CRuby's rb_enum_values_pack rule at the Lazy#each consumer boundary (0 args -> nil, 1 arg -> value, N args -> Array) via Primitive.single_block_arg. Chained stages bypass via a private iterate_chain helper that routes through a pre-override _enumerable_each alias so user blocks still see raw args, matching CRuby's LAZY_MEMO_PACKED unpacking in enumerator.c. Specced via ruby/spec#1363.
sampokuokkanen
added a commit
to sampokuokkanen/truffleruby
that referenced
this pull request
May 28, 2026
Apply CRuby's rb_enum_values_pack rule at the consumer boundary (0 args -> nil, 1 arg -> value, N args -> Array) via Primitive.single_block_arg. The override lives on a prepended ConsumerPacking module so Lazy.public_instance_methods(false) still matches MRI, which defines no Lazy#each. Chained stages bypass via a private iterate_chain helper that routes through a pre-override _enumerable_each alias, so stage user blocks still see raw args, matching CRuby's LAZY_MEMO_PACKED unpacking in enumerator.c. Specced via ruby/spec#1363.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The rb_enum_values_pack rule in enum.c packs yielded source values when they flow through any Enumerable collection method or Lazy stage: 0 args -> nil, 1 arg -> the value, N args -> Array.
Pin this explicitly via a shared describe used by both Enumerable#take and Enumerator::Lazy#take.