RubyのArrayがSharedでOCCUPIED

ruby/ruby(trunk)にパッチを投げた。

https://github.com/ruby/ruby/pull/537

以下を処理するのにものすごく時間がかかる。

n = 1000000
a = (0..n).to_a;nil
while a.shift(2).length != 0
end

nが10000とかなら気にならないレベルなんだけど、1000000となると数分かかる。 これをどんな長さでも瞬時に終わらせる修正だった。

これを投げた時、更にアイデアがあった。

「このaryはARY_SHARED_PであることはあってもARY_SHARED_OCCUPIEDになることはなくない?」

というもの。

そもそもそれが間違いで、ary_make_partial内のlenをaryの長さだと取り違えていたのだった。

なのでARY_SHARED_OCCUPIEDになることはありうる。

また、その中のary_mem_clearGC漏れを防ぐために設置されたものなので必要。

完全に間違えていた。

なぜ要らないと思ったかといえばtestでその部分を通らなかったからで、これはカバレッジを上げるためにここんとこを通るテストコードも追加したほうがいいんじゃないだろうか。

と思ってテストも追加する。

まあ採用されるかわからないけどあたたかくお見守り下さい。