Skip to content
Permalink
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ccxvii committed Dec 6, 2021
1 parent 90a6342 commit df8559e
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions jscompile.c
Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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:
Expand Down

0 comments on commit df8559e

Please sign in to comment.