@@ -6062,17 +6062,12 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
60626062 // ^^^^^^^^
60636063 // Keywords create an internal variable on the parse tree
60646064 if (keywords_list && keywords_list -> size ) {
6065- body -> param . keyword = keyword = ZALLOC_N (struct rb_iseq_param_keyword , 1 );
6065+ keyword = ZALLOC_N (struct rb_iseq_param_keyword , 1 );
60666066 keyword -> num = (int ) keywords_list -> size ;
60676067
6068- body -> param .flags .has_kw = true;
60696068 const VALUE default_values = rb_ary_hidden_new (1 );
60706069 const VALUE complex_mark = rb_str_tmp_new (0 );
60716070
6072- ID * ids = xcalloc (keywords_list -> size , sizeof (ID ));
6073-
6074- size_t kw_index = 0 ;
6075-
60766071 for (size_t i = 0 ; i < keywords_list -> size ; i ++ ) {
60776072 pm_node_t * keyword_parameter_node = keywords_list -> nodes [i ];
60786073 pm_constant_id_t name ;
@@ -6091,7 +6086,6 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
60916086 pm_insert_local_index (name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
60926087 }
60936088 local_index ++ ;
6094- ids [kw_index ++ ] = local ;
60956089 }
60966090 }
60976091
@@ -6121,15 +6115,11 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
61216115 else {
61226116 pm_insert_local_index (name , local_index , index_lookup_table , local_table_for_iseq , scope_node );
61236117 }
6124- ids [kw_index ++ ] = local ;
61256118 local_index ++ ;
61266119 }
61276120
61286121 }
61296122
6130- keyword -> bits_start = local_index ;
6131- keyword -> table = ids ;
6132-
61336123 if (RARRAY_LEN (default_values )) {
61346124 VALUE * dvs = ALLOC_N (VALUE , RARRAY_LEN (default_values ));
61356125
@@ -6143,9 +6133,13 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
61436133 }
61446134
61456135 // Hidden local for keyword arguments
6136+ keyword -> bits_start = local_index ;
61466137 ID local = rb_make_temporary_id (local_index );
61476138 local_table_for_iseq -> ids [local_index ] = local ;
61486139 local_index ++ ;
6140+
6141+ body -> param .keyword = keyword ;
6142+ body -> param .flags .has_kw = true;
61496143 }
61506144
61516145 if (body -> type == ISEQ_TYPE_BLOCK && local_index == 1 && requireds_list && requireds_list -> size == 1 && !trailing_comma ) {
@@ -6372,6 +6366,11 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
63726366 iseq_set_local_table (iseq , local_table_for_iseq , 0 );
63736367 scope_node -> local_table_for_iseq_size = local_table_for_iseq -> size ;
63746368
6369+ if (keyword != NULL ) {
6370+ size_t keyword_start_index = keyword -> bits_start - keyword -> num ;
6371+ keyword -> table = (ID * )& ISEQ_BODY (iseq )-> local_table [keyword_start_index ];
6372+ }
6373+
63756374 //********STEP 5************
63766375 // Goal: compile anything that needed to be compiled
63776376 if (optionals_list && optionals_list -> size ) {
0 commit comments