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

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

Issue 2166843003: Allocate block scopes in block states when possible (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 4 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
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 <cmath> 5 #include <cmath>
6 6
7 #include "src/allocation.h" 7 #include "src/allocation.h"
8 #include "src/base/logging.h" 8 #include "src/base/logging.h"
9 #include "src/conversions-inl.h" 9 #include "src/conversions-inl.h"
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 return Statement::Default(); 298 return Statement::Default();
299 } 299 }
300 return ParseSubStatement(allow_function, ok); 300 return ParseSubStatement(allow_function, ok);
301 } 301 }
302 302
303 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) { 303 PreParser::Statement PreParser::ParseScopedStatement(bool legacy, bool* ok) {
304 if (is_strict(language_mode()) || peek() != Token::FUNCTION || 304 if (is_strict(language_mode()) || peek() != Token::FUNCTION ||
305 (legacy && allow_harmony_restrictive_declarations())) { 305 (legacy && allow_harmony_restrictive_declarations())) {
306 return ParseSubStatement(kDisallowLabelledFunctionStatement, ok); 306 return ParseSubStatement(kDisallowLabelledFunctionStatement, ok);
307 } else { 307 } else {
308 Scope* body_scope = NewScope(BLOCK_SCOPE); 308 BlockState block_state(&scope_state_);
309 BlockState block_state(&scope_state_, body_scope);
310 return ParseFunctionDeclaration(ok); 309 return ParseFunctionDeclaration(ok);
311 } 310 }
312 } 311 }
313 312
314 PreParser::Statement PreParser::ParseSubStatement( 313 PreParser::Statement PreParser::ParseSubStatement(
315 AllowLabelledFunctionStatement allow_function, bool* ok) { 314 AllowLabelledFunctionStatement allow_function, bool* ok) {
316 // Statement :: 315 // Statement ::
317 // Block 316 // Block
318 // VariableStatement 317 // VariableStatement
319 // EmptyStatement 318 // EmptyStatement
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
469 ParseClassLiteral(nullptr, name, scanner()->location(), is_strict_reserved, 468 ParseClassLiteral(nullptr, name, scanner()->location(), is_strict_reserved,
470 pos, CHECK_OK); 469 pos, CHECK_OK);
471 return Statement::Default(); 470 return Statement::Default();
472 } 471 }
473 472
474 473
475 PreParser::Statement PreParser::ParseBlock(bool* ok) { 474 PreParser::Statement PreParser::ParseBlock(bool* ok) {
476 // Block :: 475 // Block ::
477 // '{' StatementList '}' 476 // '{' StatementList '}'
478 477
479 Scope* block_scope = NewScope(BLOCK_SCOPE);
480 Expect(Token::LBRACE, CHECK_OK); 478 Expect(Token::LBRACE, CHECK_OK);
481 Statement final = Statement::Default(); 479 Statement final = Statement::Default();
482 { 480 {
483 BlockState block_state(&scope_state_, block_scope); 481 BlockState block_state(&scope_state_);
484 while (peek() != Token::RBRACE) { 482 while (peek() != Token::RBRACE) {
485 final = ParseStatementListItem(CHECK_OK); 483 final = ParseStatementListItem(CHECK_OK);
486 } 484 }
487 } 485 }
488 Expect(Token::RBRACE, ok); 486 Expect(Token::RBRACE, ok);
489 return final; 487 return final;
490 } 488 }
491 489
492 490
493 PreParser::Statement PreParser::ParseVariableStatement( 491 PreParser::Statement PreParser::ParseVariableStatement(
(...skipping 304 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 796
799 PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) { 797 PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) {
800 // SwitchStatement :: 798 // SwitchStatement ::
801 // 'switch' '(' Expression ')' '{' CaseClause* '}' 799 // 'switch' '(' Expression ')' '{' CaseClause* '}'
802 800
803 Expect(Token::SWITCH, CHECK_OK); 801 Expect(Token::SWITCH, CHECK_OK);
804 Expect(Token::LPAREN, CHECK_OK); 802 Expect(Token::LPAREN, CHECK_OK);
805 ParseExpression(true, CHECK_OK); 803 ParseExpression(true, CHECK_OK);
806 Expect(Token::RPAREN, CHECK_OK); 804 Expect(Token::RPAREN, CHECK_OK);
807 805
808 Scope* cases_scope = NewScope(BLOCK_SCOPE);
809 { 806 {
810 BlockState cases_block_state(&scope_state_, cases_scope); 807 BlockState cases_block_state(&scope_state_);
811 Expect(Token::LBRACE, CHECK_OK); 808 Expect(Token::LBRACE, CHECK_OK);
812 Token::Value token = peek(); 809 Token::Value token = peek();
813 while (token != Token::RBRACE) { 810 while (token != Token::RBRACE) {
814 if (token == Token::CASE) { 811 if (token == Token::CASE) {
815 Expect(Token::CASE, CHECK_OK); 812 Expect(Token::CASE, CHECK_OK);
816 ParseExpression(true, CHECK_OK); 813 ParseExpression(true, CHECK_OK);
817 } else { 814 } else {
818 Expect(Token::DEFAULT, CHECK_OK); 815 Expect(Token::DEFAULT, CHECK_OK);
819 } 816 }
820 Expect(Token::COLON, CHECK_OK); 817 Expect(Token::COLON, CHECK_OK);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 ParseScopedStatement(true, ok); 856 ParseScopedStatement(true, ok);
860 return Statement::Default(); 857 return Statement::Default();
861 } 858 }
862 859
863 860
864 PreParser::Statement PreParser::ParseForStatement(bool* ok) { 861 PreParser::Statement PreParser::ParseForStatement(bool* ok) {
865 // ForStatement :: 862 // ForStatement ::
866 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement 863 // 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
867 864
868 // Create an in-between scope for let-bound iteration variables. 865 // Create an in-between scope for let-bound iteration variables.
869 Scope* for_scope = NewScope(BLOCK_SCOPE);
870 bool has_lexical = false; 866 bool has_lexical = false;
871 867
872 BlockState block_state(&scope_state_, for_scope); 868 BlockState block_state(&scope_state_);
873 Expect(Token::FOR, CHECK_OK); 869 Expect(Token::FOR, CHECK_OK);
874 Expect(Token::LPAREN, CHECK_OK); 870 Expect(Token::LPAREN, CHECK_OK);
875 if (peek() != Token::SEMICOLON) { 871 if (peek() != Token::SEMICOLON) {
876 ForEachStatement::VisitMode mode; 872 ForEachStatement::VisitMode mode;
877 if (peek() == Token::VAR || peek() == Token::CONST || 873 if (peek() == Token::VAR || peek() == Token::CONST ||
878 (peek() == Token::LET && IsNextLetKeyword())) { 874 (peek() == Token::LET && IsNextLetKeyword())) {
879 int decl_count; 875 int decl_count;
880 bool is_lexical; 876 bool is_lexical;
881 bool is_binding_pattern; 877 bool is_binding_pattern;
882 Scanner::Location first_initializer_loc = Scanner::Location::invalid(); 878 Scanner::Location first_initializer_loc = Scanner::Location::invalid();
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
949 945
950 if (mode == ForEachStatement::ITERATE) { 946 if (mode == ForEachStatement::ITERATE) {
951 ExpressionClassifier classifier(this); 947 ExpressionClassifier classifier(this);
952 ParseAssignmentExpression(true, &classifier, CHECK_OK); 948 ParseAssignmentExpression(true, &classifier, CHECK_OK);
953 RewriteNonPattern(&classifier, CHECK_OK); 949 RewriteNonPattern(&classifier, CHECK_OK);
954 } else { 950 } else {
955 ParseExpression(true, CHECK_OK); 951 ParseExpression(true, CHECK_OK);
956 } 952 }
957 953
958 Expect(Token::RPAREN, CHECK_OK); 954 Expect(Token::RPAREN, CHECK_OK);
959 Scope* body_scope = NewScope(BLOCK_SCOPE);
960 { 955 {
961 BlockState block_state(&scope_state_, body_scope); 956 BlockState block_state(&scope_state_);
962 ParseScopedStatement(true, CHECK_OK); 957 ParseScopedStatement(true, CHECK_OK);
963 } 958 }
964 return Statement::Default(); 959 return Statement::Default();
965 } 960 }
966 } 961 }
967 } 962 }
968 963
969 // Parsed initializer at this point. 964 // Parsed initializer at this point.
970 Expect(Token::SEMICOLON, CHECK_OK); 965 Expect(Token::SEMICOLON, CHECK_OK);
971 966
972 // If there are let bindings, then condition and the next statement of the 967 // If there are let bindings, then condition and the next statement of the
973 // for loop must be parsed in a new scope. 968 // for loop must be parsed in a new scope.
974 Scope* inner_scope = scope(); 969 Scope* inner_scope = scope();
975 if (has_lexical) inner_scope = NewScopeWithParent(for_scope, BLOCK_SCOPE); 970 // TODO(verwaest): Allocate this through a ScopeState as well.
971 if (has_lexical) inner_scope = NewScopeWithParent(inner_scope, BLOCK_SCOPE);
976 972
977 { 973 {
978 BlockState block_state(&scope_state_, inner_scope); 974 BlockState block_state(&scope_state_, inner_scope);
979 975
980 if (peek() != Token::SEMICOLON) { 976 if (peek() != Token::SEMICOLON) {
981 ParseExpression(true, CHECK_OK); 977 ParseExpression(true, CHECK_OK);
982 } 978 }
983 Expect(Token::SEMICOLON, CHECK_OK); 979 Expect(Token::SEMICOLON, CHECK_OK);
984 980
985 if (peek() != Token::RPAREN) { 981 if (peek() != Token::RPAREN) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1043 Scope* catch_scope = NewScope(CATCH_SCOPE); 1039 Scope* catch_scope = NewScope(CATCH_SCOPE);
1044 ExpressionClassifier pattern_classifier(this); 1040 ExpressionClassifier pattern_classifier(this);
1045 ParsePrimaryExpression(&pattern_classifier, CHECK_OK); 1041 ParsePrimaryExpression(&pattern_classifier, CHECK_OK);
1046 ValidateBindingPattern(&pattern_classifier, CHECK_OK); 1042 ValidateBindingPattern(&pattern_classifier, CHECK_OK);
1047 Expect(Token::RPAREN, CHECK_OK); 1043 Expect(Token::RPAREN, CHECK_OK);
1048 { 1044 {
1049 CollectExpressionsInTailPositionToListScope 1045 CollectExpressionsInTailPositionToListScope
1050 collect_tail_call_expressions_scope( 1046 collect_tail_call_expressions_scope(
1051 function_state_, &tail_call_expressions_in_catch_block); 1047 function_state_, &tail_call_expressions_in_catch_block);
1052 BlockState block_state(&scope_state_, catch_scope); 1048 BlockState block_state(&scope_state_, catch_scope);
1053 Scope* block_scope = NewScope(BLOCK_SCOPE);
1054 { 1049 {
1055 BlockState block_state(&scope_state_, block_scope); 1050 BlockState block_state(&scope_state_);
1056 ParseBlock(CHECK_OK); 1051 ParseBlock(CHECK_OK);
1057 } 1052 }
1058 } 1053 }
1059 catch_block_exists = true; 1054 catch_block_exists = true;
1060 tok = peek(); 1055 tok = peek();
1061 } 1056 }
1062 if (tok == Token::FINALLY) { 1057 if (tok == Token::FINALLY) {
1063 Consume(Token::FINALLY); 1058 Consume(Token::FINALLY);
1064 ParseBlock(CHECK_OK); 1059 ParseBlock(CHECK_OK);
1065 if (FLAG_harmony_explicit_tailcalls && catch_block_exists && 1060 if (FLAG_harmony_explicit_tailcalls && catch_block_exists &&
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1220 *ok = false; 1215 *ok = false;
1221 return EmptyExpression(); 1216 return EmptyExpression();
1222 } 1217 }
1223 if (IsEvalOrArguments(name)) { 1218 if (IsEvalOrArguments(name)) {
1224 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments); 1219 ReportMessageAt(class_name_location, MessageTemplate::kStrictEvalArguments);
1225 *ok = false; 1220 *ok = false;
1226 return EmptyExpression(); 1221 return EmptyExpression();
1227 } 1222 }
1228 1223
1229 LanguageMode class_language_mode = language_mode(); 1224 LanguageMode class_language_mode = language_mode();
1230 Scope* scope = NewScope(BLOCK_SCOPE); 1225 BlockState block_state(&scope_state_);
1231 BlockState block_state(&scope_state_, scope); 1226 scope()->SetLanguageMode(
1232 this->scope()->SetLanguageMode(
1233 static_cast<LanguageMode>(class_language_mode | STRICT)); 1227 static_cast<LanguageMode>(class_language_mode | STRICT));
1234 // TODO(marja): Make PreParser use scope names too. 1228 // TODO(marja): Make PreParser use scope names too.
1235 // this->scope()->SetScopeName(name); 1229 // this->scope()->SetScopeName(name);
1236 1230
1237 bool has_extends = Check(Token::EXTENDS); 1231 bool has_extends = Check(Token::EXTENDS);
1238 if (has_extends) { 1232 if (has_extends) {
1239 ExpressionClassifier extends_classifier(this); 1233 ExpressionClassifier extends_classifier(this);
1240 ParseLeftHandSideExpression(&extends_classifier, CHECK_OK); 1234 ParseLeftHandSideExpression(&extends_classifier, CHECK_OK);
1241 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK); 1235 CheckNoTailCallExpressions(&extends_classifier, CHECK_OK);
1242 ValidateExpression(&extends_classifier, CHECK_OK); 1236 ValidateExpression(&extends_classifier, CHECK_OK);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1317 1311
1318 body->Add(PreParserStatement::ExpressionStatement(return_value), zone()); 1312 body->Add(PreParserStatement::ExpressionStatement(return_value), zone());
1319 } 1313 }
1320 1314
1321 #undef CHECK_OK 1315 #undef CHECK_OK
1322 #undef CHECK_OK_CUSTOM 1316 #undef CHECK_OK_CUSTOM
1323 1317
1324 1318
1325 } // namespace internal 1319 } // namespace internal
1326 } // namespace v8 1320 } // namespace v8
OLDNEW
« no previous file with comments | « src/parsing/parser-base.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698