[前][次][番号順一覧][スレッド一覧]

ruby-changes:4546

From: ko1@a...
Date: Tue, 15 Apr 2008 19:08:24 +0900 (JST)
Subject: [ruby-changes:4546] kazu - Ruby:r16039 (ruby_1_8): * eval.c (method_receiver, method_name, method_owner): New

kazu	2008-04-15 19:07:59 +0900 (Tue, 15 Apr 2008)

  New Revision: 16039

  Modified files:
    branches/ruby_1_8/ChangeLog
    branches/ruby_1_8/NEWS
    branches/ruby_1_8/eval.c
    branches/ruby_1_8/test/ruby/test_method.rb

  Log:
    * eval.c (method_receiver, method_name, method_owner): New
      methods; backported from 1.9. bug#19007


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/ChangeLog?r1=16039&r2=16038&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/test/ruby/test_method.rb?r1=16039&r2=16038&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/NEWS?r1=16039&r2=16038&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/branches/ruby_1_8/eval.c?r1=16039&r2=16038&diff_format=u

Index: ruby_1_8/NEWS
===================================================================
--- ruby_1_8/NEWS	(revision 16038)
+++ ruby_1_8/NEWS	(revision 16039)
@@ -167,6 +167,12 @@
 
     Return an enumerator if no block is given.
 
+  * Method#receiver
+  * Method#name
+  * Method#owner
+
+    New methods.
+
   * Numeric#step
 
     Return an enumerator if no block is given.
Index: ruby_1_8/ChangeLog
===================================================================
--- ruby_1_8/ChangeLog	(revision 16038)
+++ ruby_1_8/ChangeLog	(revision 16039)
@@ -1,3 +1,8 @@
+Tue Apr 15 19:03:28 2008  Kazuhiro NISHIYAMA  <zn@m...>
+
+	* eval.c (method_receiver, method_name, method_owner): New
+	  methods; backported from 1.9. bug#19007
+
 Tue Apr 15 18:39:14 2008  Kazuhiro NISHIYAMA  <zn@m...>
 
 	* lib/uri.rb, lib/uri/ldaps.rb: added LDAPS
Index: ruby_1_8/test/ruby/test_method.rb
===================================================================
--- ruby_1_8/test/ruby/test_method.rb	(revision 16038)
+++ ruby_1_8/test/ruby/test_method.rb	(revision 16039)
@@ -39,4 +39,13 @@
       um.bind(Base.new)
     end
   end
+
+  def test_receiver_name_owner
+    o = Object.new
+    def o.foo; end
+    m = o.method(:foo)
+    assert_equal(o, m.receiver)
+    assert_equal("foo", m.name)
+    assert_equal(class << o; self; end, m.owner)
+  end
 end
Index: ruby_1_8/eval.c
===================================================================
--- ruby_1_8/eval.c	(revision 16038)
+++ ruby_1_8/eval.c	(revision 16039)
@@ -9120,6 +9120,57 @@
 
 /*
  *  call-seq:
+ *     meth.receiver    => object
+ *
+ *  Returns the bound receiver of the method object.
+ */
+
+static VALUE
+method_receiver(obj)
+    VALUE obj;
+{
+    struct METHOD *data;
+
+    Data_Get_Struct(obj, struct METHOD, data);
+    return data->recv;
+}
+
+/*
+ *  call-seq:
+ *     meth.name    => string
+ *
+ *  Returns the name of the method.
+ */
+
+static VALUE
+method_name(obj)
+    VALUE obj;
+{
+    struct METHOD *data;
+
+    Data_Get_Struct(obj, struct METHOD, data);
+    return rb_str_new2(rb_id2name(data->oid));
+}
+
+/*
+ *  call-seq:
+ *     meth.owner    => class_or_module
+ *
+ *  Returns the class or module that defines the method.
+ */
+
+static VALUE
+method_owner(obj)
+    VALUE obj;
+{
+    struct METHOD *data;
+
+    Data_Get_Struct(obj, struct METHOD, data);
+    return data->klass;
+}
+
+/*
+ *  call-seq:
  *     obj.method(sym)    => method
  *  
  *  Looks up the named method as a receiver in <i>obj</i>, returning a
@@ -9739,6 +9790,9 @@
     rb_define_method(rb_cMethod, "inspect", method_inspect, 0);
     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, "receiver", method_receiver, 0);
+    rb_define_method(rb_cMethod, "name", method_name, 0);
+    rb_define_method(rb_cMethod, "owner", method_owner, 0);
     rb_define_method(rb_cMethod, "unbind", method_unbind, 0);
     rb_define_method(rb_mKernel, "method", rb_obj_method, 1);
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]