summaryrefslogtreecommitdiff
path: root/vm_method.c
diff options
context:
space:
mode:
authornagachika <nagachika@ruby-lang.org>2021-05-29 14:36:28 +0900
committernagachika <nagachika@ruby-lang.org>2021-05-29 14:36:28 +0900
commita21ec8d1ecc6e978ea6b18a27046c424e2849752 (patch)
treecfd0e983bbfede508a5cc68a139b1da7f82f4c7a /vm_method.c
parentd47df50678b00bd622e6be474031204ed2e52b31 (diff)
merge revision(s) 636d4f7eb9f3fcb088e1a44af4181c4aa36789b4: [Backport #17822]
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(-)
Diffstat (limited to 'vm_method.c')
-rw-r--r--vm_method.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/vm_method.c b/vm_method.c
index a467ac173c..e55fc4697c 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -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 {