Point keyword->table into iseq local table
This commit is contained in:
parent
f370a31578
commit
e17243d325
Notes:
git
2024-10-18 18:16:21 +00:00
17
compile.c
17
compile.c
@ -12897,19 +12897,17 @@ ibf_load_param_keyword(const struct ibf_load *load, ibf_offset_t param_keyword_o
|
||||
{
|
||||
if (param_keyword_offset) {
|
||||
struct rb_iseq_param_keyword *kw = IBF_R(param_keyword_offset, struct rb_iseq_param_keyword, 1);
|
||||
ID *ids = IBF_R(kw->table, ID, kw->num);
|
||||
int dv_num = kw->num - kw->required_num;
|
||||
VALUE *dvs = dv_num ? IBF_R(kw->default_values, VALUE, dv_num) : NULL;
|
||||
int i;
|
||||
|
||||
for (i=0; i<kw->num; i++) {
|
||||
ids[i] = ibf_load_id(load, ids[i]);
|
||||
}
|
||||
int i;
|
||||
for (i=0; i<dv_num; i++) {
|
||||
dvs[i] = ibf_load_object(load, dvs[i]);
|
||||
}
|
||||
|
||||
kw->table = ids;
|
||||
// Will be set once the local table is loaded.
|
||||
kw->table = NULL;
|
||||
|
||||
kw->default_values = dvs;
|
||||
return kw;
|
||||
}
|
||||
@ -13581,6 +13579,13 @@ ibf_load_iseq_each(struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t offset)
|
||||
load_body->local_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)local_iseq_index);
|
||||
load_body->mandatory_only_iseq = ibf_load_iseq(load, (const rb_iseq_t *)(VALUE)mandatory_only_iseq_index);
|
||||
|
||||
// This must be done after the local table is loaded.
|
||||
if (load_body->param.keyword != NULL) {
|
||||
RUBY_ASSERT(load_body->local_table);
|
||||
struct rb_iseq_param_keyword *keyword = (struct rb_iseq_param_keyword *) load_body->param.keyword;
|
||||
keyword->table = &load_body->local_table[keyword->bits_start - keyword->num];
|
||||
}
|
||||
|
||||
ibf_load_code(load, iseq, bytecode_offset, bytecode_size, iseq_size);
|
||||
#if VM_INSN_INFO_TABLE_IMPL == 2
|
||||
rb_iseq_insns_info_encode_positions(iseq);
|
||||
|
@ -6062,17 +6062,12 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
|
||||
// ^^^^^^^^
|
||||
// Keywords create an internal variable on the parse tree
|
||||
if (keywords_list && keywords_list->size) {
|
||||
body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
|
||||
keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
|
||||
keyword->num = (int) keywords_list->size;
|
||||
|
||||
body->param.flags.has_kw = true;
|
||||
const VALUE default_values = rb_ary_hidden_new(1);
|
||||
const VALUE complex_mark = rb_str_tmp_new(0);
|
||||
|
||||
ID *ids = xcalloc(keywords_list->size, sizeof(ID));
|
||||
|
||||
size_t kw_index = 0;
|
||||
|
||||
for (size_t i = 0; i < keywords_list->size; i++) {
|
||||
pm_node_t *keyword_parameter_node = keywords_list->nodes[i];
|
||||
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
|
||||
pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node);
|
||||
}
|
||||
local_index++;
|
||||
ids[kw_index++] = local;
|
||||
}
|
||||
}
|
||||
|
||||
@ -6121,15 +6115,11 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
|
||||
else {
|
||||
pm_insert_local_index(name, local_index, index_lookup_table, local_table_for_iseq, scope_node);
|
||||
}
|
||||
ids[kw_index++] = local;
|
||||
local_index++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
keyword->bits_start = local_index;
|
||||
keyword->table = ids;
|
||||
|
||||
if (RARRAY_LEN(default_values)) {
|
||||
VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values));
|
||||
|
||||
@ -6143,9 +6133,13 @@ pm_compile_scope_node(rb_iseq_t *iseq, pm_scope_node_t *scope_node, const pm_nod
|
||||
}
|
||||
|
||||
// Hidden local for keyword arguments
|
||||
keyword->bits_start = local_index;
|
||||
ID local = rb_make_temporary_id(local_index);
|
||||
local_table_for_iseq->ids[local_index] = local;
|
||||
local_index++;
|
||||
|
||||
body->param.keyword = keyword;
|
||||
body->param.flags.has_kw = true;
|
||||
}
|
||||
|
||||
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
|
||||
iseq_set_local_table(iseq, local_table_for_iseq, 0);
|
||||
scope_node->local_table_for_iseq_size = local_table_for_iseq->size;
|
||||
|
||||
if (keyword != NULL) {
|
||||
size_t keyword_start_index = keyword->bits_start - keyword->num;
|
||||
keyword->table = (ID *)&ISEQ_BODY(iseq)->local_table[keyword_start_index];
|
||||
}
|
||||
|
||||
//********STEP 5************
|
||||
// Goal: compile anything that needed to be compiled
|
||||
if (optionals_list && optionals_list->size) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user