On Wed, 4 Apr 2001, Robert Feldt wrote: > On Wed, 4 Apr 2001, Dave Thomas wrote: > > > Would the identity be based on the method name, or the method > > semantics (given that you can redefine methods). I suspect this would > > be a tricky thing to implement. > > > On the actual code pointed to, ie. convert NODE * body to Integer say > called code_hash or something. Then one can redefine Method#== and compare > the code_hash values. Or? > It works (even though it may not be portable?): $ diff -u eval.c.old eval.c --- eval.c.old Wed Mar 28 10:43:24 2001 +++ eval.c Wed Apr 4 16:34:02 2001 @@ -6603,6 +6603,15 @@ } static VALUE +method_code_hash(method) + VALUE method; +{ + struct METHOD *data; + Data_Get_Struct(method, struct METHOD, data); + return UINT2NUM((unsigned int)data->body); +} + +static VALUE method_arity(method) VALUE method; { @@ -6780,6 +6789,7 @@ rb_define_method(rb_cMethod, "to_s", method_inspect, 0); rb_define_method(rb_cMethod, "to_proc", method_proc, 0); rb_define_method(rb_cMethod, "unbind", method_unbind, 0); + rb_define_method(rb_cMethod, "code_hash", method_code_hash, 0); rb_define_method(rb_mKernel, "method", rb_obj_method, 1); rb_cUnboundMethod = rb_define_class("UnboundMethod", rb_cMethod); and chtest.rb: class Foo def bar; end end f = Foo.new m1 = f.method :bar m2 = f.method :bar puts m1.code_hash puts m2.code_hash class Method def ==(other) self.code_hash == other.code_hash end end puts m1 == m2 and then $ ruby -v chtest.rb ruby 1.7.0 (2001-04-02) [i686-cygwin] 168007192 168007192 true Not sure its safe though... Regards, Robert