忘れたときに備えた記録
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"で
という事のようです。
[ツッコミを入れる]
[]