diff options
| author | Aaron Patterson <tenderlove@ruby-lang.org> | 2024-01-23 13:41:34 -0800 |
|---|---|---|
| committer | Aaron Patterson <aaron.patterson@gmail.com> | 2024-01-24 12:04:44 -0800 |
| commit | 13c76e40d3cbd79ccd8d340fa8b85f5778484f20 (patch) | |
| tree | 3d99ba5df50a15e54c7a23ca46310d97ba6f64fd | |
| parent | 8b7e78f156fb566b47ea3ff7701e18486b0e2dac (diff) | |
Fix local table size and variable offset for repeated keywords
Co-Authored-By: Matt Valentine-House <matt@eightbitraptor.com>
| -rw-r--r-- | prism_compile.c | 24 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 5 |
2 files changed, 27 insertions, 2 deletions
diff --git a/prism_compile.c b/prism_compile.c index e15d0627ed..0e30dc9c9c 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -6378,6 +6378,15 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } } + if (keywords_list && keywords_list->size) { + for (size_t i = 0; i < keywords_list->size; i++) { + pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + table_size++; + } + } + } + if (block_param_keyword_rest) { table_size++; } @@ -6583,7 +6592,13 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, name = ((pm_required_keyword_parameter_node_t *)keyword_parameter_node)->name; keyword->required_num++; ID local = pm_constant_id_lookup(scope_node, name); - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + 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++; ids[kw_index++] = local; } @@ -6613,7 +6628,12 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } ID local = pm_constant_id_lookup(scope_node, name); - pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node); + if (PM_NODE_FLAG_P(keyword_parameter_node, PM_PARAMETER_FLAGS_REPEATED_PARAMETER)) { + 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); + } ids[kw_index++] = local; local_index++; } diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index e9bf819ea6..a5ab94cbc1 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -1545,6 +1545,11 @@ a CODE end + def test_repeated_required_keyword_underscore + assert_prism_eval("def self.m(_, _, *_, _, _:); _; end; method(:m).parameters") + assert_prism_eval("def self.m(_, _, *_, _, _:, _: 2); _; end; method(:m).parameters") + end + def test_repeated_required_post_underscore assert_prism_eval("def self.m(_, _, *_, _); _; end; method(:m).parameters") end |
