summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-01-15 15:08:39 -0500
committerPeter Zhu <peter@peterzhu.ca>2024-01-16 08:32:21 -0500
commit0520e9675b91ea559da1ae5eda9db378fbdbca52 (patch)
tree42b45a0961f813e43a7c2397c326fb2243564dd5
parentd6b6e14c87d5c956dd92287e01d48cf1c2ca4301 (diff)
[PRISM] Fix defined? for chained calls
Fixes ruby/prism#2148.
-rw-r--r--prism_compile.c6
-rw-r--r--test/ruby/test_compile_prism.rb9
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