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