From 368e8ce3d5fc117081316aefa25a40b3b1f7a5a9 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Sun, 26 Sep 2021 16:58:40 +0900 Subject: [PATCH] codegen.c: should not `loop_push()` before constant folding. Otherwise, the following code will crash: ```ruby 1.times{{}until 1; break} ``` --- mrbgems/mruby-compiler/core/codegen.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/mrbgems/mruby-compiler/core/codegen.c b/mrbgems/mruby-compiler/core/codegen.c index c04c408ed9..42c93debfa 100644 --- a/mrbgems/mruby-compiler/core/codegen.c +++ b/mrbgems/mruby-compiler/core/codegen.c @@ -2263,11 +2263,6 @@ codegen(codegen_scope *s, node *tree, int val) case NODE_WHILE: case NODE_UNTIL: { - struct loopinfo *lp = loop_push(s, LOOP_NORMAL); - uint32_t pos = JMPLINK_START; - - if (!val) lp->reg = -1; - lp->pc0 = new_label(s); if (true_always(tree->car)) { if (nt == NODE_UNTIL) { if (val) { @@ -2286,6 +2281,12 @@ codegen(codegen_scope *s, node *tree, int val) goto exit; } } + + uint32_t pos = JMPLINK_START; + struct loopinfo *lp = loop_push(s, LOOP_NORMAL); + + if (!val) lp->reg = -1; + lp->pc0 = new_label(s); codegen(s, tree->car, VAL); pop(); if (nt == NODE_WHILE) {