From df8559e7bdbc6065276e786217eeee70f28fce66 Mon Sep 17 00:00:00 2001 From: Tor Andersson Date: Mon, 6 Dec 2021 11:47:31 +0100 Subject: [PATCH] Bug 704749: Clear jump list after patching jump addresses. Since we can emit a statement multiple times when compiling try/finally we have to use a new patch list for each instance. --- jscompile.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/jscompile.c b/jscompile.c index dcdee05..a915903 100644 --- a/jscompile.c +++ b/jscompile.c @@ -794,15 +794,19 @@ static void addjump(JF, enum js_AstType type, js_Ast *target, int inst) target->jumps = jump; } -static void labeljumps(JF, js_JumpList *jump, int baddr, int caddr) +static void labeljumps(JF, js_Ast *stm, int baddr, int caddr) { + js_JumpList *jump = stm->jumps; while (jump) { + js_JumpList *next = jump->next; if (jump->type == STM_BREAK) labelto(J, F, jump->inst, baddr); if (jump->type == STM_CONTINUE) labelto(J, F, jump->inst, caddr); - jump = jump->next; + js_free(J, jump); + jump = next; } + stm->jumps = NULL; } static int isloop(enum js_AstType T) @@ -1121,7 +1125,7 @@ static void cstm(JF, js_Ast *stm) cexp(J, F, stm->b); emitline(J, F, stm); emitjumpto(J, F, OP_JTRUE, loop); - labeljumps(J, F, stm->jumps, here(J,F), cont); + labeljumps(J, F, stm, here(J,F), cont); break; case STM_WHILE: @@ -1133,7 +1137,7 @@ static void cstm(JF, js_Ast *stm) emitline(J, F, stm); emitjumpto(J, F, OP_JUMP, loop); label(J, F, end); - labeljumps(J, F, stm->jumps, here(J,F), loop); + labeljumps(J, F, stm, here(J,F), loop); break; case STM_FOR: @@ -1164,7 +1168,7 @@ static void cstm(JF, js_Ast *stm) emitjumpto(J, F, OP_JUMP, loop); if (end) label(J, F, end); - labeljumps(J, F, stm->jumps, here(J,F), cont); + labeljumps(J, F, stm, here(J,F), cont); break; case STM_FOR_IN: @@ -1189,12 +1193,12 @@ static void cstm(JF, js_Ast *stm) emitjumpto(J, F, OP_JUMP, loop); } label(J, F, end); - labeljumps(J, F, stm->jumps, here(J,F), loop); + labeljumps(J, F, stm, here(J,F), loop); break; case STM_SWITCH: cswitch(J, F, stm->a, stm->b); - labeljumps(J, F, stm->jumps, here(J,F), 0); + labeljumps(J, F, stm, here(J,F), 0); break; case STM_LABEL: @@ -1204,7 +1208,7 @@ static void cstm(JF, js_Ast *stm) stm = stm->b; /* loops and switches have already been labelled */ if (!isloop(stm->type) && stm->type != STM_SWITCH) - labeljumps(J, F, stm->jumps, here(J,F), 0); + labeljumps(J, F, stm, here(J,F), 0); break; case STM_BREAK: