[PRISM] Implement CallNodes with splat followed by args

This commit is contained in:
Jemma Issroff 2023-11-29 14:58:26 -05:00
Родитель 2233204cc1
Коммит 853fd44745
2 изменённых файлов: 20 добавлений и 5 удалений

Просмотреть файл

@ -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;
}
}
}

Просмотреть файл

@ -935,12 +935,19 @@ module Prism
# 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