Kagemusha的には結局これだけかね。
Index: eval.c
===================================================================
--- eval.c (リビジョン 13964)
+++ eval.c (作業コピー)
@@ -9340,7 +9340,7 @@
Data_Get_Struct(method, struct METHOD, data);
if (data->rklass != rklass) {
- if (FL_TEST(data->rklass, FL_SINGLETON)) {
+ if (TYPE(data->rklass) != T_CLASS && FL_TEST(data->rklass, FL_SINGLETON)) {
rb_raise(rb_eTypeError, "singleton method bound for a different object");
}
if (TYPE(data->rklass) == T_MODULE) {
しかしこれはどうなんだろうか。irb(main):001:0> module Foo;def self.aa;:aa;end;end
=> nil
irb(main):002:0> Foo.aa
=> :aa
irb(main):003:0> Foo.method(:aa).unbind.bind(Foo)
=> #<Method: Foo.aa>
irb(main):004:0> Foo.method(:aa).unbind.bind(Foo).call
=> :aa
irb(main):005:0> class Bar;end
=> nil
irb(main):006:0> Foo.method(:aa).unbind.bind(Bar)
TypeError: bind argument must be an instance of Module
from (irb):6:in `bind'
from (irb):6
Object#finalizeの実行は保証されていないでしょう
まさしくその通りであり心より恥じる。
Rjbが参照を解放してるかどうか見たい。Runtime#addShutdownHookか。あとでやる。