aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJemma Issroff <jemmaissroff@gmail.com>2023-11-08 14:49:58 -0300
committerJemma Issroff <jemmaissroff@gmail.com>2023-11-08 18:15:47 -0300
commitf9e34a1fd3387822903ff7a63405bf116e0c9803 (patch)
treed63d317bad1050e5fde4df14d895d434322b1d9b
parent70e4ff9feb9e5f7254f9dbe955dedbf56e73c8d5 (diff)
downloadruby-f9e34a1fd3387822903ff7a63405bf116e0c9803.tar.gz
[PRISM] Add tests for OptionalKeywordParameterNode
This commit adds tests for the compilation of the OptionalKeywordParameterNode, and fixes cases on the RequiredKeywordParameterNode
-rw-r--r--prism_compile.c19
-rw-r--r--test/ruby/test_compile_prism.rb4
2 files changed, 23 insertions, 0 deletions
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")