summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJemma Issroff <jemmaissroff@gmail.com>2023-09-01 14:30:22 -0400
committerGitHub <noreply@github.com>2023-09-01 11:30:22 -0700
commite8b646fe91abd48b68a470d71e3f7dbff6788cf0 (patch)
tree726ba67563a22b3627d07252520fdf86232dbecf
parentc0bf4029e3ff0c53bcc8d25a3c881c997aee9209 (diff)
[YARP] Implement BackReferenceReadNode, NumberedReferenceReadNode (#8344)
Notes
Notes: Merged-By: jemmaissroff
-rw-r--r--yarp/yarp_compiler.c17
1 files changed, 17 insertions, 0 deletions
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 `$<char>`, 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;