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

ruby-changes:14425

From: mame <ko1@a...>
Date: Fri, 8 Jan 2010 23:11:21 +0900 (JST)
Subject: [ruby-changes:14425] Ruby:r26255 (trunk): * vm_method.c (rb_alias): skip ZSUPER method when searching body of

mame	2010-01-08 23:10:58 +0900 (Fri, 08 Jan 2010)

  New Revision: 26255

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26255

  Log:
    * vm_method.c (rb_alias): skip ZSUPER method when searching body of
      source method.  [ruby-dev:39760]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_alias.rb
    trunk/vm_method.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 26254)
+++ ChangeLog	(revision 26255)
@@ -1,3 +1,8 @@
+Fri Jan  8 22:59:40 2010  Yusuke Endoh  <mame@t...>
+
+	* vm_method.c (rb_alias): skip ZSUPER method when searching body of
+	  source method.  [ruby-dev:39760]
+
 Fri Jan  8 21:15:21 2010  NARUSE, Yui  <naruse@r...>
 
 	* lib/net/http, lib/net/https: move content from net/https to
Index: vm_method.c
===================================================================
--- vm_method.c	(revision 26254)
+++ vm_method.c	(revision 26255)
@@ -858,7 +858,9 @@
 void
 rb_alias(VALUE klass, ID name, ID def)
 {
+    VALUE target_klass = klass;
     rb_method_entry_t *orig_me;
+    rb_method_flag_t flag = NOEX_UNDEF;
 
     if (NIL_P(klass)) {
 	rb_raise(rb_eTypeError, "no class to make alias");
@@ -869,6 +871,7 @@
 	rb_secure(4);
     }
 
+  again:
     orig_me = search_method(klass, def);
 
     if (UNDEFINED_METHOD_ENTRY_P(orig_me)) {
@@ -877,8 +880,15 @@
 	    rb_print_undef(klass, def, 0);
 	}
     }
+    if (orig_me->def->type == VM_METHOD_TYPE_ZSUPER) {
+	klass = RCLASS_SUPER(klass);
+	def = orig_me->def->original_id;
+	flag = orig_me->flag;
+	goto again;
+    }
 
-    rb_add_method_me(klass, name, orig_me, orig_me->flag);
+    if (flag == NOEX_UNDEF) flag = orig_me->flag;
+    rb_add_method_me(target_klass, name, orig_me, flag);
 }
 
 /*
Index: test/ruby/test_alias.rb
===================================================================
--- test/ruby/test_alias.rb	(revision 26254)
+++ test/ruby/test_alias.rb	(revision 26255)
@@ -85,4 +85,23 @@
       end
     end
   end
+
+  def test_alias_with_zsuper_method
+    c = Class.new
+    c.class_eval do
+      def foo
+        :ok
+      end
+      def bar
+        :ng
+      end
+      private :foo
+    end
+    d = Class.new(c)
+    d.class_eval do
+      public :foo
+      alias bar foo
+    end
+    assert_equal(:ok, d.new.bar)
+  end
 end

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

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