diff options
author | Koichi Sasada <ko1@atdot.net> | 2023-04-19 11:40:16 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2023-04-19 14:53:56 +0900 |
commit | 628e432739e1d2578d357420aa652a97eb8c2649 (patch) | |
tree | 6916e2f32267e3b80c17e98ca03b08b46a9d773b /variable.c | |
parent | 62781d479b5fd5a506bb6de602edefa797551a82 (diff) |
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
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/7736
Diffstat (limited to 'variable.c')
-rw-r--r-- | variable.c | 7 |
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); |