未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

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する方がいろいろヒントを出してくれるので、実装者としてはウレシイのではないかと思ったのだが、いらないお世話ですかね。