Skip to content

Commit

Permalink
merge revision(s) 636d4f7: [Backport #17822]
Browse files Browse the repository at this point in the history
	Avoid setting the visibility of refinement method entries

	Since refinement search is always performed, these entries should always
	be public. The method entry that the refinement search returns decides
	the visibility.

	Fixes [Bug #17822]
	---
	 test/ruby/test_refinement.rb | 22 ++++++++++++++++++++++
	 vm_method.c                  | 15 ++++++++++-----
	 2 files changed, 32 insertions(+), 5 deletions(-)
  • Loading branch information
nagachika committed May 29, 2021
1 parent d47df50 commit a21ec8d
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 6 deletions.
22 changes: 22 additions & 0 deletions test/ruby/test_refinement.rb
Expand Up @@ -2537,6 +2537,28 @@ def test_redefining_refined_for_prepended_class
assert_equal(:second, klass.new.foo)
end

class Bug17822
module Ext
refine(Bug17822) do
def foo = :refined
end
end

private(def foo = :not_refined)

module Client
using Ext
def self.call_foo
Bug17822.new.foo
end
end
end

# [Bug #17822]
def test_privatizing_refined_method
assert_equal(:refined, Bug17822::Client.call_foo)
end

private

def eval_using(mod, s)
Expand Down
2 changes: 1 addition & 1 deletion version.h
Expand Up @@ -12,7 +12,7 @@
# define RUBY_VERSION_MINOR RUBY_API_VERSION_MINOR
#define RUBY_VERSION_TEENY 2
#define RUBY_RELEASE_DATE RUBY_RELEASE_YEAR_STR"-"RUBY_RELEASE_MONTH_STR"-"RUBY_RELEASE_DAY_STR
#define RUBY_PATCHLEVEL 92
#define RUBY_PATCHLEVEL 93

#define RUBY_RELEASE_YEAR 2021
#define RUBY_RELEASE_MONTH 5
Expand Down
15 changes: 10 additions & 5 deletions vm_method.c
Expand Up @@ -1401,11 +1401,16 @@ rb_export_method(VALUE klass, ID name, rb_method_visibility_t visi)
rb_vm_check_redefinition_opt_method(me, klass);

if (klass == defined_class || origin_class == defined_class) {
METHOD_ENTRY_VISI_SET(me, visi);

if (me->def->type == VM_METHOD_TYPE_REFINED && me->def->body.refined.orig_me) {
METHOD_ENTRY_VISI_SET((rb_method_entry_t *)me->def->body.refined.orig_me, visi);
}
if (me->def->type == VM_METHOD_TYPE_REFINED) {
// Refinement method entries should always be public because the refinement
// search is always performed.
if (me->def->body.refined.orig_me) {
METHOD_ENTRY_VISI_SET((rb_method_entry_t *)me->def->body.refined.orig_me, visi);
}
}
else {
METHOD_ENTRY_VISI_SET(me, visi);
}
rb_clear_method_cache(klass, name);
}
else {
Expand Down

0 comments on commit a21ec8d

Please sign in to comment.