[YARP] Miscellaneous bug fixes (#8453)

Miscellaneous bug fixes
This commit is contained in:
Jemma Issroff 2023-09-18 09:29:52 -04:00 committed by GitHub
parent c87f2a4f15
commit c492a7f877
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -151,11 +151,7 @@ yp_static_node_literal_p(yp_node_t *node)
case YP_INTEGER_NODE:
case YP_NIL_NODE:
case YP_RATIONAL_NODE:
case YP_SELF_NODE:
case YP_STRING_NODE:
case YP_SOURCE_ENCODING_NODE:
case YP_SOURCE_FILE_NODE:
case YP_SOURCE_LINE_NODE:
case YP_SYMBOL_NODE:
case YP_TRUE_NODE:
return true;
@ -168,12 +164,24 @@ static inline VALUE
yp_static_literal_value(yp_node_t *node)
{
switch(YP_NODE_TYPE(node)) {
case YP_NIL_NODE:
return Qnil;
case YP_TRUE_NODE:
return Qtrue;
case YP_FALSE_NODE:
return Qfalse;
case YP_FLOAT_NODE:
return parse_float(node);
case YP_IMAGINARY_NODE:
return parse_imaginary((yp_imaginary_node_t *)node);
case YP_INTEGER_NODE:
return parse_integer(node);
case YP_NIL_NODE:
return Qnil;
case YP_RATIONAL_NODE:
return parse_rational(node);
case YP_STRING_NODE:
return parse_string(&((yp_string_node_t *)node)->unescaped);
case YP_SYMBOL_NODE:
return ID2SYM(parse_string_symbol(&((yp_symbol_node_t *)node)->unescaped));
case YP_TRUE_NODE:
return Qtrue;
// TODO: Implement this method for the other literal nodes described above
default:
rb_raise(rb_eArgError, "Don't have a literal value for this type");
@ -296,6 +304,9 @@ yp_compile_if(rb_iseq_t *iseq, const int line, yp_statements_node_t *node_body,
INIT_ANCHOR(then_seq);
if (node_body) {
yp_compile_node(iseq, (yp_node_t *)node_body, then_seq, src, popped, compile_context);
if (popped) {
ADD_INSN(ret, &line_node, pop);
}
}
else {
if (!popped) {
@ -334,9 +345,6 @@ yp_compile_if(rb_iseq_t *iseq, const int line, yp_statements_node_t *node_body,
ADD_LABEL(ret, end_label);
}
if (popped) {
ADD_INSN(ret, &line_node, pop);
}
return;
}
@ -427,10 +435,13 @@ yp_interpolated_node_compile(yp_node_list_t parts, rb_iseq_t *iseq, NODE dummy_l
ADD_INSN1(ret, &dummy_line_node, putobject, parse_string(&string_node->unescaped));
}
else {
YP_COMPILE(part);
YP_COMPILE_NOT_POPPED(part);
ADD_INSN(ret, &dummy_line_node, dup);
ADD_INSN1(ret, &dummy_line_node, objtostring, new_callinfo(iseq, idTo_s, 0, VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE , NULL, FALSE));
ADD_INSN(ret, &dummy_line_node, anytostring);
if (popped) {
ADD_INSN(ret, &dummy_line_node, pop);
}
}
}
}
@ -550,7 +561,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
yp_and_node_t *and_node = (yp_and_node_t *) node;
LABEL *end_label = NEW_LABEL(lineno);
YP_COMPILE(and_node->left);
YP_COMPILE_NOT_POPPED(and_node->left);
if (!popped) {
ADD_INSN(ret, &dummy_line_node, dup);
}
@ -574,7 +585,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
case YP_ARRAY_NODE: {
yp_array_node_t *array_node = (yp_array_node_t *) node;
yp_node_list_t elements = array_node->elements;
if (elements.size == 1 && yp_static_node_literal_p(elements.nodes[0])) {
if (elements.size == 1 && yp_static_node_literal_p(elements.nodes[0]) && !popped) {
VALUE ary = rb_ary_hidden_new(1);
rb_ary_push(ary, yp_static_literal_value(elements.nodes[0]));
OBJ_FREEZE(ary);
@ -665,7 +676,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
}
} else {
yp_arguments_node_t *arguments = call_node->arguments;
YP_COMPILE((yp_node_t *) arguments);
YP_COMPILE_NOT_POPPED((yp_node_t *) arguments);
orig_argc = (int)arguments->arguments.size;
}
@ -1402,9 +1413,6 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
if (!popped) {
ADD_INSN(ret, &dummy_line_node, intern);
}
else {
ADD_INSN(ret, &dummy_line_node, pop);
}
return;
}
@ -1638,7 +1646,7 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
yp_or_node_t *or_node = (yp_or_node_t *) node;
LABEL *end_label = NEW_LABEL(lineno);
YP_COMPILE(or_node->left);
YP_COMPILE_NOT_POPPED(or_node->left);
if (!popped) {
ADD_INSN(ret, &dummy_line_node, dup);
@ -1901,10 +1909,6 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret,
INT2FIX(VM_DEFINECLASS_TYPE_SINGLETON_CLASS));
RB_OBJ_WRITTEN(iseq, Qundef, (VALUE)singleton_class);
if (popped) {
ADD_INSN(ret, &dummy_line_node, pop);
}
return;
}
case YP_SOURCE_ENCODING_NODE: {