Issue #4223 has been updated by Makoto K…
RB_GC_GUARD マクロについて簡単にまとめておきます
*
オブジェクトの中身を指してるポインタがCコード中にあって参照中なのに、オブジェクトを指すポインタ(VALUE)がどこにもなくなっちゃってGCに回収されるのを防ぐ
*
関数の最初のほうにあるコードがけっこうある。展開内容を工夫して、それでも困らないようにがんばってはいるけど、コンパイラによる高度な最適化で、結構わからない
*
ソースコードのコントロールフロー中、オブジェクトの中身にアクセスしていて、かつGCが起きうる場所(rubyコードが動く、オブジェクトを作る)よりも後ろに置くことが、安全のためには必要。将来コードを追加することを考えると、より(コントロールフロー的に)後ろのほうに
Bug #4223: GC.stress = true で謎の ArgumentError
http://redmine.ruby-lang.org/issues/4223
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