diff options
| author | Peter Zhu <peter@peterzhu.ca> | 2024-01-29 16:35:54 -0500 |
|---|---|---|
| committer | Peter Zhu <peter@peterzhu.ca> | 2024-01-29 17:15:33 -0500 |
| commit | bbb7ab906ec64b963bd4b5d37e47b14796d64371 (patch) | |
| tree | ec2db3d48ecedc31dad927dff8ebd2f93e947958 | |
| parent | 4cf3c026de54499e79f61ae284b834565a6706e4 (diff) | |
[PRISM] Fix crash when multiple underscores
Fixes ruby/prism#2295.
| -rw-r--r-- | prism_compile.c | 6 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 5 |
2 files changed, 9 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c index c4fe029dcb..baab1a55fc 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -2881,8 +2881,10 @@ pm_compile_destructured_param_locals(const pm_multi_target_node_t *node, st_tabl const pm_node_t *left = node->lefts.nodes[index]; if (PM_NODE_TYPE_P(left, PM_REQUIRED_PARAMETER_NODE)) { - pm_insert_local_index(((const pm_required_parameter_node_t *) left)->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); - local_index++; + if (!PM_NODE_FLAG_P(left, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + pm_insert_local_index(((const pm_required_parameter_node_t *) left)->name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + local_index++; + } } else { RUBY_ASSERT(PM_NODE_TYPE_P(left, PM_MULTI_TARGET_NODE)); local_index = pm_compile_destructured_param_locals((const pm_multi_target_node_t *) left, index_lookup_table, local_table_for_iseq, scope_node, local_index); diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 48912c31f6..901cc0741e 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -2203,6 +2203,11 @@ end assert_prism_eval("Object.tap { || }") assert_prism_eval("[1].map { |num| num }") assert_prism_eval("[1].map { |a; b| b = 2; a + b}") + + # Test block parameters with multiple _ + assert_prism_eval(<<~RUBY) + [[1, 2, 3, 4, 5, 6]].map { |(_, _, _, _, _, _)| _ } + RUBY end def test_FowardingParameterNode |
