From 939659e2db44a00832c43921df4dd765d4958c2f Mon Sep 17 00:00:00 2001 From: dearblue Date: Sun, 1 Dec 2024 11:34:10 +0900 Subject: [PATCH] Allow `redo` from nested `LOOP_BEGIN` and `LOOP_RESCUE` --- mrbgems/mruby-compiler/core/codegen.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index fc9f0d0e6..96525e53e 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -3183,11 +3183,14 @@ codegen(codegen_scope *s, node *tree, int val) break; case NODE_REDO: - if (!s->loop || s->loop->type == LOOP_BEGIN || s->loop->type == LOOP_RESCUE) { - raise_error(s, "unexpected redo"); - } - else { - genjmp(s, OP_JMPUW, s->loop->pc1); + for (const struct loopinfo *lp = s->loop; ; lp = lp->prev) { + if (!lp) { + raise_error(s, "unexpected redo"); + } + if (lp->type != LOOP_BEGIN && lp->type != LOOP_RESCUE) { + genjmp(s, OP_JMPUW, lp->pc1); + break; + } } if (val) push(); break;