Commit 3c39bac4 authored by adamk's avatar adamk Committed by Commit bot

Don't skip hole checks inside patterns in parameter lists

Previously, b6e9f625 fixed self-assignment
in parameters to throw. But it failed to deal with the case of
destructuring with defaults. This patch extends that previous approach
to always treat the end of a parameter as its initializer position,
whether it has an initializer or not.

This is the minimal change to make it easy to merge; a follow-up
will rename the field of Parameter from "initializer_end_position"
to "end_position".

BUG=v8:5454

Review-Url: https://codereview.chromium.org/2390943002
Cr-Commit-Position: refs/heads/master@{#39962}
parent 99cfa5f6
...@@ -2939,9 +2939,6 @@ Block* Parser::BuildParameterInitializationBlock( ...@@ -2939,9 +2939,6 @@ Block* Parser::BuildParameterInitializationBlock(
// TODO(adamk): Should this be kNoSourcePosition, since // TODO(adamk): Should this be kNoSourcePosition, since
// it's just copying from a temp var to the real param var? // it's just copying from a temp var to the real param var?
descriptor.initialization_pos = parameter.pattern->position(); descriptor.initialization_pos = parameter.pattern->position();
// The initializer position which will end up in,
// Variable::initializer_position(), used for hole check elimination.
int initializer_position = parameter.pattern->position();
Expression* initial_value = Expression* initial_value =
factory()->NewVariableProxy(parameters.scope->parameter(i)); factory()->NewVariableProxy(parameters.scope->parameter(i));
if (parameter.initializer != nullptr) { if (parameter.initializer != nullptr) {
...@@ -2957,7 +2954,6 @@ Block* Parser::BuildParameterInitializationBlock( ...@@ -2957,7 +2954,6 @@ Block* Parser::BuildParameterInitializationBlock(
initial_value = factory()->NewConditional( initial_value = factory()->NewConditional(
condition, parameter.initializer, initial_value, kNoSourcePosition); condition, parameter.initializer, initial_value, kNoSourcePosition);
descriptor.initialization_pos = parameter.initializer->position(); descriptor.initialization_pos = parameter.initializer->position();
initializer_position = parameter.initializer_end_position;
} }
Scope* param_scope = scope(); Scope* param_scope = scope();
...@@ -2980,7 +2976,7 @@ Block* Parser::BuildParameterInitializationBlock( ...@@ -2980,7 +2976,7 @@ Block* Parser::BuildParameterInitializationBlock(
BlockState block_state(&scope_state_, param_scope); BlockState block_state(&scope_state_, param_scope);
DeclarationParsingResult::Declaration decl( DeclarationParsingResult::Declaration decl(
parameter.pattern, initializer_position, initial_value); parameter.pattern, parameter.initializer_end_position, initial_value);
PatternRewriter::DeclareAndInitializeVariables( PatternRewriter::DeclareAndInitializeVariables(
this, param_block, &descriptor, &decl, nullptr, CHECK_OK); this, param_block, &descriptor, &decl, nullptr, CHECK_OK);
......
// Copyright 2016 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.
assertThrows(function(...[b = !b]) { }, ReferenceError);
assertThrows(() => (function([b = !b]) { })([]), ReferenceError);
assertThrows(() => (function({b = !b}) { })({}), ReferenceError);
assertThrows((...[b = !b]) => { }, ReferenceError);
assertThrows(() => (([b = !b]) => { })([]), ReferenceError);
assertThrows(() => (({b = !b}) => { })({}), ReferenceError);
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