ruby-changes:24744
From: shugo <ko1@a...>
Date: Thu, 23 Aug 2012 13:00:40 +0900 (JST)
Subject: [ruby-changes:24744] shugo:r36795 (trunk): * insns.def (invokesuper): reverted r36640 partially to make super
shugo 2012-08-23 13:00:25 +0900 (Thu, 23 Aug 2012) New Revision: 36795 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36795 Log: * insns.def (invokesuper): reverted r36640 partially to make super in a thread work correctly. [ruby-core:47284] [Bug #6907] * test/ruby/test_super.rb: related test. Modified files: trunk/ChangeLog trunk/insns.def trunk/test/ruby/test_super.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 36794) +++ ChangeLog (revision 36795) @@ -1,3 +1,10 @@ +Thu Aug 23 12:51:39 2012 Shugo Maeda <shugo@r...> + + * insns.def (invokesuper): reverted r36640 partially to make super + in a thread work correctly. [ruby-core:47284] [Bug #6907] + + * test/ruby/test_super.rb: related test. + Thu Aug 23 12:30:20 2012 NAKAMURA Usaku <usa@r...> * win32/configure.bat: support --with(out)?-ext(ensions) options. Index: insns.def =================================================================== --- insns.def (revision 36794) +++ insns.def (revision 36795) @@ -1026,8 +1026,6 @@ int num = caller_setup_args(th, GET_CFP(), flag, (int)op_argc, blockiseq, &blockptr); VALUE recv, klass; - rb_control_frame_t *cfp = GET_CFP(); - rb_control_frame_t *end_cfp = RUBY_VM_END_CONTROL_FRAME(th); ID id; const rb_method_entry_t *me; rb_iseq_t *ip; @@ -1038,21 +1036,10 @@ if (!NIL_P(RCLASS_REFINED_CLASS(klass))) { klass = RCLASS_REFINED_CLASS(klass); } - - recv = Qundef; - while (RUBY_VM_VALID_CONTROL_FRAME_P(cfp, end_cfp)) { - if (((VM_EP_LEP_P(cfp->ep) && cfp->iseq && - cfp->iseq->type == ISEQ_TYPE_METHOD) || - (cfp->me && cfp->me->def->type == VM_METHOD_TYPE_BMETHOD)) && - rb_obj_is_kind_of(cfp->self, klass)) { - recv = cfp->self; - break; - } - cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp); + recv = GET_SELF(); + if (!rb_obj_is_kind_of(recv, klass)) { + rb_raise(rb_eNotImpError, "super from singleton method that is defined to multiple classes is not supported; this will be fixed in 2.0.0 or later"); } - if (recv == Qundef) { - rb_raise(rb_eNoMethodError, "super called outside of method"); - } vm_search_superclass(GET_CFP(), GET_ISEQ(), TOPN(num), &id, &klass); ip = GET_ISEQ(); Index: test/ruby/test_super.rb =================================================================== --- test/ruby/test_super.rb (revision 36794) +++ test/ruby/test_super.rb (revision 36795) @@ -264,7 +264,9 @@ end } obj = sub_class.new - assert_equal [:super, obj], obj.foo + assert_raise(NotImplementedError) do + obj.foo + end end def test_super_in_instance_eval_with_define_method @@ -282,7 +284,9 @@ end } obj = sub_class.new - assert_equal [:super, obj], obj.foo + assert_raise(NotImplementedError) do + obj.foo + end end def test_super_in_orphan_block @@ -298,9 +302,7 @@ end } obj = sub_class.new - assert_raise(NoMethodError) do - obj.foo.call - end + assert_equal([:super, obj], obj.foo.call) end def test_super_in_orphan_block_with_instance_eval @@ -318,7 +320,7 @@ end } obj = sub_class.new - assert_raise(NoMethodError) do + assert_raise(NotImplementedError) do obj.foo.call end end @@ -334,4 +336,15 @@ } assert_equal 'hi', y.hello end + + def test_super_in_thread + hoge = Class.new { + def bar; 'hoge'; end + } + foo = Class.new(hoge) { + def bar; Thread.new { super }.join.value; end + } + + assert_equal 'hoge', foo.new.bar + end end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/