Skip to content

Commit

Permalink
[PRISM] Implement CallNodes with splat followed by args
Browse files Browse the repository at this point in the history
  • Loading branch information
jemmaissroff committed Nov 29, 2023
1 parent 2233204 commit 853fd44
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 5 deletions.
12 changes: 10 additions & 2 deletions prism_compile.c
Expand Up @@ -1022,8 +1022,16 @@ pm_setup_args(pm_arguments_node_t *arguments_node, int *flags, struct rb_callinf
}
// If it's the final node
else if (index == arguments_node_list.size - 1) {
ADD_INSN1(ret, &dummy_line_node, newarray, INT2FIX(post_splat_counter));
ADD_INSN(ret, &dummy_line_node, concatarray);
if (post_splat_counter > 1) {
ADD_INSN1(ret, &dummy_line_node, newarray, INT2FIX(post_splat_counter));
ADD_INSN1(ret, &dummy_line_node, splatarray, Qfalse);
ADD_INSN(ret, &dummy_line_node, concatarray);
}
else {
ADD_INSN1(ret, &dummy_line_node, newarray, INT2FIX(post_splat_counter));
ADD_INSN(ret, &dummy_line_node, concatarray);
}
orig_argc = 1;
}
}
}
Expand Down
13 changes: 10 additions & 3 deletions test/ruby/test_compile_prism.rb
Expand Up @@ -935,12 +935,19 @@ def test_CallNode

# With different types of calling arguments
assert_prism_eval(<<-CODE)
def self.prism_test_call_node(**); end
prism_test_call_node(b: 1, **{})
def self.prism_test_call_node_double_splat(**); end
prism_test_call_node_double_splat(b: 1, **{})
CODE
assert_prism_eval(<<-CODE)
prism_test_call_node(:b => 1)
prism_test_call_node_double_splat(:b => 1)
CODE

assert_prism_eval(<<-CODE)
def self.prism_test_call_node_splat(*); end
prism_test_call_node_splat(*[], 1)
CODE

assert_prism_eval("prism_test_call_node_splat(*[], 1, 2)")
end

def test_CallAndWriteNode
Expand Down

0 comments on commit 853fd44

Please sign in to comment.