[YARP] Use constant_id lookups where possible (#8374)
This commit extracts a `yp_constant_id_lookup` method and uses yp_constant_id_lookup where possible
This commit is contained in:
parent
5537169ef0
commit
ae41bdac1e
Notes:
git
2023-09-06 14:28:49 +00:00
Merged-By: jemmaissroff
@ -359,6 +359,18 @@ yp_lookup_local_index_with_depth(rb_iseq_t *iseq, yp_compile_context_t *compile_
|
||||
return yp_lookup_local_index(iseq, compile_context, constant_id);
|
||||
}
|
||||
|
||||
// This returns the CRuby ID which maps to the yp_constant_id_t
|
||||
//
|
||||
// Constant_ids in YARP are indexes of the constants in YARP's constant pool.
|
||||
// We add a constants mapping on the compile_context which is a mapping from
|
||||
// these constant_id indexes to the CRuby IDs that they represent.
|
||||
// This helper method allows easy access to those IDs
|
||||
static ID
|
||||
yp_constant_id_lookup(yp_compile_context_t *compile_context, yp_constant_id_t constant_id)
|
||||
{
|
||||
return compile_context->constants[constant_id - 1];
|
||||
}
|
||||
|
||||
static rb_iseq_t *
|
||||
yp_new_child_iseq(rb_iseq_t *iseq, yp_scope_node_t * node, yp_parser_t *parser,
|
||||
VALUE name, const rb_iseq_t *parent, enum rb_iseq_type type, int line_no)
|
||||
@ -616,7 +628,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
|
||||
LABEL *end_label = NEW_LABEL(lineno);
|
||||
|
||||
ID class_variable_name_id = compile_context->constants[class_variable_and_write_node->name - 1];
|
||||
ID class_variable_name_id = yp_constant_id_lookup(compile_context, class_variable_and_write_node->name);
|
||||
VALUE class_variable_name_val = ID2SYM(class_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getclassvariable,
|
||||
@ -649,7 +661,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
case YP_NODE_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
|
||||
yp_class_variable_operator_write_node_t *class_variable_operator_write_node = (yp_class_variable_operator_write_node_t*) node;
|
||||
|
||||
ID class_variable_name_id = compile_context->constants[class_variable_operator_write_node->name - 1];
|
||||
ID class_variable_name_id = yp_constant_id_lookup(compile_context, class_variable_operator_write_node->name);
|
||||
VALUE class_variable_name_val = ID2SYM(class_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getclassvariable,
|
||||
@ -657,7 +669,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
get_cvar_ic_value(iseq, class_variable_name_id));
|
||||
|
||||
yp_compile_node(iseq, class_variable_operator_write_node->value, ret, src, false, compile_context);
|
||||
ID method_id = compile_context->constants[class_variable_operator_write_node->operator - 1];
|
||||
ID method_id = yp_constant_id_lookup(compile_context, class_variable_operator_write_node->operator);
|
||||
|
||||
int flags = VM_CALL_ARGS_SIMPLE;
|
||||
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, method_id, INT2NUM(1), INT2FIX(flags));
|
||||
@ -677,7 +689,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
|
||||
LABEL *end_label = NEW_LABEL(lineno);
|
||||
|
||||
ID class_variable_name_id = compile_context->constants[class_variable_or_write_node->name - 1];
|
||||
ID class_variable_name_id = yp_constant_id_lookup(compile_context, class_variable_or_write_node->name);
|
||||
VALUE class_variable_name_val = ID2SYM(class_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getclassvariable,
|
||||
@ -709,7 +721,8 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
}
|
||||
case YP_NODE_CLASS_VARIABLE_READ_NODE: {
|
||||
if (!popped) {
|
||||
ID cvar_name = parse_node_symbol((yp_node_t *)node);
|
||||
yp_class_variable_read_node_t *class_variable_read_node = (yp_class_variable_read_node_t *) node;
|
||||
ID cvar_name = yp_constant_id_lookup(compile_context, class_variable_read_node->name);
|
||||
ADD_INSN2(
|
||||
ret,
|
||||
&dummy_line_node,
|
||||
@ -727,7 +740,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
ADD_INSN(ret, &dummy_line_node, dup);
|
||||
}
|
||||
|
||||
ID cvar_name = parse_location_symbol(&write_node->name_loc);
|
||||
ID cvar_name = yp_constant_id_lookup(compile_context, write_node->name);
|
||||
ADD_INSN2(ret, &dummy_line_node, setclassvariable, ID2SYM(cvar_name), get_cvar_ic_value(iseq, cvar_name));
|
||||
return;
|
||||
}
|
||||
@ -805,7 +818,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
ADD_INSN1(ret, &dummy_line_node, getconstant, ID2SYM(constant_name));
|
||||
|
||||
yp_compile_node(iseq, constant_operator_write_node->value, ret, src, false, compile_context);
|
||||
ID method_id = compile_context->constants[constant_operator_write_node->operator - 1];
|
||||
ID method_id = yp_constant_id_lookup(compile_context, constant_operator_write_node->operator);
|
||||
|
||||
int flags = VM_CALL_ARGS_SIMPLE;
|
||||
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, method_id, INT2NUM(1), INT2FIX(flags));
|
||||
@ -968,7 +981,8 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
|
||||
LABEL *end_label = NEW_LABEL(lineno);
|
||||
|
||||
VALUE global_variable_name = ID2SYM(parse_location_symbol(&global_variable_and_write_node->name_loc));
|
||||
VALUE global_variable_name = ID2SYM(yp_constant_id_lookup(compile_context, global_variable_and_write_node->name));
|
||||
|
||||
ADD_INSN1(ret, &dummy_line_node, getglobal, global_variable_name);
|
||||
|
||||
if (!popped) {
|
||||
@ -995,11 +1009,11 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
case YP_NODE_GLOBAL_VARIABLE_OPERATOR_WRITE_NODE: {
|
||||
yp_global_variable_operator_write_node_t *global_variable_operator_write_node = (yp_global_variable_operator_write_node_t*) node;
|
||||
|
||||
ID global_variable_name = parse_location_symbol(&global_variable_operator_write_node->name_loc);
|
||||
ADD_INSN1(ret, &dummy_line_node, getglobal, ID2SYM(global_variable_name));
|
||||
VALUE global_variable_name = ID2SYM(yp_constant_id_lookup(compile_context, global_variable_operator_write_node->name));
|
||||
ADD_INSN1(ret, &dummy_line_node, getglobal, global_variable_name);
|
||||
|
||||
yp_compile_node(iseq, global_variable_operator_write_node->value, ret, src, false, compile_context);
|
||||
ID method_id = compile_context->constants[global_variable_operator_write_node->operator - 1];
|
||||
ID method_id = yp_constant_id_lookup(compile_context, global_variable_operator_write_node->operator);
|
||||
|
||||
int flags = VM_CALL_ARGS_SIMPLE;
|
||||
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, method_id, INT2NUM(1), INT2FIX(flags));
|
||||
@ -1009,7 +1023,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
ADD_INSN(ret, &dummy_line_node, dup);
|
||||
}
|
||||
|
||||
ADD_INSN1(ret, &dummy_line_node, setglobal, ID2SYM(global_variable_name));
|
||||
ADD_INSN1(ret, &dummy_line_node, setglobal, global_variable_name);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -1020,7 +1034,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 global_variable_name = ID2SYM(parse_location_symbol(&global_variable_or_write_node->name_loc));
|
||||
VALUE global_variable_name = ID2SYM(yp_constant_id_lookup(compile_context, global_variable_or_write_node->name));
|
||||
|
||||
ADD_INSN3(ret, &dummy_line_node, defined, INT2FIX(DEFINED_GVAR), global_variable_name, Qtrue);
|
||||
|
||||
@ -1051,7 +1065,8 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
return;
|
||||
}
|
||||
case YP_NODE_GLOBAL_VARIABLE_READ_NODE: {
|
||||
VALUE global_variable_name = ID2SYM(parse_location_symbol((yp_location_t *)(&node->location)));
|
||||
yp_global_variable_read_node_t *global_variable_read_node = (yp_global_variable_read_node_t *)node;
|
||||
VALUE global_variable_name = ID2SYM(yp_constant_id_lookup(compile_context, global_variable_read_node->name));
|
||||
ADD_INSN1(ret, &dummy_line_node, getglobal, global_variable_name);
|
||||
if (popped) {
|
||||
ADD_INSN(ret, &dummy_line_node, pop);
|
||||
@ -1064,7 +1079,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
if (!popped) {
|
||||
ADD_INSN(ret, &dummy_line_node, dup);
|
||||
}
|
||||
ID ivar_name = parse_location_symbol(&write_node->name_loc);
|
||||
ID ivar_name = yp_constant_id_lookup(compile_context, write_node->name);
|
||||
ADD_INSN1(ret, &dummy_line_node, setglobal, ID2SYM(ivar_name));
|
||||
return;
|
||||
}
|
||||
@ -1116,7 +1131,8 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
|
||||
LABEL *end_label = NEW_LABEL(lineno);
|
||||
|
||||
ID instance_variable_name_id = compile_context->constants[instance_variable_and_write_node->name - 1];
|
||||
ID instance_variable_name_id = yp_constant_id_lookup(compile_context, instance_variable_and_write_node->name);
|
||||
|
||||
VALUE instance_variable_name_val = ID2SYM(instance_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getinstancevariable,
|
||||
@ -1149,7 +1165,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
case YP_NODE_INSTANCE_VARIABLE_OPERATOR_WRITE_NODE: {
|
||||
yp_instance_variable_operator_write_node_t *instance_variable_operator_write_node = (yp_instance_variable_operator_write_node_t*) node;
|
||||
|
||||
ID instance_variable_name_id = compile_context->constants[instance_variable_operator_write_node->name - 1];
|
||||
ID instance_variable_name_id = yp_constant_id_lookup(compile_context, instance_variable_operator_write_node->name);
|
||||
VALUE instance_variable_name_val = ID2SYM(instance_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getinstancevariable,
|
||||
@ -1157,7 +1173,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
get_ivar_ic_value(iseq, instance_variable_name_id));
|
||||
|
||||
yp_compile_node(iseq, instance_variable_operator_write_node->value, ret, src, false, compile_context);
|
||||
ID method_id = compile_context->constants[instance_variable_operator_write_node->operator - 1];
|
||||
ID method_id = yp_constant_id_lookup(compile_context, instance_variable_operator_write_node->operator);
|
||||
|
||||
int flags = VM_CALL_ARGS_SIMPLE;
|
||||
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, method_id, INT2NUM(1), INT2FIX(flags));
|
||||
@ -1177,7 +1193,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
|
||||
LABEL *end_label = NEW_LABEL(lineno);
|
||||
|
||||
ID instance_variable_name_id = compile_context->constants[instance_variable_or_write_node->name - 1];
|
||||
ID instance_variable_name_id = yp_constant_id_lookup(compile_context, instance_variable_or_write_node->name);
|
||||
VALUE instance_variable_name_val = ID2SYM(instance_variable_name_id);
|
||||
|
||||
ADD_INSN2(ret, &dummy_line_node, getinstancevariable,
|
||||
@ -1210,7 +1226,8 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
}
|
||||
case YP_NODE_INSTANCE_VARIABLE_READ_NODE: {
|
||||
if (!popped) {
|
||||
ID ivar_name = parse_node_symbol((yp_node_t *)node);
|
||||
yp_instance_variable_read_node_t *instance_variable_read_node = (yp_instance_variable_read_node_t *) node;
|
||||
ID ivar_name = yp_constant_id_lookup(compile_context, instance_variable_read_node->name);
|
||||
ADD_INSN2(ret, &dummy_line_node, getinstancevariable,
|
||||
ID2SYM(ivar_name),
|
||||
get_ivar_ic_value(iseq, ivar_name));
|
||||
@ -1225,7 +1242,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
ADD_INSN(ret, &dummy_line_node, dup);
|
||||
}
|
||||
|
||||
ID ivar_name = parse_location_symbol(&write_node->name_loc);
|
||||
ID ivar_name = yp_constant_id_lookup(compile_context, write_node->name);
|
||||
ADD_INSN2(ret, &dummy_line_node, setinstancevariable,
|
||||
ID2SYM(ivar_name),
|
||||
get_ivar_ic_value(iseq, ivar_name));
|
||||
@ -1365,7 +1382,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
ADD_GETLOCAL(ret, &dummy_line_node, local_index, depth);
|
||||
|
||||
yp_compile_node(iseq, local_variable_operator_write_node->value, ret, src, false, compile_context);
|
||||
ID method_id = compile_context->constants[local_variable_operator_write_node->operator - 1];
|
||||
ID method_id = yp_constant_id_lookup(compile_context, local_variable_operator_write_node->operator);
|
||||
|
||||
int flags = VM_CALL_ARGS_SIMPLE | VM_CALL_FCALL | VM_CALL_VCALL;
|
||||
ADD_SEND_WITH_FLAG(ret, &dummy_line_node, method_id, INT2NUM(1), INT2FIX(flags));
|
||||
@ -1645,7 +1662,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
|
||||
// Calculate the local index for all locals
|
||||
for (size_t i = 0; i < size; i++) {
|
||||
yp_constant_id_t constant_id = locals.ids[i];
|
||||
ID local = compile_context->constants[constant_id - 1];
|
||||
ID local = yp_constant_id_lookup(compile_context, constant_id);
|
||||
tbl->ids[i] = local;
|
||||
st_insert(index_lookup_table, constant_id, i);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user