From e8b646fe91abd48b68a470d71e3f7dbff6788cf0 Mon Sep 17 00:00:00 2001 From: Jemma Issroff Date: Fri, 1 Sep 2023 14:30:22 -0400 Subject: [YARP] Implement BackReferenceReadNode, NumberedReferenceReadNode (#8344) --- yarp/yarp_compiler.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/yarp/yarp_compiler.c b/yarp/yarp_compiler.c index cba528d2ca..da2206a598 100644 --- a/yarp/yarp_compiler.c +++ b/yarp/yarp_compiler.c @@ -472,6 +472,16 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret, } return; } + case YP_NODE_BACK_REFERENCE_READ_NODE: { + if (!popped) { + // Since a back reference is `$`, ruby represents the ID as the + // an rb_intern on the value after the `$`. + char *char_ptr = (char *)(node->location.start) + 1; + ID backref_val = INT2FIX(rb_intern2(char_ptr, 1)) << 1 | 1; + ADD_INSN2(ret, &dummy_line_node, getspecial, INT2FIX(1), backref_val); + } + return; + } case YP_NODE_BEGIN_NODE: { yp_begin_node_t *begin_node = (yp_begin_node_t *) node; if (begin_node->statements) { @@ -1019,6 +1029,13 @@ yp_compile_node(rb_iseq_t *iseq, const yp_node_t *node, LINK_ANCHOR *const ret, ADD_INSN(ret, &dummy_line_node, putnil); } return; + case YP_NODE_NUMBERED_REFERENCE_READ_NODE: { + if (!popped) { + uint32_t reference_number = ((yp_numbered_reference_read_node_t *)node)->number; + ADD_INSN2(ret, &dummy_line_node, getspecial, INT2FIX(1), INT2FIX(reference_number << 1)); + } + return; + } case YP_NODE_OR_NODE: { yp_or_node_t *or_node = (yp_or_node_t *) node; -- cgit v1.2.3