Use constant lookup for constant names

This commit is contained in:
Kevin Newton 2023-09-11 14:36:09 -04:00
Родитель bfc82fe1d3
Коммит aa69bd841a
1 изменённых файлов: 11 добавлений и 14 удалений

Просмотреть файл

@ -124,11 +124,6 @@ parse_symbol(const uint8_t *start, const uint8_t *end)
return rb_intern2((const char *) start, end - start);
}
static inline ID
parse_node_symbol(yp_node_t *node) {
return parse_symbol(node->location.start, node->location.end);
}
static inline ID
parse_string_symbol(yp_string_t *string) {
const uint8_t *start = yp_string_source(string);
@ -862,7 +857,11 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
YP_COMPILE(constant_path_node->parent);
}
ADD_INSN1(ret, &dummy_line_node, putobject, Qfalse);
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(parse_node_symbol((yp_node_t *)constant_path_node->child)));
assert(YP_NODE_TYPE_P(constant_path_node->child, YP_CONSTANT_READ_NODE));
yp_constant_read_node_t *child = (yp_constant_read_node_t *) constant_path_node->child;
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(yp_constant_id_lookup(compile_context, child->name)));
return;
}
case YP_CONSTANT_PATH_WRITE_NODE: {
@ -878,12 +877,11 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
ADD_INSN1(ret, &dummy_line_node, setconstant, ID2SYM(constant_var_name));
return;
}
case YP_CONSTANT_READ_NODE: {
yp_constant_read_node_t *constant_read_node = (yp_constant_read_node_t *) node;
ADD_INSN(ret, &dummy_line_node, putnil);
ADD_INSN1(ret, &dummy_line_node, putobject, Qtrue);
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(parse_node_symbol((yp_node_t *)constant_read_node)));
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(yp_constant_id_lookup(compile_context, constant_read_node->name)));
if (popped) {
ADD_INSN(ret, &dummy_line_node, pop);
}
@ -894,7 +892,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
LABEL *end_label = NEW_LABEL(lineno);
VALUE constant_name = ID2SYM(parse_location_symbol(&constant_and_write_node->name_loc));
VALUE constant_name = ID2SYM(yp_constant_id_lookup(compile_context, constant_and_write_node->name));
ADD_INSN(ret, &dummy_line_node, putnil);
ADD_INSN1(ret, &dummy_line_node, putobject, Qtrue);
@ -924,7 +922,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
case YP_CONSTANT_OPERATOR_WRITE_NODE: {
yp_constant_operator_write_node_t *constant_operator_write_node = (yp_constant_operator_write_node_t*) node;
ID constant_name = parse_location_symbol(&constant_operator_write_node->name_loc);
ID constant_name = yp_constant_id_lookup(compile_context, constant_operator_write_node->name);
ADD_INSN(ret, &dummy_line_node, putnil);
ADD_INSN1(ret, &dummy_line_node, putobject, Qtrue);
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(constant_name));
@ -952,7 +950,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
LABEL *end_label = NEW_LABEL(lineno);
ADD_INSN(ret, &dummy_line_node, putnil);
VALUE constant_name = ID2SYM(parse_location_symbol(&constant_or_write_node->name_loc));
VALUE constant_name = ID2SYM(yp_constant_id_lookup(compile_context, constant_or_write_node->name));
ADD_INSN3(ret, &dummy_line_node, defined, INT2FIX(DEFINED_CONST), constant_name, Qtrue);
@ -994,13 +992,12 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
}
ADD_INSN1(ret, &dummy_line_node, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CONST_BASE));
ID constant_name = parse_location_symbol(&constant_write_node->name_loc);
ADD_INSN1(ret, &dummy_line_node, setconstant, ID2SYM(constant_name));
ADD_INSN1(ret, &dummy_line_node, setconstant, ID2SYM(yp_constant_id_lookup(compile_context, constant_write_node->name)));
return;
}
case YP_DEF_NODE: {
yp_def_node_t *def_node = (yp_def_node_t *) node;
ID method_name = parse_location_symbol(&def_node->name_loc);
ID method_name = yp_constant_id_lookup(compile_context, def_node->name);
yp_scope_node_t scope_node;
yp_scope_node_init((yp_node_t *)def_node, &scope_node);
rb_iseq_t *method_iseq = NEW_ISEQ(&scope_node, rb_id2str(method_name), ISEQ_TYPE_METHOD, lineno);