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

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/

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