mirror of
https://github.com/bellard/quickjs.git
synced 2025-05-12 11:06:10 +08:00
workaround for #282
This commit is contained in:
parent
7adeb5c56e
commit
9918c1206e
18
quickjs.c
18
quickjs.c
@ -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);
|
||||||
|
@ -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();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user