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