aboutsummaryrefslogtreecommitdiffstats
path: root/variable.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2023-04-19 11:40:16 +0900
committerKoichi Sasada <ko1@atdot.net>2023-04-19 14:53:56 +0900
commit628e432739e1d2578d357420aa652a97eb8c2649 (patch)
tree6916e2f32267e3b80c17e98ca03b08b46a9d773b /variable.c
parent62781d479b5fd5a506bb6de602edefa797551a82 (diff)
downloadruby-628e432739e1d2578d357420aa652a97eb8c2649.tar.gz
fix `NameError` message
The following code produces two NameErrors respectively and they are independent, but the second one can show `private constant` message because of first NameError. ```ruby class C class PrivateClass; end private_constant :PrivateClass end begin eval('class C::PrivateClass; end') rescue => e p e end begin Object.const_get 'Foo' rescue => e p e end #<NameError: private constant C::PrivateClass referenced> #<NameError: private constant C::Foo referenced> #=> should be #<NameError: uninitialized constant Foo> ``` It fails the test-all tests with `make test-all TESTS='ruby/class ruby/parse --seed=58891 -v`. The reason is clear miss from https://github.com/ruby/ruby/commit/7387c08373a
Diffstat (limited to 'variable.c')
-rw-r--r--variable.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/variable.c b/variable.c
index 39568db24a..e8a66b0c36 100644
--- a/variable.c
+++ b/variable.c
@@ -2073,11 +2073,12 @@ rb_const_missing(VALUE klass, VALUE name)
VALUE
rb_mod_const_missing(VALUE klass, VALUE name)
{
- VALUE ref = GET_EC()->private_const_reference;
+ rb_execution_context_t *ec = GET_EC();
+ VALUE ref = ec->private_const_reference;
rb_vm_pop_cfunc_frame();
if (ref) {
- rb_name_err_raise("private constant %2$s::%1$s referenced",
- ref, name);
+ ec->private_const_reference = 0;
+ rb_name_err_raise("private constant %2$s::%1$s referenced", ref, name);
}
uninitialized_constant(klass, name);