aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_refinement.rb4
-rw-r--r--vm_insnhelper.c2
3 files changed, 8 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index d5cb49f877..2705ec53cf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Oct 19 17:02:15 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_opt_send): enable refinements with
+ Kernel#send and BasicObject#__send__. [Feature #11476]
+
Wed Oct 19 14:22:49 2016 Nobuyoshi Nakada <nobu@ruby-lang.org>
* basictest/runner.rb: do not clobber the option by --run-opt with
diff --git a/test/ruby/test_refinement.rb b/test/ruby/test_refinement.rb
index 2ecbf8edf0..5e881edb91 100644
--- a/test/ruby/test_refinement.rb
+++ b/test/ruby/test_refinement.rb
@@ -171,10 +171,10 @@ class TestRefinement < Test::Unit::TestCase
end
end
- def test_send_should_not_use_refinements
+ def test_send_should_use_refinements
foo = Foo.new
assert_raise(NoMethodError) { foo.send(:z) }
- assert_raise(NoMethodError) { FooExtClient.send_z_on(foo) }
+ assert_equal("FooExt#z", FooExtClient.send_z_on(foo))
assert_raise(NoMethodError) { foo.send(:z) }
assert_equal(true, RespondTo::Sub.new.respond_to?(:foo))
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index d9c2087243..935e733ca5 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1956,7 +1956,7 @@ vm_call_opt_send(rb_thread_t *th, rb_control_frame_t *reg_cfp, struct rb_calling
DEC_SP(1);
}
- cc->me = rb_callable_method_entry_without_refinements(CLASS_OF(calling->recv), ci->mid);
+ cc->me = rb_callable_method_entry_with_refinements(CLASS_OF(calling->recv), ci->mid);
ci->flag = VM_CALL_FCALL | VM_CALL_OPT_SEND;
return vm_call_method(th, reg_cfp, calling, ci, cc);
}