OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ast/ast.h" | 5 #include "src/ast/ast.h" |
6 #include "src/messages.h" | 6 #include "src/messages.h" |
7 #include "src/parsing/parameter-initializer-rewriter.h" | 7 #include "src/parsing/parameter-initializer-rewriter.h" |
8 #include "src/parsing/parser.h" | 8 #include "src/parsing/parser.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 Expression* expr = factory()->NewDoExpression(block_, temp, pos); | 373 Expression* expr = factory()->NewDoExpression(block_, temp, pos); |
374 node->Rewrite(expr); | 374 node->Rewrite(expr); |
375 block_ = old_block; | 375 block_ = old_block; |
376 if (block_) { | 376 if (block_) { |
377 block_->statements()->Add(factory()->NewExpressionStatement(expr, pos), | 377 block_->statements()->Add(factory()->NewExpressionStatement(expr, pos), |
378 zone()); | 378 zone()); |
379 } | 379 } |
380 return set_context(old_context); | 380 return set_context(old_context); |
381 } | 381 } |
382 | 382 |
383 // Two cases for scope rewriting the scope of default parameters: | 383 // When an extra declaration scope needs to be inserted to account for |
384 // - Eagerly parsed arrow functions are initially parsed as having | 384 // a sloppy eval in a default parameter or function body, the expressions |
385 // expressions in the enclosing scope, but when the arrow is encountered, | 385 // needs to be in that new inner scope which was added after initial |
386 // need to be in the scope of the function. | 386 // parsing. |
387 // - When an extra declaration scope needs to be inserted to account for | |
388 // a sloppy eval in a default parameter or function body, the expressions | |
389 // needs to be in that new inner scope which was added after initial | |
390 // parsing. | |
391 // Each of these cases can be handled by rewriting the contents of the | |
392 // expression to the current scope. The source scope is typically the outer | |
393 // scope when one case occurs; when both cases occur, both scopes need to | |
394 // be included as the outer scope. (Both rewritings still need to be done | |
395 // to account for lazily parsed arrow functions which hit the second case.) | |
396 // TODO(littledan): Remove the outer_scope parameter of | |
397 // RewriteParameterInitializerScope | |
398 void Parser::PatternRewriter::RewriteParameterScopes(Expression* expr) { | 387 void Parser::PatternRewriter::RewriteParameterScopes(Expression* expr) { |
399 if (!IsBindingContext()) return; | 388 if (!IsBindingContext()) return; |
400 if (descriptor_->declaration_kind != DeclarationDescriptor::PARAMETER) return; | 389 if (descriptor_->declaration_kind != DeclarationDescriptor::PARAMETER) return; |
401 if (!scope()->is_arrow_scope() && !scope()->is_block_scope()) return; | 390 if (!scope()->is_block_scope()) return; |
402 | 391 |
403 // Either this scope is an arrow scope or a declaration block scope. | |
404 DCHECK(scope()->is_declaration_scope()); | 392 DCHECK(scope()->is_declaration_scope()); |
| 393 DCHECK(scope()->outer_scope()->is_function_scope()); |
| 394 DCHECK(scope()->calls_sloppy_eval()); |
405 | 395 |
406 if (scope()->outer_scope()->is_arrow_scope() && scope()->is_block_scope()) { | 396 ReparentParameterExpressionScope(parser_->stack_limit(), expr, scope()); |
407 RewriteParameterInitializerScope(parser_->stack_limit(), expr, | |
408 scope()->outer_scope()->outer_scope(), | |
409 scope()); | |
410 } | |
411 RewriteParameterInitializerScope(parser_->stack_limit(), expr, | |
412 scope()->outer_scope(), scope()); | |
413 } | 397 } |
414 | 398 |
415 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern, | 399 void Parser::PatternRewriter::VisitObjectLiteral(ObjectLiteral* pattern, |
416 Variable** temp_var) { | 400 Variable** temp_var) { |
417 auto temp = *temp_var = CreateTempVar(current_value_); | 401 auto temp = *temp_var = CreateTempVar(current_value_); |
418 | 402 |
419 block_->statements()->Add(parser_->BuildAssertIsCoercible(temp), zone()); | 403 block_->statements()->Add(parser_->BuildAssertIsCoercible(temp), zone()); |
420 | 404 |
421 for (ObjectLiteralProperty* property : *pattern->properties()) { | 405 for (ObjectLiteralProperty* property : *pattern->properties()) { |
422 PatternContext context = SetInitializerContextIfNeeded(property->value()); | 406 PatternContext context = SetInitializerContextIfNeeded(property->value()); |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
774 NOT_A_PATTERN(TryFinallyStatement) | 758 NOT_A_PATTERN(TryFinallyStatement) |
775 NOT_A_PATTERN(UnaryOperation) | 759 NOT_A_PATTERN(UnaryOperation) |
776 NOT_A_PATTERN(VariableDeclaration) | 760 NOT_A_PATTERN(VariableDeclaration) |
777 NOT_A_PATTERN(WhileStatement) | 761 NOT_A_PATTERN(WhileStatement) |
778 NOT_A_PATTERN(WithStatement) | 762 NOT_A_PATTERN(WithStatement) |
779 NOT_A_PATTERN(Yield) | 763 NOT_A_PATTERN(Yield) |
780 | 764 |
781 #undef NOT_A_PATTERN | 765 #undef NOT_A_PATTERN |
782 } // namespace internal | 766 } // namespace internal |
783 } // namespace v8 | 767 } // namespace v8 |
OLD | NEW |