rubyの一行パッチを書いた。
rubyについてはまったくの門外漢であるが、http://redmine.ruby-lang.org/issues/show/699 という問題を教えてもらったので、早速解析してみた。
$ svn diff Index: vm_method.c =================================================================== --- vm_method.c (revision 20238) +++ vm_method.c (working copy) @@ -314,7 +314,7 @@ if (OBJ_FROZEN(klass)) rb_error_frozen("class/module"); if (mid == object_id || mid == __send__ || mid == idInitialize) { - rb_warn("removing `%s' may cause serious problem", rb_id2name(mid)); + rb_bug("removing `%s' may cause serious problem", rb_id2name(mid)); } if (st_lookup(RCLASS_M_TBL(klass), mid, &data)) { body = (NODE *)data;
rb_warn()でエラーを報告するのではなくrb_bug()でエラーを報告し、すなおにabortする。
$ ./ruby -e 'class Exception; remove_method(:initialize); end;' -e:1: [BUG] removing `initialize' may cause serious problem ruby 1.9.0 (2008-11-15 revision 20237) [i686-linux] -- control frame ---------- c:0005 p:---- s:0012 b:0012 l:000011 d:000011 CFUNC :remove_method c:0004 p:0013 s:0008 b:0008 l:000007 d:000007 CLASS -e:1 c:0003 p:0009 s:0006 b:0006 l:000005 d:000005 TOP -e:1 c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH c:0001 p:0000 s:0002 b:0002 l:000001 d:000001 TOP <dummy toplevel>:17 --------------------------- DBG> : "-e:1:in `remove_method'" DBG> : "-e:1:in `<class:Exception>'" DBG> : "-e:1:in `<main>'" -- backtrace of native function call (Use addr2line) -- 0x812b7d4 0x81593f1 0x8159448 0x8125668 0x81257c2 0x811943d 0x811b313 0x811dd8d 0x81220c4 0x81222ac 0x805d32f 0x805e756 0x805bd50 0xb7d5c685 0x805bc51 ------------------------------------------------------- Aborted
どうせリカバリできないbugなので、情報を出力してabortする方がいろいろヒントを出してくれるので、実装者としてはウレシイのではないかと思ったのだが、いらないお世話ですかね。