From: "matz (Yukihiro Matsumoto) via ruby-core" Date: 2024-01-17T04:36:45+00:00 Subject: [ruby-core:116263] [Ruby master Feature#20182] Rewrite Array#each in Ruby Issue #20182 has been updated by matz (Yukihiro Matsumoto). Accepted. For the individual concerns: 1. I'd like to keep race condition safety to be about the same as the current implementation using primitives, unless it's too difficult. 2. If the user intentionally redefines the fundamental method, it should be his/her own responsibility. Matz. ---------------------------------------- Feature #20182: Rewrite Array#each in Ruby https://bugs.ruby-lang.org/issues/20182#change-106285 * Author: k0kubun (Takashi Kokubun) * Status: Open * Priority: Normal ---------------------------------------- ## Proposal Rewrite Array#each in Ruby https://github.com/ruby/ruby/pull/6687. ```rb class Array def each unless block_given? return to_enum(:each) { self.length } end i = 0 while i < self.length yield self[i] i = i.succ end self end end ``` ## Purpose Make it possible for YJIT to optimize ISEQs across `Array#each`. ## Background Whether JIT-compiled or not, calling Ruby from C is more expensive than calling Ruby from Ruby. It also prevents YJIT from making cross-ISEQ optimizations. This is problematic especially for loop methods written in C like `Array#each` since the overhead is repeated at every iteration. ## Discussions There are a couple of things I'd like to discuss in this ticket: 1. @Eregon has pointed out that there's a race condition in the above implementation. `self[i]` would yield `nil` if the element was removed by another thread or TracePoint after `i < self.length`. Is it `Array#each`'s responsibility to atomically operate on elements, or are users supposed to avoid mutating the array in the middle of its loop? 2. If `Integer#<`, `Array#length`, `Integer#succ`, or `Array#[]` is overridden in an incompatible way, the Ruby implementation may not work correctly. May I assume it's acceptable? -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/postorius/lists/ruby-core.ml.ruby-lang.org/