Set the correct scope when initializing parameters.

If the parameter list contains class declarations we should use the
block scope corresponding to the class when rewriting the initializers.

Bug: chromium:917988
Change-Id: I7fcd44a264b7c0113cbd821b759e0bee6c9345a0
Reviewed-on: https://chromium-review.googlesource.com/c/1392240
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Commit-Queue: Mythri Alle <mythria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58515}
This commit is contained in:
Mythri 2019-01-02 15:44:55 +00:00 committed by Commit Bot
parent 84bda68fff
commit fa844bdbee
2 changed files with 43 additions and 2 deletions

View File

@ -2842,8 +2842,18 @@ Block* Parser::BuildParameterInitializationBlock(
if (parameter->initializer() != nullptr) {
// IS_UNDEFINED($param) ? initializer : $param
// Ensure initializer is rewritten
RewriteParameterInitializer(parameter->initializer());
if (parameter->initializer()->IsClassLiteral()) {
// Initializers could have their own scopes. So set the scope
// here if necessary.
BlockState block_state(
&scope_, parameter->initializer()->AsClassLiteral()->scope());
// Ensure initializer is rewritten
RewriteParameterInitializer(parameter->initializer());
} else {
// Ensure initializer is rewritten
RewriteParameterInitializer(parameter->initializer());
}
auto condition = factory()->NewCompareOperation(
Token::EQ_STRICT,

View File

@ -0,0 +1,31 @@
// Copyright 2018 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.
// Tests if class declarations in parameter list are correctly handled.
function v_2(
v_3 = class v_4 {
get [[] = ';']() { }
}
) { }
v_2();
// Test object inside a class in a parameter list
(function f(
v_3 = class v_4 {
get [{} = ';']() { }
}
) { })();
// Test destructuring of class in parameters
(function f( {p, q} = class C { get [[] = ';']() {} } ) {})();
// Test array destructuring of class in parameters
class C {};
C[Symbol.iterator] = function() {
return {
next: function() { return { done: true }; },
_first: true
};
};
(function f1([p, q] = class D extends C { get [[]]() {} }) { })();