Merge V8 5.5.372.32
Test: Manual, built and ran D8
Change-Id: I831a5491f74342c2675bb6fe1e24a2258e493758
diff --git a/src/parsing/pattern-rewriter.cc b/src/parsing/pattern-rewriter.cc
index 1831a29..7898f87 100644
--- a/src/parsing/pattern-rewriter.cc
+++ b/src/parsing/pattern-rewriter.cc
@@ -12,7 +12,8 @@
namespace internal {
void Parser::PatternRewriter::DeclareAndInitializeVariables(
- Block* block, const DeclarationDescriptor* declaration_descriptor,
+ Parser* parser, Block* block,
+ const DeclarationDescriptor* declaration_descriptor,
const DeclarationParsingResult::Declaration* declaration,
ZoneList<const AstRawString*>* names, bool* ok) {
PatternRewriter rewriter;
@@ -20,7 +21,7 @@
DCHECK(block->ignore_completion_value());
rewriter.scope_ = declaration_descriptor->scope;
- rewriter.parser_ = declaration_descriptor->parser;
+ rewriter.parser_ = parser;
rewriter.context_ = BINDING;
rewriter.pattern_ = declaration->pattern;
rewriter.initializer_position_ = declaration->initializer_position;
@@ -36,11 +37,12 @@
void Parser::PatternRewriter::RewriteDestructuringAssignment(
Parser* parser, RewritableExpression* to_rewrite, Scope* scope) {
- PatternRewriter rewriter;
-
+ DCHECK(!scope->HasBeenRemoved());
DCHECK(!to_rewrite->is_rewritten());
bool ok = true;
+
+ PatternRewriter rewriter;
rewriter.scope_ = scope;
rewriter.parser_ = parser;
rewriter.context_ = ASSIGNMENT;
@@ -139,23 +141,16 @@
// which the variable or constant is declared. Only function variables have
// an initial value in the declaration (because they are initialized upon
// entering the function).
- //
- // If we have a legacy const declaration, in an inner scope, the proxy
- // is always bound to the declared variable (independent of possibly
- // surrounding 'with' statements).
- // For let/const declarations in harmony mode, we can also immediately
- // pre-resolve the proxy because it resides in the same scope as the
- // declaration.
const AstRawString* name = pattern->raw_name();
- VariableProxy* proxy = descriptor_->scope->NewUnresolved(
- factory(), name, parser_->scanner()->location().beg_pos,
+ VariableProxy* proxy = factory()->NewVariableProxy(
+ name, NORMAL_VARIABLE, parser_->scanner()->location().beg_pos,
parser_->scanner()->location().end_pos);
Declaration* declaration = factory()->NewVariableDeclaration(
proxy, descriptor_->scope, descriptor_->declaration_pos);
- Variable* var = parser_->Declare(declaration, descriptor_->declaration_kind,
- descriptor_->mode,
- DefaultInitializationFlag(descriptor_->mode),
- ok_, descriptor_->hoist_scope);
+ Variable* var = parser_->Declare(
+ declaration, descriptor_->declaration_kind, descriptor_->mode,
+ Variable::DefaultInitializationFlag(descriptor_->mode), ok_,
+ descriptor_->hoist_scope);
if (!*ok_) return;
DCHECK_NOT_NULL(var);
DCHECK(proxy->is_resolved());
@@ -267,12 +262,14 @@
void Parser::PatternRewriter::VisitRewritableExpression(
RewritableExpression* node) {
// If this is not a destructuring assignment...
- if (!IsAssignmentContext() || !node->expression()->IsAssignment()) {
+ if (!IsAssignmentContext()) {
// Mark the node as rewritten to prevent redundant rewriting, and
// perform BindingPattern rewriting
DCHECK(!node->is_rewritten());
node->Rewrite(node->expression());
return Visit(node->expression());
+ } else if (!node->expression()->IsAssignment()) {
+ return Visit(node->expression());
}
if (node->is_rewritten()) return;
@@ -374,7 +371,7 @@
auto temp = *temp_var = CreateTempVar(current_value_);
auto iterator = CreateTempVar(parser_->GetIterator(
- factory()->NewVariableProxy(temp), factory(), kNoSourcePosition));
+ factory()->NewVariableProxy(temp), kNoSourcePosition));
auto done =
CreateTempVar(factory()->NewBooleanLiteral(false, kNoSourcePosition));
auto result = CreateTempVar();
@@ -601,8 +598,9 @@
Expression* closing_condition = factory()->NewUnaryOperation(
Token::NOT, factory()->NewVariableProxy(done), nopos);
- parser_->FinalizeIteratorUse(completion, closing_condition, iterator, block_,
- target);
+
+ parser_->FinalizeIteratorUse(scope(), completion, closing_condition, iterator,
+ block_, target);
block_ = target;
}