Skip to content

Add specs for #each passing source yields by block arity (Enumerator and Lazy)#1365

Open
sampokuokkanen wants to merge 1 commit into
ruby:masterfrom
sampokuokkanen:enumerable-value-pack
Open

Add specs for #each passing source yields by block arity (Enumerator and Lazy)#1365
sampokuokkanen wants to merge 1 commit into
ruby:masterfrom
sampokuokkanen:enumerable-value-pack

Conversation

@sampokuokkanen
Copy link
Copy Markdown
Contributor

Unlike the Enumerable collection methods, which pack yielded source values via rb_enum_values_pack() (0 args -> nil, 1 arg -> the value, N args -> Array), #each passes them to the block by ordinary block arity (rb_yield_values2() in CRuby): a single-argument block receives the first value, a multi-argument block destructures, and a splat block gathers them.

Pin this explicitly via a shared describe used by both Enumerator#each and Enumerator::Lazy#each, complementing the value_packing specs.

This is so we catch bugs like I had in my implementation of packing in truffleruby/truffleruby#4272.

Comment thread core/enumerator/lazy/each_spec.rb Outdated
require_relative '../../../spec_helper'
require_relative '../shared/each'

describe "Enumerator::Lazy#each" do
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no Enumerator::Lazy#each on CRuby:

irb(main):003> Enumerator::Lazy.instance_method :each
=> #<UnboundMethod: Enumerator#each(*)>

So let's have both it_behaves_like in core/enumerator/each_spec.rb.
That way we test the same (lazy and non-lazy cases) but we ruby/spec doesn't pretend there is a method which doesn't exist on CRuby.

Copy link
Copy Markdown
Member

@eregon eregon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good besides the file organization tweak

…and Lazy)

Unlike the Enumerable collection methods, which pack yielded source values via
rb_enum_values_pack() (0 args -> nil, 1 arg -> the value, N args -> Array), #each
passes them to the block by ordinary block arity (rb_yield_values2() in CRuby):
a single-argument block receives the first value, a multi-argument block
destructures, and a splat block gathers them.
@sampokuokkanen sampokuokkanen force-pushed the enumerable-value-pack branch from 9773b36 to 4e845c5 Compare June 3, 2026 03:15
@sampokuokkanen
Copy link
Copy Markdown
Contributor Author

Thank you! I fixed the organization of the files and now lazy is also tested in core/enumerator/lazy/each_spec.rb.

@sampokuokkanen sampokuokkanen requested a review from eregon June 3, 2026 03:16
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.

2 participants