Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(292)

Side by Side Diff: src/parsing/parser.cc

Issue 2289663002: [parser] Hide expression classifiers in parser implementation (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/parsing/parser.h" 5 #include "src/parsing/parser.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/ast/ast-expression-rewriter.h" 10 #include "src/ast/ast-expression-rewriter.h"
(...skipping 863 matching lines...) Expand 10 before | Expand all | Expand 10 after
874 // These two bits only need to be explicitly set because we're 874 // These two bits only need to be explicitly set because we're
875 // not passing the ScopeInfo to the Scope constructor. 875 // not passing the ScopeInfo to the Scope constructor.
876 // TODO(adamk): Remove these calls once the above NewScope call 876 // TODO(adamk): Remove these calls once the above NewScope call
877 // passes the ScopeInfo. 877 // passes the ScopeInfo.
878 if (info->calls_eval()) { 878 if (info->calls_eval()) {
879 scope->RecordEvalCall(); 879 scope->RecordEvalCall();
880 } 880 }
881 SetLanguageMode(scope, info->language_mode()); 881 SetLanguageMode(scope, info->language_mode());
882 882
883 scope->set_start_position(info->start_position()); 883 scope->set_start_position(info->start_position());
884 ExpressionClassifier formals_classifier(this); 884 ExpressionClassifierWrapper wrap_formals_classifier(this);
885 ParserFormalParameters formals(scope); 885 ParserFormalParameters formals(scope);
886 Checkpoint checkpoint(this); 886 Checkpoint checkpoint(this);
887 { 887 {
888 // Parsing patterns as variable reference expression creates 888 // Parsing patterns as variable reference expression creates
889 // NewUnresolved references in current scope. Entrer arrow function 889 // NewUnresolved references in current scope. Entrer arrow function
890 // scope for formal parameter parsing. 890 // scope for formal parameter parsing.
891 BlockState block_state(&scope_state_, scope); 891 BlockState block_state(&scope_state_, scope);
892 if (Check(Token::LPAREN)) { 892 if (Check(Token::LPAREN)) {
893 // '(' StrictFormalParameters ')' 893 // '(' StrictFormalParameters ')'
894 ParseFormalParameterList(&formals, &formals_classifier, &ok); 894 ParseFormalParameterList(&formals, &ok);
895 if (ok) ok = Check(Token::RPAREN); 895 if (ok) ok = Check(Token::RPAREN);
896 } else { 896 } else {
897 // BindingIdentifier 897 // BindingIdentifier
898 ParseFormalParameter(&formals, &formals_classifier, &ok); 898 ParseFormalParameter(&formals, &ok);
899 if (ok) { 899 if (ok) DeclareFormalParameter(formals.scope, formals.at(0));
900 DeclareFormalParameter(formals.scope, formals.at(0),
901 &formals_classifier);
902 }
903 } 900 }
904 } 901 }
905 902
906 if (ok) { 903 if (ok) {
907 checkpoint.Restore(&formals.materialized_literals_count); 904 checkpoint.Restore(&formals.materialized_literals_count);
908 // Pass `accept_IN=true` to ParseArrowFunctionLiteral --- This should 905 // Pass `accept_IN=true` to ParseArrowFunctionLiteral --- This should
909 // not be observable, or else the preparser would have failed. 906 // not be observable, or else the preparser would have failed.
910 Expression* expression = ParseArrowFunctionLiteral( 907 Expression* expression =
911 true, formals, is_async, formals_classifier, &ok); 908 ParseArrowFunctionLiteral(true, formals, is_async, &ok);
912 if (ok) { 909 if (ok) {
913 // Scanning must end at the same position that was recorded 910 // Scanning must end at the same position that was recorded
914 // previously. If not, parsing has been interrupted due to a stack 911 // previously. If not, parsing has been interrupted due to a stack
915 // overflow, at which point the partially parsed arrow function 912 // overflow, at which point the partially parsed arrow function
916 // concise body happens to be a valid expression. This is a problem 913 // concise body happens to be a valid expression. This is a problem
917 // only for arrow functions with single expression bodies, since there 914 // only for arrow functions with single expression bodies, since there
918 // is no end token such as "}" for normal functions. 915 // is no end token such as "}" for normal functions.
919 if (scanner()->location().end_pos == info->end_position()) { 916 if (scanner()->location().end_pos == info->end_position()) {
920 // The pre-parser saw an arrow function here, so the full parser 917 // The pre-parser saw an arrow function here, so the full parser
921 // must produce a FunctionLiteral. 918 // must produce a FunctionLiteral.
(...skipping 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION && 1344 if (allow_harmony_async_await() && PeekAhead() == Token::FUNCTION &&
1348 !scanner()->HasAnyLineTerminatorAfterNext()) { 1345 !scanner()->HasAnyLineTerminatorAfterNext()) {
1349 Consume(Token::ASYNC); 1346 Consume(Token::ASYNC);
1350 result = ParseAsyncFunctionDeclaration(&local_names, true, CHECK_OK); 1347 result = ParseAsyncFunctionDeclaration(&local_names, true, CHECK_OK);
1351 break; 1348 break;
1352 } 1349 }
1353 /* falls through */ 1350 /* falls through */
1354 1351
1355 default: { 1352 default: {
1356 int pos = position(); 1353 int pos = position();
1357 ExpressionClassifier classifier(this); 1354 ExpressionClassifierWrapper wrap_classifier(this);
1358 Expression* value = 1355 Expression* value = ParseAssignmentExpression(true, CHECK_OK);
1359 ParseAssignmentExpression(true, &classifier, CHECK_OK); 1356 RewriteNonPattern(CHECK_OK);
1360 RewriteNonPattern(&classifier, CHECK_OK);
1361 SetFunctionName(value, ast_value_factory()->default_string()); 1357 SetFunctionName(value, ast_value_factory()->default_string());
1362 1358
1363 const AstRawString* local_name = 1359 const AstRawString* local_name =
1364 ast_value_factory()->star_default_star_string(); 1360 ast_value_factory()->star_default_star_string();
1365 local_names.Add(local_name, zone()); 1361 local_names.Add(local_name, zone());
1366 1362
1367 // It's fine to declare this as CONST because the user has no way of 1363 // It's fine to declare this as CONST because the user has no way of
1368 // writing to it. 1364 // writing to it.
1369 Declaration* decl = DeclareVariable(local_name, CONST, pos, CHECK_OK); 1365 Declaration* decl = DeclareVariable(local_name, CONST, pos, CHECK_OK);
1370 decl->proxy()->var()->set_initializer_position(position()); 1366 decl->proxy()->var()->set_initializer_position(position());
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 const AstRawString* variable_name; 1936 const AstRawString* variable_name;
1941 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) { 1937 if (default_export && (peek() == Token::EXTENDS || peek() == Token::LBRACE)) {
1942 name = ast_value_factory()->default_string(); 1938 name = ast_value_factory()->default_string();
1943 is_strict_reserved = false; 1939 is_strict_reserved = false;
1944 variable_name = ast_value_factory()->star_default_star_string(); 1940 variable_name = ast_value_factory()->star_default_star_string();
1945 } else { 1941 } else {
1946 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK); 1942 name = ParseIdentifierOrStrictReservedWord(&is_strict_reserved, CHECK_OK);
1947 variable_name = name; 1943 variable_name = name;
1948 } 1944 }
1949 1945
1950 Expression* value = ParseClassLiteral(nullptr, name, scanner()->location(), 1946 ExpressionClassifierWrapper wrap_no_classifier(this, nullptr, false);
1947 Expression* value = ParseClassLiteral(name, scanner()->location(),
1951 is_strict_reserved, pos, CHECK_OK); 1948 is_strict_reserved, pos, CHECK_OK);
1952 1949
1953 Declaration* decl = DeclareVariable(variable_name, LET, pos, CHECK_OK); 1950 Declaration* decl = DeclareVariable(variable_name, LET, pos, CHECK_OK);
1954 decl->proxy()->var()->set_initializer_position(position()); 1951 decl->proxy()->var()->set_initializer_position(position());
1955 Assignment* assignment = 1952 Assignment* assignment =
1956 factory()->NewAssignment(Token::INIT, decl->proxy(), value, pos); 1953 factory()->NewAssignment(Token::INIT, decl->proxy(), value, pos);
1957 Statement* assignment_statement = 1954 Statement* assignment_statement =
1958 factory()->NewExpressionStatement(assignment, kNoSourcePosition); 1955 factory()->NewExpressionStatement(assignment, kNoSourcePosition);
1959 if (names) names->Add(variable_name, zone()); 1956 if (names) names->Add(variable_name, zone());
1960 return assignment_statement; 1957 return assignment_statement;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
2080 int bindings_start = peek_position(); 2077 int bindings_start = peek_position();
2081 do { 2078 do {
2082 FuncNameInferrer::State fni_state(fni_); 2079 FuncNameInferrer::State fni_state(fni_);
2083 2080
2084 // Parse name. 2081 // Parse name.
2085 if (!first_declaration) Consume(Token::COMMA); 2082 if (!first_declaration) Consume(Token::COMMA);
2086 2083
2087 Expression* pattern; 2084 Expression* pattern;
2088 int decl_pos = peek_position(); 2085 int decl_pos = peek_position();
2089 { 2086 {
2090 ExpressionClassifier pattern_classifier(this); 2087 ExpressionClassifierWrapper wrap_pattern_classifier(this);
2091 pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); 2088 pattern = ParsePrimaryExpression(CHECK_OK);
2092 ValidateBindingPattern(&pattern_classifier, CHECK_OK); 2089 ValidateBindingPattern(CHECK_OK);
2093 if (IsLexicalVariableMode(parsing_result->descriptor.mode)) { 2090 if (IsLexicalVariableMode(parsing_result->descriptor.mode)) {
2094 ValidateLetPattern(&pattern_classifier, CHECK_OK); 2091 ValidateLetPattern(CHECK_OK);
2095 } 2092 }
2096 } 2093 }
2097 2094
2098 Scanner::Location variable_loc = scanner()->location(); 2095 Scanner::Location variable_loc = scanner()->location();
2099 const AstRawString* single_name = 2096 const AstRawString* single_name =
2100 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name() 2097 pattern->IsVariableProxy() ? pattern->AsVariableProxy()->raw_name()
2101 : nullptr; 2098 : nullptr;
2102 if (single_name != nullptr) { 2099 if (single_name != nullptr) {
2103 if (fni_ != NULL) fni_->PushVariableName(single_name); 2100 if (fni_ != NULL) fni_->PushVariableName(single_name);
2104 } 2101 }
2105 2102
2106 Expression* value = NULL; 2103 Expression* value = NULL;
2107 int initializer_position = kNoSourcePosition; 2104 int initializer_position = kNoSourcePosition;
2108 if (Check(Token::ASSIGN)) { 2105 if (Check(Token::ASSIGN)) {
2109 ExpressionClassifier classifier(this); 2106 ExpressionClassifierWrapper wrap_classifier(this);
2110 value = ParseAssignmentExpression(var_context != kForStatement, 2107 value = ParseAssignmentExpression(var_context != kForStatement, CHECK_OK);
2111 &classifier, CHECK_OK); 2108 RewriteNonPattern(CHECK_OK);
2112 RewriteNonPattern(&classifier, CHECK_OK);
2113 variable_loc.end_pos = scanner()->location().end_pos; 2109 variable_loc.end_pos = scanner()->location().end_pos;
2114 2110
2115 if (!parsing_result->first_initializer_loc.IsValid()) { 2111 if (!parsing_result->first_initializer_loc.IsValid()) {
2116 parsing_result->first_initializer_loc = variable_loc; 2112 parsing_result->first_initializer_loc = variable_loc;
2117 } 2113 }
2118 2114
2119 // Don't infer if it is "a = function(){...}();"-like expression. 2115 // Don't infer if it is "a = function(){...}();"-like expression.
2120 if (single_name) { 2116 if (single_name) {
2121 if (fni_ != NULL && value->AsCall() == NULL && 2117 if (fni_ != NULL && value->AsCall() == NULL &&
2122 value->AsCallNew() == NULL) { 2118 value->AsCallNew() == NULL) {
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
2695 { 2691 {
2696 BlockState block_state(&scope_state_); 2692 BlockState block_state(&scope_state_);
2697 block_state.set_start_position(scanner()->location().beg_pos); 2693 block_state.set_start_position(scanner()->location().beg_pos);
2698 Target target(&this->target_stack_, catch_block); 2694 Target target(&this->target_stack_, catch_block);
2699 2695
2700 const AstRawString* name = ast_value_factory()->dot_catch_string(); 2696 const AstRawString* name = ast_value_factory()->dot_catch_string();
2701 Expression* pattern = nullptr; 2697 Expression* pattern = nullptr;
2702 if (peek_any_identifier()) { 2698 if (peek_any_identifier()) {
2703 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK); 2699 name = ParseIdentifier(kDontAllowRestrictedIdentifiers, CHECK_OK);
2704 } else { 2700 } else {
2705 ExpressionClassifier pattern_classifier(this); 2701 ExpressionClassifierWrapper wrap_pattern_classifier(this);
2706 pattern = ParsePrimaryExpression(&pattern_classifier, CHECK_OK); 2702 pattern = ParsePrimaryExpression(CHECK_OK);
2707 ValidateBindingPattern(&pattern_classifier, CHECK_OK); 2703 ValidateBindingPattern(CHECK_OK);
2708 } 2704 }
2709 catch_variable = catch_scope->DeclareLocal( 2705 catch_variable = catch_scope->DeclareLocal(
2710 name, VAR, kCreatedInitialized, Variable::NORMAL); 2706 name, VAR, kCreatedInitialized, Variable::NORMAL);
2711 2707
2712 Expect(Token::RPAREN, CHECK_OK); 2708 Expect(Token::RPAREN, CHECK_OK);
2713 2709
2714 ZoneList<const AstRawString*> bound_names(1, zone()); 2710 ZoneList<const AstRawString*> bound_names(1, zone());
2715 if (pattern != nullptr) { 2711 if (pattern != nullptr) {
2716 DeclarationDescriptor descriptor; 2712 DeclarationDescriptor descriptor;
2717 descriptor.declaration_kind = DeclarationDescriptor::NORMAL; 2713 descriptor.declaration_kind = DeclarationDescriptor::NORMAL;
(...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after
3419 3415
3420 Variable* temp = NewTemporary(ast_value_factory()->dot_for_string()); 3416 Variable* temp = NewTemporary(ast_value_factory()->dot_for_string());
3421 ForEachStatement* loop = 3417 ForEachStatement* loop =
3422 factory()->NewForEachStatement(mode, labels, stmt_pos); 3418 factory()->NewForEachStatement(mode, labels, stmt_pos);
3423 Target target(&this->target_stack_, loop); 3419 Target target(&this->target_stack_, loop);
3424 3420
3425 int each_keyword_position = scanner()->location().beg_pos; 3421 int each_keyword_position = scanner()->location().beg_pos;
3426 3422
3427 Expression* enumerable; 3423 Expression* enumerable;
3428 if (mode == ForEachStatement::ITERATE) { 3424 if (mode == ForEachStatement::ITERATE) {
3429 ExpressionClassifier classifier(this); 3425 ExpressionClassifierWrapper wrap_classifier(this);
3430 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); 3426 enumerable = ParseAssignmentExpression(true, CHECK_OK);
3431 RewriteNonPattern(&classifier, CHECK_OK); 3427 RewriteNonPattern(CHECK_OK);
3432 } else { 3428 } else {
3433 enumerable = ParseExpression(true, CHECK_OK); 3429 enumerable = ParseExpression(true, CHECK_OK);
3434 } 3430 }
3435 3431
3436 Expect(Token::RPAREN, CHECK_OK); 3432 Expect(Token::RPAREN, CHECK_OK);
3437 3433
3438 3434
3439 Block* body_block = 3435 Block* body_block =
3440 factory()->NewBlock(NULL, 3, false, kNoSourcePosition); 3436 factory()->NewBlock(NULL, 3, false, kNoSourcePosition);
3441 3437
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
3534 return final_loop; 3530 return final_loop;
3535 } 3531 }
3536 } else { 3532 } else {
3537 bound_names_are_lexical = 3533 bound_names_are_lexical =
3538 IsLexicalVariableMode(parsing_result.descriptor.mode); 3534 IsLexicalVariableMode(parsing_result.descriptor.mode);
3539 init = parsing_result.BuildInitializationBlock( 3535 init = parsing_result.BuildInitializationBlock(
3540 bound_names_are_lexical ? &bound_names : nullptr, CHECK_OK); 3536 bound_names_are_lexical ? &bound_names : nullptr, CHECK_OK);
3541 } 3537 }
3542 } else { 3538 } else {
3543 int lhs_beg_pos = peek_position(); 3539 int lhs_beg_pos = peek_position();
3544 ExpressionClassifier classifier(this); 3540 ExpressionClassifierWrapper wrap_classifier(this);
3545 Expression* expression = ParseExpression(false, &classifier, CHECK_OK); 3541 Expression* expression = ParseExpressionNoWrap(false, CHECK_OK);
3546 int lhs_end_pos = scanner()->location().end_pos; 3542 int lhs_end_pos = scanner()->location().end_pos;
3547 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE; 3543 ForEachStatement::VisitMode mode = ForEachStatement::ENUMERATE;
3548 3544
3549 bool is_for_each = CheckInOrOf(&mode, CHECK_OK); 3545 bool is_for_each = CheckInOrOf(&mode, CHECK_OK);
3550 bool is_destructuring = is_for_each && (expression->IsArrayLiteral() || 3546 bool is_destructuring = is_for_each && (expression->IsArrayLiteral() ||
3551 expression->IsObjectLiteral()); 3547 expression->IsObjectLiteral());
3552 3548
3553 if (is_destructuring) { 3549 if (is_destructuring) {
3554 ValidateAssignmentPattern(&classifier, CHECK_OK); 3550 ValidateAssignmentPattern(CHECK_OK);
3555 } else { 3551 } else {
3556 RewriteNonPattern(&classifier, CHECK_OK); 3552 RewriteNonPattern(CHECK_OK);
3557 } 3553 }
3558 3554
3559 if (is_for_each) { 3555 if (is_for_each) {
3560 if (!is_destructuring) { 3556 if (!is_destructuring) {
3561 expression = CheckAndRewriteReferenceExpression( 3557 expression = CheckAndRewriteReferenceExpression(
3562 expression, lhs_beg_pos, lhs_end_pos, 3558 expression, lhs_beg_pos, lhs_end_pos,
3563 MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK); 3559 MessageTemplate::kInvalidLhsInFor, kSyntaxError, CHECK_OK);
3564 } 3560 }
3565 3561
3566 ForEachStatement* loop = 3562 ForEachStatement* loop =
3567 factory()->NewForEachStatement(mode, labels, stmt_pos); 3563 factory()->NewForEachStatement(mode, labels, stmt_pos);
3568 Target target(&this->target_stack_, loop); 3564 Target target(&this->target_stack_, loop);
3569 3565
3570 int each_keyword_position = scanner()->location().beg_pos; 3566 int each_keyword_position = scanner()->location().beg_pos;
3571 3567
3572 Expression* enumerable; 3568 Expression* enumerable;
3573 if (mode == ForEachStatement::ITERATE) { 3569 if (mode == ForEachStatement::ITERATE) {
3574 ExpressionClassifier classifier(this); 3570 ExpressionClassifierWrapper wrap_classifier(this);
3575 enumerable = ParseAssignmentExpression(true, &classifier, CHECK_OK); 3571 enumerable = ParseAssignmentExpression(true, CHECK_OK);
3576 RewriteNonPattern(&classifier, CHECK_OK); 3572 RewriteNonPattern(CHECK_OK);
3577 } else { 3573 } else {
3578 enumerable = ParseExpression(true, CHECK_OK); 3574 enumerable = ParseExpression(true, CHECK_OK);
3579 } 3575 }
3580 3576
3581 Expect(Token::RPAREN, CHECK_OK); 3577 Expect(Token::RPAREN, CHECK_OK);
3582 3578
3583 // For legacy compat reasons, give for loops similar treatment to 3579 // For legacy compat reasons, give for loops similar treatment to
3584 // if statements in allowing a function declaration for a body 3580 // if statements in allowing a function declaration for a body
3585 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK); 3581 Statement* body = ParseScopedStatement(NULL, true, CHECK_OK);
3586 Statement* final_loop = InitializeForEachStatement( 3582 Statement* final_loop = InitializeForEachStatement(
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
3780 DCHECK(!assignment->is_compound()); 3776 DCHECK(!assignment->is_compound());
3781 initializer = assignment->value(); 3777 initializer = assignment->value();
3782 expr = assignment->target(); 3778 expr = assignment->target();
3783 } 3779 }
3784 3780
3785 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest); 3781 AddFormalParameter(parameters, expr, initializer, end_pos, is_rest);
3786 } 3782 }
3787 3783
3788 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name, 3784 void Parser::DesugarAsyncFunctionBody(const AstRawString* function_name,
3789 Scope* scope, ZoneList<Statement*>* body, 3785 Scope* scope, ZoneList<Statement*>* body,
3790 ExpressionClassifier* classifier,
3791 FunctionKind kind, 3786 FunctionKind kind,
3792 FunctionBodyType body_type, 3787 FunctionBodyType body_type,
3793 bool accept_IN, int pos, bool* ok) { 3788 bool accept_IN, int pos, bool* ok) {
3794 // function async_function() { 3789 // function async_function() {
3795 // .generator_object = %CreateGeneratorObject(); 3790 // .generator_object = %CreateGeneratorObject();
3796 // BuildRejectPromiseOnException({ 3791 // BuildRejectPromiseOnException({
3797 // ... function body ... 3792 // ... function body ...
3798 // return %ResolvePromise(.promise, expr), .promise; 3793 // return %ResolvePromise(.promise, expr), .promise;
3799 // }) 3794 // })
3800 // } 3795 // }
3801 scope->ForceContextAllocation(); 3796 scope->ForceContextAllocation();
3802 Variable* temp = 3797 Variable* temp =
3803 NewTemporary(ast_value_factory()->dot_generator_object_string()); 3798 NewTemporary(ast_value_factory()->dot_generator_object_string());
3804 function_state_->set_generator_object_variable(temp); 3799 function_state_->set_generator_object_variable(temp);
3805 3800
3806 Expression* init_generator_variable = factory()->NewAssignment( 3801 Expression* init_generator_variable = factory()->NewAssignment(
3807 Token::INIT, factory()->NewVariableProxy(temp), 3802 Token::INIT, factory()->NewVariableProxy(temp),
3808 BuildCreateJSGeneratorObject(pos, kind), kNoSourcePosition); 3803 BuildCreateJSGeneratorObject(pos, kind), kNoSourcePosition);
3809 body->Add(factory()->NewExpressionStatement(init_generator_variable, 3804 body->Add(factory()->NewExpressionStatement(init_generator_variable,
3810 kNoSourcePosition), 3805 kNoSourcePosition),
3811 zone()); 3806 zone());
3812 3807
3813 Block* block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition); 3808 Block* block = factory()->NewBlock(NULL, 8, true, kNoSourcePosition);
3814 3809
3815 Expression* return_value = nullptr; 3810 Expression* return_value = nullptr;
3816 if (body_type == FunctionBodyType::kNormal) { 3811 if (body_type == FunctionBodyType::kNormal) {
3817 ParseStatementList(block->statements(), Token::RBRACE, CHECK_OK_VOID); 3812 ParseStatementList(block->statements(), Token::RBRACE, CHECK_OK_VOID);
3818 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition); 3813 return_value = factory()->NewUndefinedLiteral(kNoSourcePosition);
3819 } else { 3814 } else {
3820 return_value = 3815 return_value = ParseAssignmentExpression(accept_IN, CHECK_OK_VOID);
3821 ParseAssignmentExpression(accept_IN, classifier, CHECK_OK_VOID); 3816 RewriteNonPattern(CHECK_OK_VOID);
3822 RewriteNonPattern(classifier, CHECK_OK_VOID);
3823 } 3817 }
3824 3818
3825 return_value = BuildResolvePromise(return_value, return_value->position()); 3819 return_value = BuildResolvePromise(return_value, return_value->position());
3826 block->statements()->Add( 3820 block->statements()->Add(
3827 factory()->NewReturnStatement(return_value, return_value->position()), 3821 factory()->NewReturnStatement(return_value, return_value->position()),
3828 zone()); 3822 zone());
3829 block = BuildRejectPromiseOnException(block, CHECK_OK_VOID); 3823 block = BuildRejectPromiseOnException(block, CHECK_OK_VOID);
3830 body->Add(block, zone()); 3824 body->Add(block, zone());
3831 scope->set_end_position(scanner()->location().end_pos); 3825 scope->set_end_position(scanner()->location().end_pos);
3832 } 3826 }
(...skipping 24 matching lines...) Expand all
3857 CHECK_OK_VOID); 3851 CHECK_OK_VOID);
3858 3852
3859 scope_snapshot.Reparent(parameters->scope); 3853 scope_snapshot.Reparent(parameters->scope);
3860 3854
3861 if (parameters->Arity() > Code::kMaxArguments) { 3855 if (parameters->Arity() > Code::kMaxArguments) {
3862 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList); 3856 ReportMessageAt(params_loc, MessageTemplate::kMalformedArrowFunParamList);
3863 *ok = false; 3857 *ok = false;
3864 return; 3858 return;
3865 } 3859 }
3866 3860
3867 ExpressionClassifier classifier(this); 3861 ExpressionClassifierWrapper wrap_classifier(this);
3868 if (!parameters->is_simple) { 3862 if (!parameters->is_simple) {
3869 classifier.RecordNonSimpleParameter(); 3863 classifier()->RecordNonSimpleParameter();
3870 } 3864 }
3871 for (int i = 0; i < parameters->Arity(); ++i) { 3865 for (int i = 0; i < parameters->Arity(); ++i) {
3872 auto parameter = parameters->at(i); 3866 auto parameter = parameters->at(i);
3873 DeclareFormalParameter(parameters->scope, parameter, &classifier); 3867 DeclareFormalParameter(parameters->scope, parameter);
3874 if (!duplicate_loc->IsValid()) { 3868 if (!duplicate_loc->IsValid()) {
3875 *duplicate_loc = classifier.duplicate_formal_parameter_error().location; 3869 *duplicate_loc =
3870 classifier()->duplicate_formal_parameter_error().location;
3876 } 3871 }
3877 } 3872 }
3878 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters()); 3873 DCHECK_EQ(parameters->is_simple, parameters->scope->has_simple_parameters());
3879 } 3874 }
3880 3875
3881 void Parser::ReindexLiterals(const ParserFormalParameters& parameters) { 3876 void Parser::ReindexLiterals(const ParserFormalParameters& parameters) {
3882 if (function_state_->materialized_literal_count() > 0) { 3877 if (function_state_->materialized_literal_count() > 0) {
3883 AstLiteralReindexer reindexer; 3878 AstLiteralReindexer reindexer;
3884 3879
3885 for (const auto p : parameters.params) { 3880 for (const auto p : parameters.params) {
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
4019 if (!use_temp_zone) { 4014 if (!use_temp_zone) {
4020 main_scope = scope; 4015 main_scope = scope;
4021 } else { 4016 } else {
4022 DCHECK(main_scope->zone() != scope->zone()); 4017 DCHECK(main_scope->zone() != scope->zone());
4023 } 4018 }
4024 4019
4025 FunctionState function_state(&function_state_, &scope_state_, scope, kind); 4020 FunctionState function_state(&function_state_, &scope_state_, scope, kind);
4026 #ifdef DEBUG 4021 #ifdef DEBUG
4027 scope->SetScopeName(function_name); 4022 scope->SetScopeName(function_name);
4028 #endif 4023 #endif
4029 ExpressionClassifier formals_classifier(this, &duplicate_finder); 4024 ExpressionClassifierWrapper wrap_formals_classifier(this,
4025 &duplicate_finder);
4030 4026
4031 if (is_generator) { 4027 if (is_generator) {
4032 // For generators, allocating variables in contexts is currently a win 4028 // For generators, allocating variables in contexts is currently a win
4033 // because it minimizes the work needed to suspend and resume an 4029 // because it minimizes the work needed to suspend and resume an
4034 // activation. The machine code produced for generators (by full-codegen) 4030 // activation. The machine code produced for generators (by full-codegen)
4035 // relies on this forced context allocation, but not in an essential way. 4031 // relies on this forced context allocation, but not in an essential way.
4036 this->scope()->ForceContextAllocation(); 4032 this->scope()->ForceContextAllocation();
4037 4033
4038 // Calling a generator returns a generator object. That object is stored 4034 // Calling a generator returns a generator object. That object is stored
4039 // in a temporary variable, a definition that is used by "yield" 4035 // in a temporary variable, a definition that is used by "yield"
4040 // expressions. This also marks the FunctionState as a generator. 4036 // expressions. This also marks the FunctionState as a generator.
4041 Variable* temp = 4037 Variable* temp =
4042 NewTemporary(ast_value_factory()->dot_generator_object_string()); 4038 NewTemporary(ast_value_factory()->dot_generator_object_string());
4043 function_state.set_generator_object_variable(temp); 4039 function_state.set_generator_object_variable(temp);
4044 } 4040 }
4045 4041
4046 Expect(Token::LPAREN, CHECK_OK); 4042 Expect(Token::LPAREN, CHECK_OK);
4047 int start_position = scanner()->location().beg_pos; 4043 int start_position = scanner()->location().beg_pos;
4048 this->scope()->set_start_position(start_position); 4044 this->scope()->set_start_position(start_position);
4049 ParserFormalParameters formals(scope); 4045 ParserFormalParameters formals(scope);
4050 ParseFormalParameterList(&formals, &formals_classifier, CHECK_OK); 4046 ParseFormalParameterList(&formals, CHECK_OK);
4051 arity = formals.Arity(); 4047 arity = formals.Arity();
4052 Expect(Token::RPAREN, CHECK_OK); 4048 Expect(Token::RPAREN, CHECK_OK);
4053 int formals_end_position = scanner()->location().end_pos; 4049 int formals_end_position = scanner()->location().end_pos;
4054 4050
4055 CheckArityRestrictions(arity, kind, formals.has_rest, start_position, 4051 CheckArityRestrictions(arity, kind, formals.has_rest, start_position,
4056 formals_end_position, CHECK_OK); 4052 formals_end_position, CHECK_OK);
4057 Expect(Token::LBRACE, CHECK_OK); 4053 Expect(Token::LBRACE, CHECK_OK);
4058 // Don't include the rest parameter into the function's formal parameter 4054 // Don't include the rest parameter into the function's formal parameter
4059 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count, 4055 // count (esp. the SharedFunctionInfo::internal_formal_parameter_count,
4060 // which says whether we need to create an arguments adaptor frame). 4056 // which says whether we need to create an arguments adaptor frame).
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4102 4098
4103 // Parsing the body may change the language mode in our scope. 4099 // Parsing the body may change the language mode in our scope.
4104 language_mode = scope->language_mode(); 4100 language_mode = scope->language_mode();
4105 4101
4106 // Validate name and parameter names. We can do this only after parsing the 4102 // Validate name and parameter names. We can do this only after parsing the
4107 // function, since the function can declare itself strict. 4103 // function, since the function can declare itself strict.
4108 CheckFunctionName(language_mode, function_name, function_name_validity, 4104 CheckFunctionName(language_mode, function_name, function_name_validity,
4109 function_name_location, CHECK_OK); 4105 function_name_location, CHECK_OK);
4110 const bool allow_duplicate_parameters = 4106 const bool allow_duplicate_parameters =
4111 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind); 4107 is_sloppy(language_mode) && formals.is_simple && !IsConciseMethod(kind);
4112 ValidateFormalParameters(&formals_classifier, language_mode, 4108 ValidateFormalParameters(language_mode, allow_duplicate_parameters,
4113 allow_duplicate_parameters, CHECK_OK); 4109 CHECK_OK);
4114 4110
4115 if (is_strict(language_mode)) { 4111 if (is_strict(language_mode)) {
4116 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(), 4112 CheckStrictOctalLiteral(scope->start_position(), scope->end_position(),
4117 CHECK_OK); 4113 CHECK_OK);
4118 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(), 4114 CheckDecimalLiteralWithLeadingZero(use_counts_, scope->start_position(),
4119 scope->end_position()); 4115 scope->end_position());
4120 } 4116 }
4121 CheckConflictingVarDeclarations(scope, CHECK_OK); 4117 CheckConflictingVarDeclarations(scope, CHECK_OK);
4122 4118
4123 if (body) { 4119 if (body) {
4124 // If body can be inspected, rewrite queued destructuring assignments 4120 // If body can be inspected, rewrite queued destructuring assignments
4125 RewriteDestructuringAssignments(); 4121 RewriteDestructuringAssignments();
4126 } 4122 }
4127 has_duplicate_parameters = 4123 has_duplicate_parameters =
4128 !formals_classifier.is_valid_formal_parameter_list_without_duplicates(); 4124 !classifier()->is_valid_formal_parameter_list_without_duplicates();
4129 4125
4130 if (use_temp_zone) { 4126 if (use_temp_zone) {
4131 DCHECK(main_scope != scope); 4127 DCHECK(main_scope != scope);
4132 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory); 4128 scope->AnalyzePartially(main_scope, &previous_zone_ast_node_factory);
4133 } 4129 }
4134 } // DiscardableZoneScope goes out of scope. 4130 } // DiscardableZoneScope goes out of scope.
4135 4131
4136 FunctionLiteral::ParameterFlag duplicate_parameters = 4132 FunctionLiteral::ParameterFlag duplicate_parameters =
4137 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters 4133 has_duplicate_parameters ? FunctionLiteral::kHasDuplicateParameters
4138 : FunctionLiteral::kNoDuplicateParameters; 4134 : FunctionLiteral::kNoDuplicateParameters;
(...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after
4619 Expression* call = factory()->NewCallRuntime( 4615 Expression* call = factory()->NewCallRuntime(
4620 Runtime::kInlineGeneratorClose, args, kNoSourcePosition); 4616 Runtime::kInlineGeneratorClose, args, kNoSourcePosition);
4621 finally_block->statements()->Add( 4617 finally_block->statements()->Add(
4622 factory()->NewExpressionStatement(call, kNoSourcePosition), zone()); 4618 factory()->NewExpressionStatement(call, kNoSourcePosition), zone());
4623 4619
4624 body->Add(factory()->NewTryFinallyStatement(try_block, finally_block, 4620 body->Add(factory()->NewTryFinallyStatement(try_block, finally_block,
4625 kNoSourcePosition), 4621 kNoSourcePosition),
4626 zone()); 4622 zone());
4627 } else if (IsAsyncFunction(kind)) { 4623 } else if (IsAsyncFunction(kind)) {
4628 const bool accept_IN = true; 4624 const bool accept_IN = true;
4629 DesugarAsyncFunctionBody(function_name, inner_scope, body, nullptr, kind, 4625 DesugarAsyncFunctionBody(function_name, inner_scope, body, kind,
4630 FunctionBodyType::kNormal, accept_IN, pos, 4626 FunctionBodyType::kNormal, accept_IN, pos,
4631 CHECK_OK); 4627 CHECK_OK);
4632 } else { 4628 } else {
4633 ParseStatementList(body, Token::RBRACE, CHECK_OK); 4629 ParseStatementList(body, Token::RBRACE, CHECK_OK);
4634 } 4630 }
4635 4631
4636 if (IsSubclassConstructor(kind)) { 4632 if (IsSubclassConstructor(kind)) {
4637 body->Add(factory()->NewReturnStatement(ThisExpression(kNoSourcePosition), 4633 body->Add(factory()->NewReturnStatement(ThisExpression(kNoSourcePosition),
4638 kNoSourcePosition), 4634 kNoSourcePosition),
4639 zone()); 4635 zone());
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
4726 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction( 4722 PreParser::PreParseResult result = reusable_preparser_->PreParseLazyFunction(
4727 language_mode(), function_state_->kind(), 4723 language_mode(), function_state_->kind(),
4728 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_, 4724 scope()->AsDeclarationScope()->has_simple_parameters(), parsing_module_,
4729 logger, bookmark, use_counts_); 4725 logger, bookmark, use_counts_);
4730 if (pre_parse_timer_ != NULL) { 4726 if (pre_parse_timer_ != NULL) {
4731 pre_parse_timer_->Stop(); 4727 pre_parse_timer_->Stop();
4732 } 4728 }
4733 return result; 4729 return result;
4734 } 4730 }
4735 4731
4736 Expression* Parser::ParseClassLiteral(ExpressionClassifier* classifier, 4732 Expression* Parser::ParseClassLiteral(const AstRawString* name,
4737 const AstRawString* name,
4738 Scanner::Location class_name_location, 4733 Scanner::Location class_name_location,
4739 bool name_is_strict_reserved, int pos, 4734 bool name_is_strict_reserved, int pos,
4740 bool* ok) { 4735 bool* ok) {
4741 // All parts of a ClassDeclaration and ClassExpression are strict code. 4736 // All parts of a ClassDeclaration and ClassExpression are strict code.
4742 if (name_is_strict_reserved) { 4737 if (name_is_strict_reserved) {
4743 ReportMessageAt(class_name_location, 4738 ReportMessageAt(class_name_location,
4744 MessageTemplate::kUnexpectedStrictReserved); 4739 MessageTemplate::kUnexpectedStrictReserved);
4745 *ok = false; 4740 *ok = false;
4746 return nullptr; 4741 return nullptr;
4747 } 4742 }
(...skipping 15 matching lines...) Expand all
4763 // TODO(verwaest): declare via block_state. 4758 // TODO(verwaest): declare via block_state.
4764 Declaration* declaration = 4759 Declaration* declaration =
4765 factory()->NewVariableDeclaration(proxy, block_state.scope(), pos); 4760 factory()->NewVariableDeclaration(proxy, block_state.scope(), pos);
4766 Declare(declaration, DeclarationDescriptor::NORMAL, CONST, 4761 Declare(declaration, DeclarationDescriptor::NORMAL, CONST,
4767 DefaultInitializationFlag(CONST), CHECK_OK); 4762 DefaultInitializationFlag(CONST), CHECK_OK);
4768 } 4763 }
4769 4764
4770 Expression* extends = nullptr; 4765 Expression* extends = nullptr;
4771 if (Check(Token::EXTENDS)) { 4766 if (Check(Token::EXTENDS)) {
4772 block_state.set_start_position(scanner()->location().end_pos); 4767 block_state.set_start_position(scanner()->location().end_pos);
4773 ExpressionClassifier extends_classifier(this); 4768 ExpressionClassifierWrapper wrap_extends_classifier(this);
4774 extends = ParseLeftHandSideExpression(&extends_classifier, CHECK_OK); 4769 extends = ParseLeftHandSideExpression(CHECK_OK);
4775 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK); 4770 CheckNoTailCallExpressions(CHECK_OK);
4776 RewriteNonPattern(&extends_classifier, CHECK_OK); 4771 RewriteNonPattern(CHECK_OK);
4777 if (classifier != nullptr) { 4772 impl()->AccumulateFormalParameterContainmentErrors();
4778 classifier->AccumulateFormalParameterContainmentErrors(
4779 &extends_classifier);
4780 }
4781 } else { 4773 } else {
4782 block_state.set_start_position(scanner()->location().end_pos); 4774 block_state.set_start_position(scanner()->location().end_pos);
4783 } 4775 }
4784 4776
4785 4777
4786 ClassLiteralChecker checker(this); 4778 ClassLiteralChecker checker(this);
4787 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4); 4779 ZoneList<ObjectLiteral::Property*>* properties = NewPropertyList(4);
4788 FunctionLiteral* constructor = nullptr; 4780 FunctionLiteral* constructor = nullptr;
4789 bool has_seen_constructor = false; 4781 bool has_seen_constructor = false;
4790 4782
4791 Expect(Token::LBRACE, CHECK_OK); 4783 Expect(Token::LBRACE, CHECK_OK);
4792 4784
4793 const bool has_extends = extends != nullptr; 4785 const bool has_extends = extends != nullptr;
4794 while (peek() != Token::RBRACE) { 4786 while (peek() != Token::RBRACE) {
4795 if (Check(Token::SEMICOLON)) continue; 4787 if (Check(Token::SEMICOLON)) continue;
4796 FuncNameInferrer::State fni_state(fni_); 4788 FuncNameInferrer::State fni_state(fni_);
4797 const bool in_class = true; 4789 const bool in_class = true;
4798 bool is_computed_name = false; // Classes do not care about computed 4790 bool is_computed_name = false; // Classes do not care about computed
4799 // property names here. 4791 // property names here.
4800 ExpressionClassifier property_classifier(this); 4792 ExpressionClassifierWrapper wrap_property_classifier(this);
4801 const AstRawString* property_name = nullptr; 4793 const AstRawString* property_name = nullptr;
4802 ObjectLiteral::Property* property = ParsePropertyDefinition( 4794 ObjectLiteral::Property* property = ParsePropertyDefinition(
4803 &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name, 4795 &checker, in_class, has_extends, MethodKind::kNormal, &is_computed_name,
4804 &has_seen_constructor, &property_classifier, &property_name, CHECK_OK); 4796 &has_seen_constructor, &property_name, CHECK_OK);
4805 RewriteNonPattern(&property_classifier, CHECK_OK); 4797 RewriteNonPattern(CHECK_OK);
4806 if (classifier != nullptr) { 4798 impl()->AccumulateFormalParameterContainmentErrors();
4807 classifier->AccumulateFormalParameterContainmentErrors(
4808 &property_classifier);
4809 }
4810 4799
4811 if (has_seen_constructor && constructor == nullptr) { 4800 if (has_seen_constructor && constructor == nullptr) {
4812 constructor = GetPropertyValue(property)->AsFunctionLiteral(); 4801 constructor = GetPropertyValue(property)->AsFunctionLiteral();
4813 DCHECK_NOT_NULL(constructor); 4802 DCHECK_NOT_NULL(constructor);
4814 constructor->set_raw_name( 4803 constructor->set_raw_name(
4815 name != nullptr ? name : ast_value_factory()->empty_string()); 4804 name != nullptr ? name : ast_value_factory()->empty_string());
4816 } else { 4805 } else {
4817 properties->Add(property, zone()); 4806 properties->Add(property, zone());
4818 } 4807 }
4819 4808
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
4861 Expression* Parser::ParseV8Intrinsic(bool* ok) { 4850 Expression* Parser::ParseV8Intrinsic(bool* ok) {
4862 // CallRuntime :: 4851 // CallRuntime ::
4863 // '%' Identifier Arguments 4852 // '%' Identifier Arguments
4864 4853
4865 int pos = peek_position(); 4854 int pos = peek_position();
4866 Expect(Token::MOD, CHECK_OK); 4855 Expect(Token::MOD, CHECK_OK);
4867 // Allow "eval" or "arguments" for backward compatibility. 4856 // Allow "eval" or "arguments" for backward compatibility.
4868 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers, 4857 const AstRawString* name = ParseIdentifier(kAllowRestrictedIdentifiers,
4869 CHECK_OK); 4858 CHECK_OK);
4870 Scanner::Location spread_pos; 4859 Scanner::Location spread_pos;
4871 ExpressionClassifier classifier(this); 4860 ExpressionClassifierWrapper wrap_classifier(this);
4872 ZoneList<Expression*>* args = 4861 ZoneList<Expression*>* args = ParseArguments(&spread_pos, CHECK_OK);
4873 ParseArguments(&spread_pos, &classifier, CHECK_OK);
4874 4862
4875 DCHECK(!spread_pos.IsValid()); 4863 DCHECK(!spread_pos.IsValid());
4876 4864
4877 if (extension_ != NULL) { 4865 if (extension_ != NULL) {
4878 // The extension structures are only accessible while parsing the 4866 // The extension structures are only accessible while parsing the
4879 // very first time not when reparsing because of lazy compilation. 4867 // very first time not when reparsing because of lazy compilation.
4880 GetClosureScope()->ForceEagerCompilation(); 4868 GetClosureScope()->ForceEagerCompilation();
4881 } 4869 }
4882 4870
4883 const Runtime::Function* function = Runtime::FunctionForName(name->string()); 4871 const Runtime::Function* function = Runtime::FunctionForName(name->string());
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after
5582 5570
5583 void VisitObjectLiteralProperty(ObjectLiteralProperty* property) override { 5571 void VisitObjectLiteralProperty(ObjectLiteralProperty* property) override {
5584 if (property == nullptr) return; 5572 if (property == nullptr) return;
5585 // Do not rewrite (computed) key expressions 5573 // Do not rewrite (computed) key expressions
5586 AST_REWRITE_PROPERTY(Expression, property, value); 5574 AST_REWRITE_PROPERTY(Expression, property, value);
5587 } 5575 }
5588 5576
5589 Parser* parser_; 5577 Parser* parser_;
5590 }; 5578 };
5591 5579
5592 5580 void Parser::RewriteNonPattern(bool* ok) {
5593 void Parser::RewriteNonPattern(ExpressionClassifier* classifier, bool* ok) { 5581 ValidateExpression(CHECK_OK_VOID);
5594 ValidateExpression(classifier, CHECK_OK_VOID);
5595 auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite(); 5582 auto non_patterns_to_rewrite = function_state_->non_patterns_to_rewrite();
5596 int begin = classifier->GetNonPatternBegin(); 5583 int begin = classifier()->GetNonPatternBegin();
5597 int end = non_patterns_to_rewrite->length(); 5584 int end = non_patterns_to_rewrite->length();
5598 if (begin < end) { 5585 if (begin < end) {
5599 NonPatternRewriter rewriter(stack_limit_, this); 5586 NonPatternRewriter rewriter(stack_limit_, this);
5600 for (int i = begin; i < end; i++) { 5587 for (int i = begin; i < end; i++) {
5601 DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression()); 5588 DCHECK(non_patterns_to_rewrite->at(i)->IsRewritableExpression());
5602 rewriter.Rewrite(non_patterns_to_rewrite->at(i)); 5589 rewriter.Rewrite(non_patterns_to_rewrite->at(i));
5603 } 5590 }
5604 non_patterns_to_rewrite->Rewind(begin); 5591 non_patterns_to_rewrite->Rewind(begin);
5605 } 5592 }
5606 } 5593 }
(...skipping 1134 matching lines...) Expand 10 before | Expand all | Expand 10 after
6741 node->Print(Isolate::Current()); 6728 node->Print(Isolate::Current());
6742 } 6729 }
6743 #endif // DEBUG 6730 #endif // DEBUG
6744 6731
6745 #undef CHECK_OK 6732 #undef CHECK_OK
6746 #undef CHECK_OK_VOID 6733 #undef CHECK_OK_VOID
6747 #undef CHECK_FAILED 6734 #undef CHECK_FAILED
6748 6735
6749 } // namespace internal 6736 } // namespace internal
6750 } // namespace v8 6737 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser.h ('k') | src/parsing/parser-base.h » ('j') | src/parsing/parser-base.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698