From ae1fad4cd7d88b464aaebad3d5769d27ba675183 Mon Sep 17 00:00:00 2001 From: Jemma Issroff Date: Wed, 8 Nov 2023 12:00:32 -0300 Subject: [PRISM] Implement compilation for ForwardingArgumentssNode --- prism_compile.c | 12 ++++++++++++ test/ruby/test_compile_prism.rb | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/prism_compile.c b/prism_compile.c index b5dc08f074..3f02b858f9 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1413,6 +1413,14 @@ pm_setup_args(pm_arguments_node_t *arguments_node, int *flags, struct rb_callinf break; } + case PM_FORWARDING_ARGUMENTS_NODE: { + orig_argc++; + *flags |= VM_CALL_ARGS_BLOCKARG | VM_CALL_ARGS_SPLAT; + ADD_GETLOCAL(ret, &dummy_line_node, 3, 0); + ADD_INSN1(ret, &dummy_line_node, splatarray, RBOOL(arguments_node_list.size > 1)); + ADD_INSN2(ret, &dummy_line_node, getblockparamproxy, INT2FIX(4), INT2FIX(0)); + break; + } default: { orig_argc++; post_splat_counter++; @@ -2313,6 +2321,10 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, ADD_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l); return; } + case PM_FORWARDING_ARGUMENTS_NODE: { + rb_bug("Should never hit the forwarding arguments case directly\n"); + return; + } case PM_FORWARDING_SUPER_NODE: { pm_forwarding_super_node_t *forwarding_super_node = (pm_forwarding_super_node_t *) node; const rb_iseq_t *block = NULL; diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index aa2dd84600..6656889388 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -861,6 +861,22 @@ module Prism ) end + def test_ForwardingArgumentsNode + assert_prism_eval(<<-CODE) + def prism_test_forwarding_arguments_node(...); end; + def prism_test_forwarding_arguments_node1(...) + prism_test_forwarding_arguments_node(...) + end + CODE + + assert_prism_eval(<<-CODE) + def prism_test_forwarding_arguments_node(...); end; + def prism_test_forwarding_arguments_node1(a, ...) + prism_test_forwarding_arguments_node(1,2, 3, ...) + end + CODE + end + def test_ForwardingSuperNode assert_prism_eval("class Forwarding; def to_s; super; end; end") assert_prism_eval("class Forwarding; def eval(code); super { code }; end; end") -- cgit v1.2.3