[#116016] [Ruby master Bug#20150] Memory leak in grapheme clusters — "peterzhu2118 (Peter Zhu) via ruby-core" <ruby-core@...>
Issue #20150 has been reported by peterzhu2118 (Peter Zhu).
7 messages
2024/01/04
[#116382] [Ruby master Feature#20205] Enable `frozen_string_literal` by default — "byroot (Jean Boussier) via ruby-core" <ruby-core@...>
Issue #20205 has been reported by byroot (Jean Boussier).
77 messages
2024/01/23
[ruby-core:116263] [Ruby master Feature#20182] Rewrite Array#each in Ruby
From:
"matz (Yukihiro Matsumoto) via ruby-core" <ruby-core@...>
Date:
2024-01-17 04:36:45 UTC
List:
ruby-core #116263
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/