workaround for #282

This commit is contained in:
Fabrice Bellard 2025-04-10 17:38:28 +02:00
parent 7adeb5c56e
commit 9918c1206e
2 changed files with 26 additions and 2 deletions

View File

@ -31821,10 +31821,11 @@ static BOOL code_has_label(CodeContext *s, int pos, int label)
/* return the target label, following the OP_goto jumps /* return the target label, following the OP_goto jumps
the first opcode at destination is stored in *pop the first opcode at destination is stored in *pop
*/ */
static int find_jump_target(JSFunctionDef *s, int label, int *pop, int *pline) static int find_jump_target(JSFunctionDef *s, int label0, int *pop, int *pline)
{ {
int i, pos, op; int i, pos, op, label;
label = label0;
update_label(s, label, -1); update_label(s, label, -1);
for (i = 0; i < 10; i++) { for (i = 0; i < 10; i++) {
assert(label >= 0 && label < s->label_count); assert(label >= 0 && label < s->label_count);
@ -31855,6 +31856,19 @@ static int find_jump_target(JSFunctionDef *s, int label, int *pop, int *pline)
} }
} }
/* cycle detected, could issue a warning */ /* cycle detected, could issue a warning */
/* XXX: the combination of find_jump_target() and skip_dead_code()
seems incorrect with cyclic labels. See for exemple:
for (;;) {
l:break l;
l:break l;
l:break l;
l:break l;
}
Avoiding changing the target is just a workaround and might not
suffice to completely fix the problem. */
label = label0;
done: done:
*pop = op; *pop = op;
update_label(s, label, +1); update_label(s, label, +1);

View File

@ -371,6 +371,16 @@ function test_try_catch8()
assert(s === "xafyaf"); assert(s === "xafyaf");
} }
function test_cyclic_labels()
{
/* just check that it compiles without a crash */
for (;;) {
l: break l;
l: break l;
l: break l;
}
}
test_while(); test_while();
test_while_break(); test_while_break();
test_do_while(); test_do_while();