Commit fa844bdb authored by Mythri's avatar Mythri Committed by Commit Bot

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/1392240Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Commit-Queue: Mythri Alle <mythria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58515}
parent 84bda68f
......@@ -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,
......
// 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 [[]]() {} }) { })();
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