From f9e34a1fd3387822903ff7a63405bf116e0c9803 Mon Sep 17 00:00:00 2001 From: Jemma Issroff Date: Wed, 8 Nov 2023 14:49:58 -0300 Subject: [PRISM] Add tests for OptionalKeywordParameterNode This commit adds tests for the compilation of the OptionalKeywordParameterNode, and fixes cases on the RequiredKeywordParameterNode --- prism_compile.c | 19 +++++++++++++++++++ test/ruby/test_compile_prism.rb | 4 ++++ 2 files changed, 23 insertions(+) diff --git a/prism_compile.c b/prism_compile.c index 7bbc521a9d..595b36f1e7 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -684,6 +684,7 @@ pm_interpolated_node_compile(pm_node_list_t parts, rb_iseq_t *iseq, NODE dummy_l PM_PUTNIL; } } + static int pm_lookup_local_index(rb_iseq_t *iseq, pm_scope_node_t *scope_node, pm_constant_id_t constant_id) { @@ -3360,6 +3361,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, const VALUE default_values = rb_ary_hidden_new(1); const VALUE complex_mark = rb_str_tmp_new(0); + ID *ids = calloc(keywords_list->size, sizeof(ID)); + for (size_t i = 0; i < keywords_list->size; i++) { pm_node_t *keyword_parameter_node = keywords_list->nodes[i]; @@ -3378,6 +3381,8 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, break; } case PM_REQUIRED_KEYWORD_PARAMETER_NODE: { + pm_required_keyword_parameter_node_t *cast = (pm_required_keyword_parameter_node_t *)keyword_parameter_node; + ids[keyword->required_num] = pm_constant_id_lookup(scope_node, cast->name); keyword->required_num++; break; } @@ -3386,6 +3391,20 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret, } } } + + VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values)); + + for (int i = 0; i < RARRAY_LEN(default_values); i++) { + VALUE dv = RARRAY_AREF(default_values, i); + if (dv == complex_mark) dv = Qundef; + if (!SPECIAL_CONST_P(dv)) { + RB_OBJ_WRITTEN(iseq, Qundef, dv); + } + dvs[i] = dv; + } + + keyword->default_values = dvs; + keyword->table = ids; } if (parameters_node) { diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index 2661bd5bea..aa2dd84600 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -917,6 +917,10 @@ module Prism assert_prism_eval("def prism_test_optional_param_node(bar = nil); end") end + def test_OptionalKeywordParameterNode + assert_prism_eval("def prism_test_optional_keyword_param_node(bar: nil); end") + end + def test_ParametersNode assert_prism_eval("def prism_test_parameters_node(bar, baz); end") assert_prism_eval("def prism_test_parameters_node(a, b = 2); end") -- cgit v1.2.3