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:
parent
84bda68fff
commit
fa844bdbee
@ -2842,8 +2842,18 @@ Block* Parser::BuildParameterInitializationBlock(
|
|||||||
if (parameter->initializer() != nullptr) {
|
if (parameter->initializer() != nullptr) {
|
||||||
// IS_UNDEFINED($param) ? initializer : $param
|
// IS_UNDEFINED($param) ? initializer : $param
|
||||||
|
|
||||||
// Ensure initializer is rewritten
|
if (parameter->initializer()->IsClassLiteral()) {
|
||||||
RewriteParameterInitializer(parameter->initializer());
|
// 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(
|
auto condition = factory()->NewCompareOperation(
|
||||||
Token::EQ_STRICT,
|
Token::EQ_STRICT,
|
||||||
|
31
test/mjsunit/regress/regress-917988.js
Normal file
31
test/mjsunit/regress/regress-917988.js
Normal 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 [[]]() {} }) { })();
|
Loading…
Reference in New Issue
Block a user