diff options
Diffstat (limited to 'deps/v8/src/parsing/pattern-rewriter.cc')
-rw-r--r-- | deps/v8/src/parsing/pattern-rewriter.cc | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/deps/v8/src/parsing/pattern-rewriter.cc b/deps/v8/src/parsing/pattern-rewriter.cc index f3d9bb02a3..9eb3f0665b 100644 --- a/deps/v8/src/parsing/pattern-rewriter.cc +++ b/deps/v8/src/parsing/pattern-rewriter.cc @@ -4,6 +4,7 @@ #include "src/ast/ast.h" #include "src/messages.h" +#include "src/objects-inl.h" #include "src/parsing/parameter-initializer-rewriter.h" #include "src/parsing/parser.h" @@ -219,9 +220,18 @@ void Parser::PatternRewriter::VisitVariableProxy(VariableProxy* pattern) { // But for var declarations we need to do a new lookup. if (descriptor_->mode == VAR) { proxy = var_init_scope->NewUnresolved(factory(), name); + // TODO(neis): Set is_assigned on proxy. } else { DCHECK_NOT_NULL(proxy); DCHECK_NOT_NULL(proxy->var()); + if (var_init_scope->is_script_scope() || + var_init_scope->is_module_scope()) { + // We have to pessimistically assume that top-level variables will be + // assigned. This is because there may be lazily parsed top-level + // functions, which, for efficiency, we preparse without variable + // tracking. + proxy->set_is_assigned(); + } } // Add break location for destructured sub-pattern. int pos = IsSubPattern() ? pattern->position() : value->position(); @@ -307,7 +317,7 @@ void Parser::PatternRewriter::VisitRewritableExpression( block_->statements()->Add(factory()->NewExpressionStatement(expr, pos), zone()); } - return set_context(old_context); + set_context(old_context); } // When an extra declaration scope needs to be inserted to account for @@ -359,7 +369,7 @@ void Parser::PatternRewriter::VisitArrayLiteral(ArrayLiteral* node, DCHECK(block_->ignore_completion_value()); auto temp = *temp_var = CreateTempVar(current_value_); - auto iterator = CreateTempVar(parser_->GetIterator( + auto iterator = CreateTempVar(factory()->NewGetIterator( factory()->NewVariableProxy(temp), kNoSourcePosition)); auto done = CreateTempVar(factory()->NewBooleanLiteral(false, kNoSourcePosition)); @@ -673,6 +683,7 @@ NOT_A_PATTERN(ForOfStatement) NOT_A_PATTERN(ForStatement) NOT_A_PATTERN(FunctionDeclaration) NOT_A_PATTERN(FunctionLiteral) +NOT_A_PATTERN(GetIterator) NOT_A_PATTERN(IfStatement) NOT_A_PATTERN(Literal) NOT_A_PATTERN(NativeFunctionLiteral) |