Skip to content

Commit

Permalink
[YARP] Use constant_id lookups where possible (#8374)
Browse files Browse the repository at this point in the history
This commit extracts a `yp_constant_id_lookup` method and uses yp_constant_id_lookup where possible
  • Loading branch information
jemmaissroff committed Sep 6, 2023
1 parent 5537169 commit ae41bda
Showing 1 changed file with 40 additions and 23 deletions.
63 changes: 40 additions & 23 deletions yarp/yarp_compiler.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -649,15 +661,15 @@ 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,
class_variable_name_val,
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));
Expand All @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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;
}
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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) {
Expand All @@ -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));
Expand All @@ -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;
}
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -1149,15 +1165,15 @@ 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,
instance_variable_name_val,
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));
Expand All @@ -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,
Expand Down Expand Up @@ -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));
Expand All @@ -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));
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit ae41bda

Please sign in to comment.