From: daniel@...42.com Date: 2019-12-09T14:01:55+00:00 Subject: [ruby-core:96164] [Ruby master Bug#15027] When Struct#each method is overriden Struct#select and Struct#to_a use wrong collections 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: