summaryrefslogtreecommitdiff
path: root/yarp
diff options
context:
space:
mode:
authorJemma Issroff <jemmaissroff@gmail.com>2023-09-06 10:28:29 -0400
committerGitHub <noreply@github.com>2023-09-06 10:28:29 -0400
commitae41bdac1ea96de1d75ddf9a4a0ca3dc827a501b (patch)
treebc8f1de85a96e9159c54a4de31cf806451bc7a19 /yarp
parent5537169ef0a8a42f8923a545a1fa6a1768e0f0d6 (diff)
[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
Notes
Notes: Merged-By: jemmaissroff
Diffstat (limited to 'yarp')
-rw-r--r--yarp/yarp_compiler.c63
1 files changed, 40 insertions, 23 deletions
diff --git a/yarp/yarp_compiler.c b/yarp/yarp_compiler.c
index 59a1444f65..a074a1e525 100644
--- a/yarp/yarp_compiler.c
+++ b/yarp/yarp_compiler.c
@@ -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);
}