summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2024-03-13 15:24:07 -0400
committerKevin Newton <kddnewton@gmail.com>2024-03-13 19:01:21 -0400
commit7c9e6eab89c76bdb78268bdd574ae4c362ea2c11 (patch)
treed6d46037cdb9c72761445e97e25e896f4de7741e
parent42bfbe9aa6fe1463921c6d86fd61e5c89e962ac2 (diff)
Handle nth ref too big
-rw-r--r--prism_compile.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/prism_compile.c b/prism_compile.c
index bbdd46f978..1fef124455 100644
--- a/prism_compile.c
+++ b/prism_compile.c
@@ -6530,18 +6530,35 @@ pm_compile_node(rb_iseq_t *iseq, const pm_node_t *node, LINK_ANCHOR *const ret,
return;
}
- case PM_NIL_NODE:
- PM_PUTNIL_UNLESS_POPPED;
+ case PM_NIL_NODE: {
+ // nil
+ // ^^^
+ if (!popped) {
+ PUSH_INSN(ret, location, putnil);
+ }
+
return;
+ }
case PM_NO_KEYWORDS_PARAMETER_NODE: {
+ // def foo(**nil); end
+ // ^^^^^
ISEQ_BODY(iseq)->param.flags.accepts_no_kwarg = TRUE;
return;
}
case PM_NUMBERED_REFERENCE_READ_NODE: {
+ // $1
+ // ^^
if (!popped) {
- uint32_t reference_number = ((pm_numbered_reference_read_node_t *)node)->number;
- ADD_INSN2(ret, &dummy_line_node, getspecial, INT2FIX(1), INT2FIX(reference_number << 1));
+ uint32_t reference_number = ((const pm_numbered_reference_read_node_t *) node)->number;
+
+ if (reference_number > 0) {
+ PUSH_INSN2(ret, location, getspecial, INT2FIX(1), INT2FIX(reference_number << 1));
+ }
+ else {
+ PUSH_INSN(ret, location, putnil);
+ }
}
+
return;
}
case PM_OR_NODE: {