[ruby-core:96164] [Ruby master Bug#15027] When Struct#each method is overriden Struct#select and Struct#to_a use wrong collections

[email protected]
Newsgroups gmane.comp.lang.ruby.core
Message-ID <redmine.journal-83042.20191209140155.5209b3b87df86f5b@ruby-lang.org>
Issue #15027 has been updated by Dan0042 (Daniel DeLorme).


In the case that a method is overridden _only_ for optimization's sake, the override check is simply the equivalent of deoptimizing when a required constraint doesn't hold. This is pretty common in a VM right?

----------------------------------------
Bug #15027: When Struct#each method is overriden Struct#select and Struct#to_a use wrong collections
https://bugs.ruby-lang.org/issues/15027#change-83042

* Author: bruno (Bruno Sutic)
* Status: Assigned
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* Target version: 
* ruby -v: 2.6.0dev
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
### Bug

Here's the code snippet that should reproduce the problem:

~~~ ruby
class Foo < Struct.new(:bar)
  def each(&block)
    [:baz, :qux].each(&block)
  end
end

foo = Foo.new(:foo)
foo.map(&:itself) # => [:baz, :qux]  # OK

foo.to_a # => [:foo]  # NOT OK, expected [:baz, :qux]
foo.select(&:itself) # => [:foo]  # NOT OK, expected [:baz, :qux]
~~~

As you can see, even tho we defined another collection for use by overriding `#each`, the `to_a` and `select` still use `Struct`'s original collection.

The problem seem to be with `Struct#to_a` and `Struct#select` methods from `struct.c` file that are defined unnecessarily.

### Proposed solution

The attached solution simply deletes `Struct#select` and `Struct#to_a`. A couple tests are added to show everything still works as before.

Please let me know if I can provide any more info and I'll be ready to do so.

---Files--------------------------------
struct_enumerable_fix.patch (2.8 KB)
struct_enumerable_fix2.patch (1.51 KB)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.