diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-01-15 15:08:39 -0500 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2024-01-16 08:32:21 -0500 |
| commit | 0520e9675b91ea559da1ae5eda9db378fbdbca52 (patch) | |
| tree | 42b45a0961f813e43a7c2397c326fb2243564dd5 | |
| parent | d6b6e14c87d5c956dd92287e01d48cf1c2ca4301 (diff) | |
[PRISM] Fix defined? for chained calls
Fixes ruby/prism#2148.
| -rw-r--r-- | prism_compile.c | 6 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 9 |
2 files changed, 13 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c index 38fbbb443a..6a0d56c051 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -2607,8 +2607,10 @@ pm_compile_defined_expr0(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *co pm_compile_defined_expr0(iseq, call_node->receiver, ret, src, popped, scope_node, dummy_line_node, lineno, true, lfinish, true); if (PM_NODE_TYPE_P(call_node->receiver, PM_CALL_NODE)) { ADD_INSNL(ret, &dummy_line_node, branchunless, lfinish[2]); - ID method_id = pm_constant_id_lookup(scope_node, call_node->name); - pm_compile_call(iseq, (const pm_call_node_t *)call_node->receiver, ret, src, popped, scope_node, method_id, NULL); + + const pm_call_node_t *receiver = (const pm_call_node_t *)call_node->receiver; + ID method_id = pm_constant_id_lookup(scope_node, receiver->name); + pm_compile_call(iseq, receiver, ret, src, popped, scope_node, method_id, NULL); } else { ADD_INSNL(ret, &dummy_line_node, branchunless, lfinish[1]); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index b6ff666fb9..3b33908c52 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -209,6 +209,15 @@ module Prism assert_prism_eval("defined?(a(itself))") assert_prism_eval("defined?(itself(itself))") + + # Method chain on a constant + assert_prism_eval(<<~RUBY) + class PrismDefinedNode + def m1; end + end + + defined?(PrismDefinedNode.new.m1) + RUBY end def test_GlobalVariableReadNode |
