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

ruby-changes:9429

From: ko1 <ko1@a...>
Date: Wed, 24 Dec 2008 20:47:34 +0900 (JST)
Subject: [ruby-changes:9429] Ruby:r20967 (trunk): * vm_insnhelper.c (vm_call_method): use class of method defined

ko1	2008-12-24 20:47:00 +0900 (Wed, 24 Dec 2008)

  New Revision: 20967

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

  Log:
    * vm_insnhelper.c (vm_call_method): use class of method defined
      instead of receiver's class on bmethod.  fixes [ruby-core:20786]
    * bootstraptest/test_method.rb: add a test for above.
    * vm_insnhelper.c (vm_setup_method): remove unused parameter klass.
    * vm_insnhelper.h (CALL_METHOD): ditto.
    * insns.def, vm_eval.c: ditto.

  Modified files:
    trunk/ChangeLog
    trunk/bootstraptest/test_method.rb
    trunk/insns.def
    trunk/vm_eval.c
    trunk/vm_insnhelper.c
    trunk/vm_insnhelper.h

Index: insns.def
===================================================================
--- insns.def	(revision 20966)
+++ insns.def	(revision 20967)
@@ -996,7 +996,7 @@
 	vm_send_optimize(GET_CFP(), &mn, &flag, &num, &id, klass);
     }
 
-    CALL_METHOD(num, blockptr, flag, id, mn, recv, klass);
+    CALL_METHOD(num, blockptr, flag, id, mn, recv);
 }
 
 /**
@@ -1023,7 +1023,7 @@
     vm_search_superclass(GET_CFP(), GET_ISEQ(), recv, TOPN(num), &id, &klass);
     mn = rb_method_node(klass, id);
 
-    CALL_METHOD(num, blockptr, flag, id, mn, recv, klass);
+    CALL_METHOD(num, blockptr, flag, id, mn, recv);
 }
 
 /**
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 20966)
+++ ChangeLog	(revision 20967)
@@ -1,3 +1,16 @@
+Wed Dec 24 20:33:45 2008  Koichi Sasada  <ko1@a...>
+
+	* vm_insnhelper.c (vm_call_method): use class of method defined
+	  instead of receiver's class on bmethod.  fixes [ruby-core:20786]
+
+	* bootstraptest/test_method.rb: add a test for above.
+
+	* vm_insnhelper.c (vm_setup_method): remove unused parameter klass.
+
+	* vm_insnhelper.h (CALL_METHOD): ditto.
+
+	* insns.def, vm_eval.c: ditto.
+
 Wed Dec 24 20:15:50 2008  Koichi Sasada  <ko1@a...>
 
 	* tool/file2lastrev.rb (get_revisions): fix to ignore end of line.
Index: bootstraptest/test_method.rb
===================================================================
--- bootstraptest/test_method.rb	(revision 20966)
+++ bootstraptest/test_method.rb	(revision 20967)
@@ -1084,3 +1084,22 @@
   a = b = [:foo]
   regular(1, *a, *[3, 4], *b)
 }
+
+assert_equal '["B", "A"]', %q{
+  class A
+    def m
+      'A'
+    end
+  end
+
+  class B < A
+    define_method(:m) do    
+      ['B', super()]
+    end
+  end
+
+  class C < B
+  end
+
+  C.new.m
+}
Index: vm_eval.c
===================================================================
--- vm_eval.c	(revision 20966)
+++ vm_eval.c	(revision 20967)
@@ -52,7 +52,7 @@
 	    *reg_cfp->sp++ = argv[i];
 	}
 
-	vm_setup_method(th, reg_cfp, argc, blockptr, 0, iseqval, recv, klass);
+	vm_setup_method(th, reg_cfp, argc, blockptr, 0, iseqval, recv);
 	val = vm_exec(th);
 	break;
       }
Index: vm_insnhelper.c
===================================================================
--- vm_insnhelper.c	(revision 20966)
+++ vm_insnhelper.c	(revision 20967)
@@ -423,7 +423,7 @@
 static inline void
 vm_setup_method(rb_thread_t *th, rb_control_frame_t *cfp,
 		const int argc, const rb_block_t *blockptr, const VALUE flag,
-		const VALUE iseqval, const VALUE recv, const VALUE klass)
+		const VALUE iseqval, const VALUE recv)
 {
     rb_iseq_t *iseq;
     int opt_pc, i;
@@ -479,7 +479,7 @@
 static inline VALUE
 vm_call_method(rb_thread_t * const th, rb_control_frame_t * const cfp,
 	       const int num, rb_block_t * const blockptr, const VALUE flag,
-	       const ID id, const NODE * mn, const VALUE recv, VALUE klass)
+	       const ID id, const NODE * mn, const VALUE recv)
 {
     VALUE val;
 
@@ -496,7 +496,7 @@
 
 	    switch (nd_type(node)) {
 	      case RUBY_VM_METHOD_NODE:{
-		vm_setup_method(th, cfp, num, blockptr, flag, (VALUE)node->nd_body, recv, klass);
+		vm_setup_method(th, cfp, num, blockptr, flag, (VALUE)node->nd_body, recv);
 		return Qundef;
 	      }
 	      case NODE_CFUNC:{
@@ -521,10 +521,11 @@
 		VALUE *argv = ALLOCA_N(VALUE, num);
 		MEMCPY(argv, cfp->sp - num, VALUE, num);
 		cfp->sp += - num - 1;
-		val = vm_call_bmethod(th, id, node->nd_cval, recv, klass, num, argv, blockptr);
+		val = vm_call_bmethod(th, id, node->nd_cval, recv, mn->nd_clss, num, argv, blockptr);
 		break;
 	      }
 	      case NODE_ZSUPER:{
+		VALUE klass;
 		klass = RCLASS_SUPER(mn->nd_clss);
 		mn = rb_method_node(klass, id);
 
Index: vm_insnhelper.h
===================================================================
--- vm_insnhelper.h	(revision 20966)
+++ vm_insnhelper.h	(revision 20967)
@@ -158,8 +158,8 @@
   c1->nd_next = __tmp_c2->nd_next; \
 } while (0)
 
-#define CALL_METHOD(num, blockptr, flag, id, mn, recv, klass) do { \
-    VALUE v = vm_call_method(th, GET_CFP(), num, blockptr, flag, id, mn, recv, klass); \
+#define CALL_METHOD(num, blockptr, flag, id, mn, recv) do { \
+    VALUE v = vm_call_method(th, GET_CFP(), num, blockptr, flag, id, mn, recv); \
     if (v == Qundef) { \
 	RESTORE_REGS(); \
 	NEXT_INSN(); \
@@ -188,7 +188,7 @@
 
 #define CALL_SIMPLE_METHOD(num, id, recv) do { \
     VALUE klass = CLASS_OF(recv); \
-    CALL_METHOD(num, 0, 0, id, rb_method_node(klass, id), recv, CLASS_OF(recv)); \
+    CALL_METHOD(num, 0, 0, id, rb_method_node(klass, id), recv); \
 } while (0)
 
 #endif /* RUBY_INSNHELPER_H */

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

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