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

ruby-changes:61649

From: Jeremy <ko1@a...>
Date: Wed, 10 Jun 2020 08:31:22 +0900 (JST)
Subject: [ruby-changes:61649] ad0eccf840 (master): Work around infinite loop when overriding method visibility in prepended module (#3201)

https://git.ruby-lang.org/ruby.git/commit/?id=ad0eccf840

From ad0eccf840f692694e63ec72c8496dc106e603ed Mon Sep 17 00:00:00 2001
From: Jeremy Evans <code@j...>
Date: Tue, 9 Jun 2020 16:30:55 -0700
Subject: Work around infinite loop when overriding method visibility in
 prepended module (#3201)

For ZSUPER methods with no defined class for the method entry, start the next lookup at the superclass of the origin class of the method owner, instead of the superclass of the method owner.

Fixes [Bug #16942]

diff --git a/proc.c b/proc.c
index 38d4fc6..249bc65 100644
--- a/proc.c
+++ b/proc.c
@@ -1572,12 +1572,12 @@ mnew_internal(const rb_method_entry_t *me, VALUE klass, VALUE iclass, https://github.com/ruby/ruby/blob/trunk/proc.c#L1572
     }
     if (me->def->type == VM_METHOD_TYPE_ZSUPER) {
 	if (me->defined_class) {
-	    VALUE klass = RCLASS_SUPER(RCLASS_ORIGIN(me->defined_class));
+            VALUE klass = RCLASS_SUPER(RCLASS_ORIGIN(me->defined_class));
 	    id = me->def->original_id;
             me = (rb_method_entry_t *)rb_callable_method_entry_with_refinements(klass, id, &iclass);
 	}
 	else {
-	    VALUE klass = RCLASS_SUPER(me->owner);
+            VALUE klass = RCLASS_SUPER(RCLASS_ORIGIN(me->owner));
 	    id = me->def->original_id;
 	    me = rb_method_entry_without_refinements(klass, id, &iclass);
 	}
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 12f6f9a..43c6c6d 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -1181,6 +1181,27 @@ class TestMethod < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_method.rb#L1181
     assert_separately [], "RubyVM::InstructionSequence.compile_option = {trace_instruction: false}\n" + body
   end
 
+  def test_zsuper_private_override_instance_method
+    assert_separately(%w(--disable-gems), <<-'end;', timeout: 30)
+      # Bug #16942 [ruby-core:98691]
+      module M
+        def x
+        end
+      end
+
+      module M2
+        prepend Module.new
+        include M
+        private :x
+      end
+
+      ::Object.prepend(M2)
+
+      m = Object.instance_method(:x)
+      assert_equal M, m.owner
+    end;
+  end
+
   def test_eqq
     assert_operator(0.method(:<), :===, 5)
     assert_not_operator(0.method(:<), :===, -5)
-- 
cgit v0.10.2


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

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