diff options
| author | Aaron Patterson <tenderlove@ruby-lang.org> | 2024-01-23 13:55:46 -0800 |
|---|---|---|
| committer | Aaron Patterson <aaron.patterson@gmail.com> | 2024-01-24 12:04:44 -0800 |
| commit | 94f3f9502c4b0a87392f85672cbc01c7167207d5 (patch) | |
| tree | 04305292a8f02b39424296cc8eec9b226187b576 | |
| parent | 1817af507466ace78f4bc02d77e1f16c70e3a087 (diff) | |
Fix repeated block param
Co-Authored-By: Matt Valentine-House <matt@eightbitraptor.com>
| -rw-r--r-- | prism_compile.c | 16 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 4 |
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 |
