From 2233204cc17521b960dad8b3758e6e0631a13672 Mon Sep 17 00:00:00 2001 From: Jemma Issroff Date: Wed, 29 Nov 2023 15:50:46 -0500 Subject: [PATCH] [PRISM] Account for ImplicitRestNode Prism introduced a new ImplicitRestNode. This adds tests for the ImplicitRestNode cases, and changes one assert which is no longer accurate. --- prism_compile.c | 5 +---- test/ruby/test_compile_prism.rb | 8 ++++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/prism_compile.c b/prism_compile.c index ab3fc798189946..ca416547bb539c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -3313,14 +3313,11 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, PM_DUP_UNLESS_POPPED; pm_node_t *rest_expression = NULL; - if (multi_write_node->rest) { - RUBY_ASSERT(PM_NODE_TYPE_P(multi_write_node->rest, PM_SPLAT_NODE)); - + if (multi_write_node->rest && PM_NODE_TYPE_P(multi_write_node->rest, PM_SPLAT_NODE)) { pm_splat_node_t *rest_splat = ((pm_splat_node_t *)multi_write_node->rest); rest_expression = rest_splat->expression; } - if (lefts->size) { ADD_INSN2(ret, &dummy_line_node, expandarray, INT2FIX(lefts->size), INT2FIX((int) (bool) (rights->size || rest_expression))); for (size_t index = 0; index < lefts->size; index++) { diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 394f7d26468aa9..7614abb628ee57 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -435,6 +435,7 @@ def test_MultiTargetNode def test_MultiWriteNode assert_prism_eval("foo, bar = [1, 2]") + assert_prism_eval("foo, = [1, 2]") assert_prism_eval("foo, *, bar = [1, 2]") assert_prism_eval("foo, bar = 1, 2") assert_prism_eval("foo, *, bar = 1, 2") @@ -679,8 +680,9 @@ def test_ForNode assert_prism_eval("for @i in [1,2] do; @i; end") assert_prism_eval("for $i in [1,2] do; $i; end") - # TODO: multiple assignment in ForNode index - #assert_prism_eval("for i, j in {a: 'b'} do; i; j; end") + assert_prism_eval("for foo, in [1,2,3] do end") + + assert_prism_eval("for i, j in {a: 'b'} do; i; j; end") end ############################################################################ @@ -766,6 +768,8 @@ def test_BlockNode assert_prism_eval("[1, 2, 3].each { |num| num }") assert_prism_eval("[].tap { _1 }") + + assert_prism_eval("[].each { |a,| }") end def test_ClassNode