merge revision(s) 5e018214e7: [Backport #15720]

Fix SystemStackError when calling a method in an unused refinement

	Fixes [Bug #15720]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@67765 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
usa 2019-08-26 15:40:44 +00:00
parent 331512759b
commit 470dae33ea
3 changed files with 37 additions and 2 deletions

View file

@ -2055,6 +2055,38 @@ class TestRefinement < Test::Unit::TestCase
INPUT
end
def test_call_method_in_unused_refinement
bug15720 = '[ruby-core:91916] [Bug #15720]'
assert_in_out_err([], <<-INPUT, ["ok"], [], bug15720)
module M1
refine Kernel do
def foo
'foo called!'
end
end
end
module M2
refine Kernel do
def bar
'bar called!'
end
end
end
using M1
foo
begin
bar
rescue NameError
end
puts "ok"
INPUT
end
def test_super_from_refined_module
a = EnvUtil.labeled_module("A") do
def foo;"[A#{super}]";end

View file

@ -1,6 +1,6 @@
#define RUBY_VERSION "2.5.6"
#define RUBY_RELEASE_DATE "2019-08-27"
#define RUBY_PATCHLEVEL 183
#define RUBY_PATCHLEVEL 184
#define RUBY_RELEASE_YEAR 2019
#define RUBY_RELEASE_MONTH 8

View file

@ -2299,7 +2299,10 @@ vm_call_method_each_type(rb_execution_context_t *ec, rb_control_frame_t *cfp, st
goto no_refinement_dispatch;
}
}
cc->me = ref_me;
if (cc->me->def->type != VM_METHOD_TYPE_REFINED ||
cc->me->def != ref_me->def) {
cc->me = ref_me;
}
if (ref_me->def->type != VM_METHOD_TYPE_REFINED) {
return vm_call_method(ec, cfp, calling, ci, cc);
}