aboutsummaryrefslogtreecommitdiffstats
path: root/vm_insnhelper.c
diff options
context:
space:
mode:
authorDylan Thacker-Smith <Dylan.Smith@shopify.com>2019-11-06 01:47:32 -0500
committerNobuyoshi Nakada <nobu@ruby-lang.org>2019-11-13 15:36:58 +0900
commitac112f2b5dc7e16ccde8f048be80946187a033b0 (patch)
tree5ad84ea663becd04e7a77fd6f6cf5f4ea3678a86 /vm_insnhelper.c
parenta5b6d7bca84fce6e13c68e8753893c4697960e3a (diff)
downloadruby-ac112f2b5dc7e16ccde8f048be80946187a033b0.tar.gz
Avoid top-level search for nested constant reference from nil in defined?
Fixes [Bug #16332] Constant access was changed to no longer allow top-level constant access through `nil`, but `defined?` wasn't changed at the same time to stay consistent. Use a separate defined type to distinguish between a constant referenced from the current lexical scope and one referenced from another namespace.
Diffstat (limited to 'vm_insnhelper.c')
-rw-r--r--vm_insnhelper.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index 5c83c343cc..205b4d915f 100644
--- a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -3477,11 +3477,14 @@ vm_defined(rb_execution_context_t *ec, rb_control_frame_t *reg_cfp, rb_num_t op_
break;
}
case DEFINED_CONST:
+ case DEFINED_CONST_FROM: {
+ bool allow_nil = type == DEFINED_CONST;
klass = v;
- if (vm_get_ev_const(ec, klass, SYM2ID(obj), 1, 1)) {
+ if (vm_get_ev_const(ec, klass, SYM2ID(obj), allow_nil, true)) {
expr_type = DEFINED_CONST;
}
break;
+ }
case DEFINED_FUNC:
klass = CLASS_OF(v);
if (rb_method_boundp(klass, SYM2ID(obj), 0)) {