summaryrefslogtreecommitdiff
path: root/quickjs.c
diff options
context:
space:
mode:
authorFabrice Bellard <fabrice@bellard.org>2025-04-07 19:01:30 +0200
committerFabrice Bellard <fabrice@bellard.org>2025-04-07 19:01:30 +0200
commit9d3776d0d45ca437ddb7f9079ae0367102abc90f (patch)
tree34fc3e27f0d065d51ea5d329c4c29d79b55579bf /quickjs.c
parent00e6f29b171b24121b9170e4608a69f0d824b299 (diff)
downloadquickjs-9d3776d0d45ca437ddb7f9079ae0367102abc90f.tar.gz
quickjs-9d3776d0d45ca437ddb7f9079ae0367102abc90f.zip
fixed break statement in the presence of labels (bnoordhuis) (#275)
Diffstat (limited to 'quickjs.c')
-rw-r--r--quickjs.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/quickjs.c b/quickjs.c
index 6b731c3..db5f04c 100644
--- a/quickjs.c
+++ b/quickjs.c
@@ -19794,7 +19794,8 @@ typedef struct BlockEnv {
int drop_count; /* number of stack elements to drop */
int label_finally; /* -1 if none */
int scope_level;
- int has_iterator;
+ uint8_t has_iterator : 1;
+ uint8_t is_regular_stmt : 1; /* i.e. not a loop statement */
} BlockEnv;
typedef struct JSGlobalVar {
@@ -25763,6 +25764,7 @@ static void push_break_entry(JSFunctionDef *fd, BlockEnv *be,
be->label_finally = -1;
be->scope_level = fd->scope_level;
be->has_iterator = FALSE;
+ be->is_regular_stmt = FALSE;
}
static void pop_break_entry(JSFunctionDef *fd)
@@ -25791,7 +25793,8 @@ static __exception int emit_break(JSParseState *s, JSAtom name, int is_cont)
}
if (!is_cont &&
top->label_break != -1 &&
- (name == JS_ATOM_NULL || top->label_name == name)) {
+ ((name == JS_ATOM_NULL && !top->is_regular_stmt) ||
+ top->label_name == name)) {
emit_goto(s, OP_goto, top->label_break);
return 0;
}
@@ -26355,6 +26358,7 @@ static __exception int js_parse_statement_or_decl(JSParseState *s,
label_break = new_label(s);
push_break_entry(s->cur_func, &break_entry,
label_name, label_break, -1, 0);
+ break_entry.is_regular_stmt = TRUE;
if (!(s->cur_func->js_mode & JS_MODE_STRICT) &&
(decl_mask & DECL_MASK_FUNC_WITH_LABEL)) {
mask = DECL_MASK_FUNC | DECL_MASK_FUNC_WITH_LABEL;