ref: df8559e7bdbc6065276e786217eeee70f28fce66
parent: 90a63426ee93d9079a032740e519988e26d1949c
author: Tor Andersson <tor.andersson@artifex.com>
date: Mon Dec 6 06:47:31 EST 2021
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.
--- a/jscompile.c
+++ b/jscompile.c
@@ -794,15 +794,19 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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: