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 {
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)
}
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;
}
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;
while (0) x: { break x; };
}
+function test_labels2()
+{
+ while (1) label: break
+ var i = 0
+ while (i < 3) label: {
+ if (i > 0)
+ break
+ i++
+ }
+ assert(i, 1)
+ for (;;) label: break
+ for (i = 0; i < 3; i++) label: {
+ if (i > 0)
+ break
+ }
+ assert(i, 1)
+}
+
function test_destructuring()
{
function * g () { return 0; };
test_object_literal();
test_regexp_skip();
test_labels();
+test_labels2();
test_destructuring();
test_spread();
test_function_length();