Skip to content

Commit e17243d

Browse files
committed
Point keyword->table into iseq local table
1 parent f370a31 commit e17243d

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

compile.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12897,19 +12897,17 @@ ibf_load_param_keyword(const struct ibf_load *load, ibf_offset_t param_keyword_o
1289712897
{
1289812898
if (param_keyword_offset) {
1289912899
struct rb_iseq_param_keyword *kw = IBF_R(param_keyword_offset, struct rb_iseq_param_keyword, 1);
12900-
ID *ids = IBF_R(kw->table, ID, kw->num);
1290112900
int dv_num = kw->num - kw->required_num;
1290212901
VALUE *dvs = dv_num ? IBF_R(kw->default_values, VALUE, dv_num) : NULL;
12903-
int i;
1290412902

12905-
for (i=0; i<kw->num; i++) {
12906-
ids[i] = ibf_load_id(load, ids[i]);
12907-
}
12903+
int i;
1290812904
for (i=0; i<dv_num; i++) {
1290912905
dvs[i] = ibf_load_object(load, dvs[i]);
1291012906
}
1291112907

12912-
kw->table = ids;
12908+
// Will be set once the local table is loaded.
12909+
kw->table = NULL;
12910+
1291312911
kw->default_values = dvs;
1291412912
return kw;
1291512913
}
@@ -13581,6 +13579,13 @@ ibf_load_iseq_each(struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t offset)
1358113579
load_body->local_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)local_iseq_index);
1358213580
load_body->mandatory_only_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)mandatory_only_iseq_index);
1358313581

13582+
// This must be done after the local table is loaded.
13583+
if (load_body->param.keyword != NULL) {
13584+
RUBY_ASSERT(load_body->local_table);
13585+
struct rb_iseq_param_keyword *keyword = (struct rb_iseq_param_keyword *) load_body->param.keyword;
13586+
keyword->table = &load_body->local_table[keyword->bits_start - keyword->num];
13587+
}
13588+
1358413589
ibf_load_code(load, iseq, bytecode_offset, bytecode_size, iseq_size);
1358513590
#if VM_INSN_INFO_TABLE_IMPL == 2
1358613591
rb_iseq_insns_info_encode_positions(iseq);

prism_compile.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)