diff options
| author | Kevin Newton <kddnewton@gmail.com> | 2024-03-13 15:24:07 -0400 |
|---|---|---|
| committer | Kevin Newton <kddnewton@gmail.com> | 2024-03-13 19:01:21 -0400 |
| commit | 7c9e6eab89c76bdb78268bdd574ae4c362ea2c11 (patch) | |
| tree | d6d46037cdb9c72761445e97e25e896f4de7741e | |
| parent | 42bfbe9aa6fe1463921c6d86fd61e5c89e962ac2 (diff) | |
Handle nth ref too big
| -rw-r--r-- | prism_compile.c | 25 |
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: { |
