Commit b17eaaa5 authored by adamk's avatar adamk Committed by Commit bot

Fix desugaring of let bindings in for loops to handle continue properly

This requires putting the original loop's body inside an inner for loop (with
the same labels as the original loop) and re-binding the temp variables in its
"next" expression. A second flag is added to the desugared code to ensure the
loop body executes at most once per loop.

BUG=v8:3683
LOG=y

Review URL: https://codereview.chromium.org/720863002

Cr-Commit-Position: refs/heads/master@{#25363}
parent 353b6964
This diff is collapsed.
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Flags: --harmony-scoping
"use strict";
// Simplest case
var count = 0;
for (let x = 0; x < 10;) {
x++;
count++;
continue;
}
assertEquals(10, count);
// Labeled
count = 0;
label: for (let x = 0; x < 10;) {
while (true) {
x++;
count++;
continue label;
}
}
assertEquals(10, count);
// Simple and labeled
count = 0;
label: for (let x = 0; x < 10;) {
x++;
count++;
continue label;
}
assertEquals(10, count);
// Shadowing loop variable in same scope as continue
count = 0;
for (let x = 0; x < 10;) {
x++;
count++;
{
let x = "hello";
continue;
}
}
assertEquals(10, count);
// Nested let-bound for loops, inner continue
count = 0;
for (let x = 0; x < 10;) {
x++;
for (let y = 0; y < 2;) {
y++;
count++;
continue;
}
}
assertEquals(20, count);
// Nested let-bound for loops, outer continue
count = 0;
for (let x = 0; x < 10;) {
x++;
for (let y = 0; y < 2;) {
y++;
count++;
}
continue;
}
assertEquals(20, count);
// Nested let-bound for loops, labeled continue
count = 0;
outer: for (let x = 0; x < 10;) {
x++;
for (let y = 0; y < 2;) {
y++;
count++;
if (y == 2) continue outer;
}
}
assertEquals(20, count);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment