diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_refinement.rb | 4 | ||||
-rw-r--r-- | vm_insnhelper.c | 2 |
3 files changed, 8 insertions, 3 deletions
@@ -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); } |