Bug #13776
closedRefined methods ignore visibility of inherited methods
Description
This bug was pointed out by al2o3-cr on the #ruby IRC channel on freenode. The following code sleeps for 3 seconds, even though String#sleep
is a private method.
module Test
refine String do
def sleep; end
end
end
puts "start"
"".sleep 3
puts "end"
This happens because vm_call_method_each_type
, when running a method of type VM_METHOD_TYPE_REFINED
, uses vm_call_zsuper
to call inherited methods, which does not check the visibility of the method and directly executes it. I attached a patch which changes this code path and uses vm_call_method
to trigger the code that honors method visibilities. I have not played extensively with this patch, but it at least does not seem to break any existing unit tests.
Files
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
- Status changed from Open to Closed
Applied in changeset trunk|r59445.
visibility of inherited method
- vm_insnhelper.c (vm_call_method_each_type): honor the original
visibility of inherited methods when a refinement is defined but
not activated. [ruby-core:82209] [Bug #13776]
Author: Mon_Ouie (Mon ouïe) mon.ouie@gmail.com
Updated by nobu (Nobuyoshi Nakada) about 7 years ago
- Description updated (diff)
- Backport changed from 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) over 6 years ago
- Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: REQUIRED to 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE
ruby_2_4 r61436 merged revision(s) 59444,59445.
Updated by usa (Usaku NAKAMURA) over 6 years ago
- Backport changed from 2.2: REQUIRED, 2.3: REQUIRED, 2.4: DONE to 2.2: REQUIRED, 2.3: DONE, 2.4: DONE
ruby_2_3 r62134 merged revision(s) 59444,59445.