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

ruby-changes:59969

From: Nobuyoshi <ko1@a...>
Date: Sun, 9 Feb 2020 20:21:03 +0900 (JST)
Subject: [ruby-changes:59969] e3e96e3faa (master): Check if bindable against the refined target [Bug #16617]

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

From e3e96e3faa1683c8ee832cb6da6f9f96d18b0d77 Mon Sep 17 00:00:00 2001
From: Nobuyoshi Nakada <nobu@r...>
Date: Sun, 9 Feb 2020 20:13:49 +0900
Subject: Check if bindable against the refined target [Bug #16617]


diff --git a/common.mk b/common.mk
index 59d11a9..617d399 100644
--- a/common.mk
+++ b/common.mk
@@ -3224,6 +3224,7 @@ proc.$(OBJEXT): $(top_srcdir)/internal/array.h https://github.com/ruby/ruby/blob/trunk/common.mk#L3224
 proc.$(OBJEXT): $(top_srcdir)/internal/class.h
 proc.$(OBJEXT): $(top_srcdir)/internal/compilers.h
 proc.$(OBJEXT): $(top_srcdir)/internal/error.h
+proc.$(OBJEXT): $(top_srcdir)/internal/eval.h
 proc.$(OBJEXT): $(top_srcdir)/internal/gc.h
 proc.$(OBJEXT): $(top_srcdir)/internal/imemo.h
 proc.$(OBJEXT): $(top_srcdir)/internal/object.h
diff --git a/proc.c b/proc.c
index 47f4e66..83ec61d 100644
--- a/proc.c
+++ b/proc.c
@@ -14,6 +14,7 @@ https://github.com/ruby/ruby/blob/trunk/proc.c#L14
 #include "internal.h"
 #include "internal/class.h"
 #include "internal/error.h"
+#include "internal/eval.h"
 #include "internal/object.h"
 #include "internal/proc.h"
 #include "internal/symbol.h"
@@ -2366,6 +2367,10 @@ convert_umethod_to_method_components(VALUE method, VALUE recv, VALUE *methclass_ https://github.com/ruby/ruby/blob/trunk/proc.c#L2367
     VALUE iclass = data->me->defined_class;
     VALUE klass = CLASS_OF(recv);
 
+    if (RB_TYPE_P(methclass, T_MODULE)) {
+        VALUE refined_class = rb_refinement_module_get_refined_class(methclass);
+        if (!NIL_P(refined_class)) methclass = refined_class;
+    }
     if (!RB_TYPE_P(methclass, T_MODULE) &&
 	methclass != CLASS_OF(recv) && !rb_obj_is_kind_of(recv, methclass)) {
 	if (FL_TEST(methclass, FL_SINGLETON)) {
diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb
index c6707ff..1f2a67e 100644
--- a/test/ruby/test_refinement.rb
+++ b/test/ruby/test_refinement.rb
@@ -2386,6 +2386,25 @@ class TestRefinement < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_refinement.rb#L2386
     assert_equal(0, Bug13446::GenericEnumerable.new.sum)
   end
 
+  def test_unbound_refine_method
+    a = EnvUtil.labeled_class("A") do
+      def foo
+        self.class
+      end
+    end
+    b = EnvUtil.labeled_class("B")
+    bar = EnvUtil.labeled_module("R") do
+      break refine a do
+        def foo
+          super
+        end
+      end
+    end
+    assert_raise(TypeError) do
+      bar.instance_method(:foo).bind(b.new)
+    end
+  end
+
   private
 
   def eval_using(mod, s)
-- 
cgit v0.10.2


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

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