[Ruby 1.9 - Bug #4223] GC.stress = true で謎の ArgumentError

Issue #4223 has been updated by Makoto K…

RB_GC_GUARD マクロについて簡単にまとめておきます
*
オブジェクトの中身を指してるポインタがCコード中にあって参照中なのに、オブジェクトを指すポインタ(VALUE)がどこにもなくなっちゃってGCに回収されるのを防ぐ
*
関数の最初のほうにあるコードがけっこうある。展開内容を工夫して、それでも困らないようにがんばってはいるけど、コンパイラによる高度な最適化で、結構わからない
*
ソースコードのコントロールフロー中、オブジェクトの中身にアクセスしていて、かつGCが起きうる場所(rubyコードが動く、オブジェクトを作る)よりも後ろに置くことが、安全のためには必要。将来コードを追加することを考えると、より(コントロールフロー的に)後ろのほうに

Bug #4223: GC.stress = true で謎の ArgumentError

Author: Makoto K.
Status: Closed
Priority: Normal
Assignee: Kenta M.
Category:
Target version: 1.9.3
ruby -v: -

=begin
手元の環境で、trunk の r29690 以降で、次のようなスクリプトが、

foo.rb

GC.stress = true
t = Time.local(2000)
File.utime(t + 1, t + 2, “foo.rb”)

こんな感じに謎の ArgumentError になります

$ ruby19 -v foo.rb
ruby 1.9.3dev (2010-12-29 trunk 30417) [x86_64-freebsd8.2]
foo.rb:4:in utime': time out of system range (ArgumentError) from foo.rb:4:in
=end