summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Zhu <peter@peterzhu.ca>2024-01-29 16:35:54 -0500
committerPeter Zhu <peter@peterzhu.ca>2024-01-29 17:15:33 -0500
commitbbb7ab906ec64b963bd4b5d37e47b14796d64371 (patch)
treeec2db3d48ecedc31dad927dff8ebd2f93e947958
parent4cf3c026de54499e79f61ae284b834565a6706e4 (diff)
[PRISM] Fix crash when multiple underscores
Fixes ruby/prism#2295.
-rw-r--r--prism_compile.c6
-rw-r--r--test/ruby/test_compile_prism.rb5
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