diff options
author | Jemma Issroff <jemmaissroff@gmail.com> | 2023-09-06 10:28:29 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-06 10:28:29 -0400 |
commit | ae41bdac1ea96de1d75ddf9a4a0ca3dc827a501b (patch) | |
tree | bc8f1de85a96e9159c54a4de31cf806451bc7a19 /yarp | |
parent | 5537169ef0a8a42f8923a545a1fa6a1768e0f0d6 (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.c | 63 |
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); } |