ruby-changes:9487
From: yugui <ko1@a...>
Date: Thu, 25 Dec 2008 18:57:29 +0900 (JST)
Subject: [ruby-changes:9487] Ruby:r21024 (ruby_1_9_1): merges r20967 from trunk into ruby_1_9_1.
yugui 2008-12-25 18:55:35 +0900 (Thu, 25 Dec 2008) New Revision: 21024 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=21024 Log: merges r20967 from trunk into ruby_1_9_1. * 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: branches/ruby_1_9_1/ChangeLog branches/ruby_1_9_1/bootstraptest/test_method.rb branches/ruby_1_9_1/insns.def branches/ruby_1_9_1/vm_eval.c branches/ruby_1_9_1/vm_insnhelper.c branches/ruby_1_9_1/vm_insnhelper.h Index: ruby_1_9_1/insns.def =================================================================== --- ruby_1_9_1/insns.def (revision 21023) +++ ruby_1_9_1/insns.def (revision 21024) @@ -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: ruby_1_9_1/ChangeLog =================================================================== --- ruby_1_9_1/ChangeLog (revision 21023) +++ ruby_1_9_1/ChangeLog (revision 21024) @@ -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: ruby_1_9_1/bootstraptest/test_method.rb =================================================================== --- ruby_1_9_1/bootstraptest/test_method.rb (revision 21023) +++ ruby_1_9_1/bootstraptest/test_method.rb (revision 21024) @@ -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: ruby_1_9_1/vm_eval.c =================================================================== --- ruby_1_9_1/vm_eval.c (revision 21023) +++ ruby_1_9_1/vm_eval.c (revision 21024) @@ -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: ruby_1_9_1/vm_insnhelper.c =================================================================== --- ruby_1_9_1/vm_insnhelper.c (revision 21023) +++ ruby_1_9_1/vm_insnhelper.c (revision 21024) @@ -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: ruby_1_9_1/vm_insnhelper.h =================================================================== --- ruby_1_9_1/vm_insnhelper.h (revision 21023) +++ ruby_1_9_1/vm_insnhelper.h (revision 21024) @@ -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/