summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2024-01-23 13:55:46 -0800
committerAaron Patterson <aaron.patterson@gmail.com>2024-01-24 12:04:44 -0800
commit94f3f9502c4b0a87392f85672cbc01c7167207d5 (patch)
tree04305292a8f02b39424296cc8eec9b226187b576
parent1817af507466ace78f4bc02d77e1f16c70e3a087 (diff)
Fix repeated block param
Co-Authored-By: Matt Valentine-House <matt@eightbitraptor.com>
-rw-r--r--prism_compile.c16
-rw-r--r--test/ruby/test_compile_prism.rb4
2 files changed, 18 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c
index 2f9de3e63a..352bcc23a2 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -6399,6 +6399,12 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
table_size++;
}
+ if (parameters_node && parameters_node->block) {
+ if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
+ table_size++;
+ }
+ }
+
// When we have a `...` as the keyword_rest, it's a forwarding_parameter_node and
// we need to leave space for 2 more locals on the locals table (`*` and `&`)
if (parameters_node && parameters_node->keyword_rest &&
@@ -6747,14 +6753,20 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
body->param.flags.has_block = true;
pm_constant_id_t name = ((pm_block_parameter_node_t *)parameters_node->block)->name;
+
if (name == 0) {
local_table_for_iseq->ids[local_index] = PM_CONSTANT_AND;
st_insert(index_lookup_table, PM_CONSTANT_AND, local_index);
}
else {
- pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node);
+ if (PM_NODE_FLAG_P(parameters_node->block, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) {
+ ID local = pm_constant_id_lookup(scope_node, name);
+ local_table_for_iseq->ids[local_index] = local;
+ }
+ else {
+ pm_insert_local_index(name, local_index, 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 d122969cd3..7542f0e220 100644
--- a/test/ruby/test_compile_prism.rb
+++ b/test/ruby/test_compile_prism.rb
@@ -1545,6 +1545,10 @@ a
CODE
end
+ def test_repeated_block_underscore
+ assert_prism_eval("def self.m(_, **_, &_); _; end; method(:m).parameters")
+ end
+
def test_repeated_kw_rest_underscore
assert_prism_eval("def self.m(_, **_); _; end; method(:m).parameters")
end