忘れたときに備えた記録

トップ «前の日記(2009-05-06(Wednesday)) 最新 次の日記(2009-06-08(Monday))» 編集
2005|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|11|12|
2009|01|02|03|04|05|06|10|12|
2010|06|07|08|

2009-05-08(Friday)

eval+clone=SEGVの話

一昨日の話の続きです。

p72でSEGVしないというツッコミを頂いたので、少し調べて見たのです。

hiraku@hirakuro:~$ ~/opt/86/bin/ruby -ve "C=0; o=''; o.instance_eval('def m; C; end'); o.clone.m"
ruby 1.8.7 (2009-01-15 patchlevel 86) [i686-linux]
hiraku@hirakuro:~$ ~/opt/87/bin/ruby -ve "C=0; o=''; o.instance_eval('def m; C; end'); o.clone.m"
ruby 1.8.7 (2009-01-16 patchlevel 87) [i686-linux]
(eval):1: [BUG] Segmentation fault
ruby 1.8.7 (2009-01-16 patchlevel 87) [i686-linux]

Aborted

というわけで、1.8.7-p87からSEGVするようになっていて、1.8.7ブランチでもダメなのが1.8ブランチでは直っていると言う状況です。

ChangeLogによるとp87で

        * class.c (clone_method): should copy cbase in cref as well.
          [ruby-dev:35116]

        * node.h (NEW_CREF): new NEW_ macro.

        * eval.c (PUSH_CREF): use NEW_CREF().

という修正が入っていました。

これの、Ubuntu側(多分Debianも?)の対応状況なのですが、1.8.7-p86とp87のdiffを取って、Ubuntuのruby1.8-1.8.7.72パッケージのソースに入っている追加パッチと見比べてみたのですが、debian/patches/905_class_dup_should_copy_constants.dpatchというパッチの内容が86-87のdiffとほぼ同じでした。

そんなわけで、SEGVするようになったのは、

  • オリジナルRubyは 1.8.7-p87から
  • Ubuntuの(多分Debianも)場合は 追加パッチ"905_class_dup_should_copy_constants.dpatch"で

という事のようです。

Tags: Ruby
[]