v8/test/mjsunit/regress/regress-crbug-779457.js
Adam Klein 082009fc3d [parser] RewritableExpressions should keep track of their Scope directly
Previously, the Parser stored a Scope alongside a RewritableExpression
for each potential destructuring assignment. This Scope was later used
during rewriting to set the correct context for the rewriting. But this
approach failed if a new Scope was inserted into the Scope chain between
the time the assignment was parsed and when it was rewritten.

By storing the Scope directly in RewritableExpression,
ReparentExpressionScopes() is able to appropriately re-scope such
expressions prior to their rewriting.

Bug: chromium:779457
Change-Id: Ieb429a3da841f76d5798610af59da4fccb000652
Reviewed-on: https://chromium-review.googlesource.com/767666
Commit-Queue: Adam Klein <adamk@chromium.org>
Reviewed-by: Marja Hölttä <marja@chromium.org>
Cr-Commit-Position: refs/heads/master@{#49368}
2017-11-14 20:30:14 +00:00

28 lines
709 B
JavaScript

// Copyright 2017 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.
(function testEager() {
(function({name = [foo] = eval("[]")}) {})({});
(function([name = [foo] = eval("[]")]) {})([]);
})();
(function testLazy() {
function f({name = [foo] = eval("[]")}) {}
function g([name = [foo] = eval("[]")]) {}
f({});
g([]);
})();
(function testEagerArrow() {
(({name = [foo] = eval("[]")}) => {})({});
(([name = [foo] = eval("[]")]) => {})([]);
})();
(function testLazyArrow() {
var f = ({name = [foo] = eval("[]")}) => {};
var g = ([name = [foo] = eval("[]")]) => {};
f({});
g([]);
})();