free as in air

2007|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|09|11|12|
2012|03|04|05|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|03|04|06|09|
トップ «前の日記(2007-11-19) 最新 次の日記(2007-11-21)» /編集

2007-11-20 [長年日記]

§ [ruby] UnboundMethod::bind()

 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

§ [java] Object#finalize

 Object#finalizeの実行は保証されていないでしょうまさしくその通りであり心より恥じる。

 Rjbが参照を解放してるかどうか見たい。Runtime#addShutdownHookか。あとでやる。