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

Side by Side Diff: src/preparser.cc

Issue 148293011: Refactor scope and function state tracking in (Pre)Parser. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: rebased Created 6 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « src/preparser.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 54
55 namespace v8 { 55 namespace v8 {
56 namespace internal { 56 namespace internal {
57 57
58 bool PreParserTraits::is_classic_mode() const { 58 bool PreParserTraits::is_classic_mode() const {
59 return pre_parser_->scope_->language_mode() == CLASSIC_MODE; 59 return pre_parser_->scope_->language_mode() == CLASSIC_MODE;
60 } 60 }
61 61
62 62
63 bool PreParserTraits::is_generator() const { 63 bool PreParserTraits::is_generator() const {
64 return pre_parser_->scope_->is_generator(); 64 return pre_parser_->function_state_->is_generator();
65 } 65 }
66 66
67 67
68 int PreParserTraits::NextMaterializedLiteralIndex() { 68 int PreParserTraits::NextMaterializedLiteralIndex() {
69 return pre_parser_->scope_->NextMaterializedLiteralIndex(); 69 return pre_parser_->function_state_->NextMaterializedLiteralIndex();
70 } 70 }
71 71
72 72
73 void PreParserTraits::ReportMessageAt(Scanner::Location location, 73 void PreParserTraits::ReportMessageAt(Scanner::Location location,
74 const char* message, 74 const char* message,
75 Vector<const char*> args) { 75 Vector<const char*> args) {
76 ReportMessageAt(location.beg_pos, 76 ReportMessageAt(location.beg_pos,
77 location.end_pos, 77 location.end_pos,
78 message, 78 message,
79 args.length() > 0 ? args[0] : NULL); 79 args.length() > 0 ? args[0] : NULL);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
119 } 119 }
120 } 120 }
121 return PreParserIdentifier::Default(); 121 return PreParserIdentifier::Default();
122 } 122 }
123 123
124 124
125 PreParser::PreParseResult PreParser::PreParseLazyFunction( 125 PreParser::PreParseResult PreParser::PreParseLazyFunction(
126 LanguageMode mode, bool is_generator, ParserRecorder* log) { 126 LanguageMode mode, bool is_generator, ParserRecorder* log) {
127 log_ = log; 127 log_ = log;
128 // Lazy functions always have trivial outer scopes (no with/catch scopes). 128 // Lazy functions always have trivial outer scopes (no with/catch scopes).
129 Scope top_scope(&scope_, kTopLevelScope); 129 FunctionState top_scope(&function_state_, &scope_, GLOBAL_SCOPE);
130 set_language_mode(mode); 130 scope_->SetLanguageMode(mode);
131 Scope function_scope(&scope_, kFunctionScope); 131 FunctionState function_scope(&function_state_, &scope_, FUNCTION_SCOPE);
132 function_scope.set_is_generator(is_generator); 132 function_scope.set_is_generator(is_generator);
133 ASSERT_EQ(Token::LBRACE, scanner()->current_token()); 133 ASSERT_EQ(Token::LBRACE, scanner()->current_token());
134 bool ok = true; 134 bool ok = true;
135 int start_position = peek_position(); 135 int start_position = peek_position();
136 ParseLazyFunctionLiteralBody(&ok); 136 ParseLazyFunctionLiteralBody(&ok);
137 if (stack_overflow()) return kPreParseStackOverflow; 137 if (stack_overflow()) return kPreParseStackOverflow;
138 if (!ok) { 138 if (!ok) {
139 ReportUnexpectedToken(scanner()->current_token()); 139 ReportUnexpectedToken(scanner()->current_token());
140 } else { 140 } else {
141 ASSERT_EQ(Token::RBRACE, scanner()->peek()); 141 ASSERT_EQ(Token::RBRACE, scanner()->peek());
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 // (Statement)* <end_token> 199 // (Statement)* <end_token>
200 200
201 bool directive_prologue = true; 201 bool directive_prologue = true;
202 while (peek() != end_token) { 202 while (peek() != end_token) {
203 if (directive_prologue && peek() != Token::STRING) { 203 if (directive_prologue && peek() != Token::STRING) {
204 directive_prologue = false; 204 directive_prologue = false;
205 } 205 }
206 Statement statement = ParseSourceElement(CHECK_OK); 206 Statement statement = ParseSourceElement(CHECK_OK);
207 if (directive_prologue) { 207 if (directive_prologue) {
208 if (statement.IsUseStrictLiteral()) { 208 if (statement.IsUseStrictLiteral()) {
209 set_language_mode(allow_harmony_scoping() ? 209 scope_->SetLanguageMode(allow_harmony_scoping() ?
210 EXTENDED_MODE : STRICT_MODE); 210 EXTENDED_MODE : STRICT_MODE);
211 } else if (!statement.IsStringLiteral()) { 211 } else if (!statement.IsStringLiteral()) {
212 directive_prologue = false; 212 directive_prologue = false;
213 } 213 }
214 } 214 }
215 } 215 }
216 return kUnknownSourceElements; 216 return kUnknownSourceElements;
217 } 217 }
218 218
219 219
220 #undef CHECK_OK 220 #undef CHECK_OK
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 345
346 PreParser::Statement PreParser::ParseBlock(bool* ok) { 346 PreParser::Statement PreParser::ParseBlock(bool* ok) {
347 // Block :: 347 // Block ::
348 // '{' Statement* '}' 348 // '{' Statement* '}'
349 349
350 // Note that a Block does not introduce a new execution scope! 350 // Note that a Block does not introduce a new execution scope!
351 // (ECMA-262, 3rd, 12.2) 351 // (ECMA-262, 3rd, 12.2)
352 // 352 //
353 Expect(Token::LBRACE, CHECK_OK); 353 Expect(Token::LBRACE, CHECK_OK);
354 while (peek() != Token::RBRACE) { 354 while (peek() != Token::RBRACE) {
355 if (is_extended_mode()) { 355 if (scope_->is_extended_mode()) {
356 ParseSourceElement(CHECK_OK); 356 ParseSourceElement(CHECK_OK);
357 } else { 357 } else {
358 ParseStatement(CHECK_OK); 358 ParseStatement(CHECK_OK);
359 } 359 }
360 } 360 }
361 Expect(Token::RBRACE, ok); 361 Expect(Token::RBRACE, ok);
362 return Statement::Default(); 362 return Statement::Default();
363 } 363 }
364 364
365 365
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 // 409 //
410 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';' 410 // ConstDeclaration : const ConstBinding (',' ConstBinding)* ';'
411 // 411 //
412 // * It is a Syntax Error if the code that matches this production is not 412 // * It is a Syntax Error if the code that matches this production is not
413 // contained in extended code. 413 // contained in extended code.
414 // 414 //
415 // However disallowing const in classic mode will break compatibility with 415 // However disallowing const in classic mode will break compatibility with
416 // existing pages. Therefore we keep allowing const with the old 416 // existing pages. Therefore we keep allowing const with the old
417 // non-harmony semantics in classic mode. 417 // non-harmony semantics in classic mode.
418 Consume(Token::CONST); 418 Consume(Token::CONST);
419 switch (language_mode()) { 419 switch (scope_->language_mode()) {
420 case CLASSIC_MODE: 420 case CLASSIC_MODE:
421 break; 421 break;
422 case STRICT_MODE: { 422 case STRICT_MODE: {
423 Scanner::Location location = scanner()->peek_location(); 423 Scanner::Location location = scanner()->peek_location();
424 ReportMessageAt(location, "strict_const"); 424 ReportMessageAt(location, "strict_const");
425 *ok = false; 425 *ok = false;
426 return Statement::Default(); 426 return Statement::Default();
427 } 427 }
428 case EXTENDED_MODE: 428 case EXTENDED_MODE:
429 if (var_context != kSourceElement && 429 if (var_context != kSourceElement &&
430 var_context != kForStatement) { 430 var_context != kForStatement) {
431 ReportMessageAt(scanner()->peek_location(), "unprotected_const"); 431 ReportMessageAt(scanner()->peek_location(), "unprotected_const");
432 *ok = false; 432 *ok = false;
433 return Statement::Default(); 433 return Statement::Default();
434 } 434 }
435 require_initializer = true; 435 require_initializer = true;
436 break; 436 break;
437 } 437 }
438 } else if (peek() == Token::LET) { 438 } else if (peek() == Token::LET) {
439 // ES6 Draft Rev4 section 12.2.1: 439 // ES6 Draft Rev4 section 12.2.1:
440 // 440 //
441 // LetDeclaration : let LetBindingList ; 441 // LetDeclaration : let LetBindingList ;
442 // 442 //
443 // * It is a Syntax Error if the code that matches this production is not 443 // * It is a Syntax Error if the code that matches this production is not
444 // contained in extended code. 444 // contained in extended code.
445 if (!is_extended_mode()) { 445 if (!scope_->is_extended_mode()) {
446 ReportMessageAt(scanner()->peek_location(), "illegal_let"); 446 ReportMessageAt(scanner()->peek_location(), "illegal_let");
447 *ok = false; 447 *ok = false;
448 return Statement::Default(); 448 return Statement::Default();
449 } 449 }
450 Consume(Token::LET); 450 Consume(Token::LET);
451 if (var_context != kSourceElement && 451 if (var_context != kSourceElement &&
452 var_context != kForStatement) { 452 var_context != kForStatement) {
453 ReportMessageAt(scanner()->peek_location(), "unprotected_let"); 453 ReportMessageAt(scanner()->peek_location(), "unprotected_let");
454 *ok = false; 454 *ok = false;
455 return Statement::Default(); 455 return Statement::Default();
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
595 Expect(Token::WITH, CHECK_OK); 595 Expect(Token::WITH, CHECK_OK);
596 if (!scope_->is_classic_mode()) { 596 if (!scope_->is_classic_mode()) {
597 ReportMessageAt(scanner()->location(), "strict_mode_with"); 597 ReportMessageAt(scanner()->location(), "strict_mode_with");
598 *ok = false; 598 *ok = false;
599 return Statement::Default(); 599 return Statement::Default();
600 } 600 }
601 Expect(Token::LPAREN, CHECK_OK); 601 Expect(Token::LPAREN, CHECK_OK);
602 ParseExpression(true, CHECK_OK); 602 ParseExpression(true, CHECK_OK);
603 Expect(Token::RPAREN, CHECK_OK); 603 Expect(Token::RPAREN, CHECK_OK);
604 604
605 Scope::InsideWith iw(scope_); 605 BlockState block_state(&scope_, WITH_SCOPE);
606 ParseStatement(CHECK_OK); 606 ParseStatement(CHECK_OK);
607 return Statement::Default(); 607 return Statement::Default();
608 } 608 }
609 609
610 610
611 PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) { 611 PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) {
612 // SwitchStatement :: 612 // SwitchStatement ::
613 // 'switch' '(' Expression ')' '{' CaseClause* '}' 613 // 'switch' '(' Expression ')' '{' CaseClause* '}'
614 614
615 Expect(Token::SWITCH, CHECK_OK); 615 Expect(Token::SWITCH, CHECK_OK);
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 if (tok != Token::CATCH && tok != Token::FINALLY) { 768 if (tok != Token::CATCH && tok != Token::FINALLY) {
769 ReportMessageAt(scanner()->location(), "no_catch_or_finally"); 769 ReportMessageAt(scanner()->location(), "no_catch_or_finally");
770 *ok = false; 770 *ok = false;
771 return Statement::Default(); 771 return Statement::Default();
772 } 772 }
773 if (tok == Token::CATCH) { 773 if (tok == Token::CATCH) {
774 Consume(Token::CATCH); 774 Consume(Token::CATCH);
775 Expect(Token::LPAREN, CHECK_OK); 775 Expect(Token::LPAREN, CHECK_OK);
776 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK); 776 ParseIdentifier(kDontAllowEvalOrArguments, CHECK_OK);
777 Expect(Token::RPAREN, CHECK_OK); 777 Expect(Token::RPAREN, CHECK_OK);
778 { Scope::InsideWith iw(scope_); 778 {
779 BlockState block_state(&scope_, WITH_SCOPE);
779 ParseBlock(CHECK_OK); 780 ParseBlock(CHECK_OK);
780 } 781 }
781 tok = peek(); 782 tok = peek();
782 } 783 }
783 if (tok == Token::FINALLY) { 784 if (tok == Token::FINALLY) {
784 Consume(Token::FINALLY); 785 Consume(Token::FINALLY);
785 ParseBlock(CHECK_OK); 786 ParseBlock(CHECK_OK);
786 } 787 }
787 return Statement::Default(); 788 return Statement::Default();
788 } 789 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
826 827
827 828
828 // Precedence = 2 829 // Precedence = 2
829 PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN, 830 PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
830 bool* ok) { 831 bool* ok) {
831 // AssignmentExpression :: 832 // AssignmentExpression ::
832 // ConditionalExpression 833 // ConditionalExpression
833 // YieldExpression 834 // YieldExpression
834 // LeftHandSideExpression AssignmentOperator AssignmentExpression 835 // LeftHandSideExpression AssignmentOperator AssignmentExpression
835 836
836 if (scope_->is_generator() && peek() == Token::YIELD) { 837 if (function_state_->is_generator() && peek() == Token::YIELD) {
837 return ParseYieldExpression(ok); 838 return ParseYieldExpression(ok);
838 } 839 }
839 840
840 Scanner::Location before = scanner()->peek_location(); 841 Scanner::Location before = scanner()->peek_location();
841 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK); 842 Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK);
842 843
843 if (!Token::IsAssignmentOp(peek())) { 844 if (!Token::IsAssignmentOp(peek())) {
844 // Parsed conditional expression only (no assignment). 845 // Parsed conditional expression only (no assignment).
845 return expression; 846 return expression;
846 } 847 }
847 848
848 if (!scope_->is_classic_mode() && 849 if (!scope_->is_classic_mode() &&
849 expression.IsIdentifier() && 850 expression.IsIdentifier() &&
850 expression.AsIdentifier().IsEvalOrArguments()) { 851 expression.AsIdentifier().IsEvalOrArguments()) {
851 Scanner::Location after = scanner()->location(); 852 Scanner::Location after = scanner()->location();
852 PreParserTraits::ReportMessageAt(before.beg_pos, after.end_pos, 853 PreParserTraits::ReportMessageAt(before.beg_pos, after.end_pos,
853 "strict_eval_arguments", NULL); 854 "strict_eval_arguments", NULL);
854 *ok = false; 855 *ok = false;
855 return Expression::Default(); 856 return Expression::Default();
856 } 857 }
857 858
858 Token::Value op = Next(); // Get assignment operator. 859 Token::Value op = Next(); // Get assignment operator.
859 ParseAssignmentExpression(accept_IN, CHECK_OK); 860 ParseAssignmentExpression(accept_IN, CHECK_OK);
860 861
861 if ((op == Token::ASSIGN) && expression.IsThisProperty()) { 862 if ((op == Token::ASSIGN) && expression.IsThisProperty()) {
862 scope_->AddProperty(); 863 function_state_->AddProperty();
863 } 864 }
864 865
865 return Expression::Default(); 866 return Expression::Default();
866 } 867 }
867 868
868 869
869 // Precedence = 3 870 // Precedence = 3
870 PreParser::Expression PreParser::ParseYieldExpression(bool* ok) { 871 PreParser::Expression PreParser::ParseYieldExpression(bool* ok) {
871 // YieldExpression :: 872 // YieldExpression ::
872 // 'yield' '*'? AssignmentExpression 873 // 'yield' '*'? AssignmentExpression
(...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 while (peek() != Token::RBRACK) { 1213 while (peek() != Token::RBRACK) {
1213 if (peek() != Token::COMMA) { 1214 if (peek() != Token::COMMA) {
1214 ParseAssignmentExpression(true, CHECK_OK); 1215 ParseAssignmentExpression(true, CHECK_OK);
1215 } 1216 }
1216 if (peek() != Token::RBRACK) { 1217 if (peek() != Token::RBRACK) {
1217 Expect(Token::COMMA, CHECK_OK); 1218 Expect(Token::COMMA, CHECK_OK);
1218 } 1219 }
1219 } 1220 }
1220 Expect(Token::RBRACK, CHECK_OK); 1221 Expect(Token::RBRACK, CHECK_OK);
1221 1222
1222 scope_->NextMaterializedLiteralIndex(); 1223 function_state_->NextMaterializedLiteralIndex();
1223 return Expression::Default(); 1224 return Expression::Default();
1224 } 1225 }
1225 1226
1226 1227
1227 PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) { 1228 PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
1228 // ObjectLiteral :: 1229 // ObjectLiteral ::
1229 // '{' ( 1230 // '{' (
1230 // ((IdentifierName | String | Number) ':' AssignmentExpression) 1231 // ((IdentifierName | String | Number) ':' AssignmentExpression)
1231 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral) 1232 // | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
1232 // )*[','] '}' 1233 // )*[','] '}'
1233 1234
1234 ObjectLiteralChecker checker(this, language_mode()); 1235 ObjectLiteralChecker checker(this, scope_->language_mode());
1235 1236
1236 Expect(Token::LBRACE, CHECK_OK); 1237 Expect(Token::LBRACE, CHECK_OK);
1237 while (peek() != Token::RBRACE) { 1238 while (peek() != Token::RBRACE) {
1238 Token::Value next = peek(); 1239 Token::Value next = peek();
1239 switch (next) { 1240 switch (next) {
1240 case Token::IDENTIFIER: 1241 case Token::IDENTIFIER:
1241 case Token::FUTURE_RESERVED_WORD: 1242 case Token::FUTURE_RESERVED_WORD:
1242 case Token::FUTURE_STRICT_RESERVED_WORD: { 1243 case Token::FUTURE_STRICT_RESERVED_WORD: {
1243 bool is_getter = false; 1244 bool is_getter = false;
1244 bool is_setter = false; 1245 bool is_setter = false;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1294 } 1295 }
1295 1296
1296 Expect(Token::COLON, CHECK_OK); 1297 Expect(Token::COLON, CHECK_OK);
1297 ParseAssignmentExpression(true, CHECK_OK); 1298 ParseAssignmentExpression(true, CHECK_OK);
1298 1299
1299 // TODO(1240767): Consider allowing trailing comma. 1300 // TODO(1240767): Consider allowing trailing comma.
1300 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK); 1301 if (peek() != Token::RBRACE) Expect(Token::COMMA, CHECK_OK);
1301 } 1302 }
1302 Expect(Token::RBRACE, CHECK_OK); 1303 Expect(Token::RBRACE, CHECK_OK);
1303 1304
1304 scope_->NextMaterializedLiteralIndex(); 1305 function_state_->NextMaterializedLiteralIndex();
1305 return Expression::Default(); 1306 return Expression::Default();
1306 } 1307 }
1307 1308
1308 1309
1309 PreParser::Arguments PreParser::ParseArguments(bool* ok) { 1310 PreParser::Arguments PreParser::ParseArguments(bool* ok) {
1310 // Arguments :: 1311 // Arguments ::
1311 // '(' (AssignmentExpression)*[','] ')' 1312 // '(' (AssignmentExpression)*[','] ')'
1312 1313
1313 Expect(Token::LPAREN, ok); 1314 Expect(Token::LPAREN, ok);
1314 if (!*ok) return -1; 1315 if (!*ok) return -1;
(...skipping 17 matching lines...) Expand all
1332 Identifier function_name, 1333 Identifier function_name,
1333 Scanner::Location function_name_location, 1334 Scanner::Location function_name_location,
1334 bool name_is_strict_reserved, 1335 bool name_is_strict_reserved,
1335 bool is_generator, 1336 bool is_generator,
1336 bool* ok) { 1337 bool* ok) {
1337 // Function :: 1338 // Function ::
1338 // '(' FormalParameterList? ')' '{' FunctionBody '}' 1339 // '(' FormalParameterList? ')' '{' FunctionBody '}'
1339 1340
1340 // Parse function body. 1341 // Parse function body.
1341 ScopeType outer_scope_type = scope_->type(); 1342 ScopeType outer_scope_type = scope_->type();
1342 bool inside_with = scope_->IsInsideWith(); 1343 bool inside_with = scope_->inside_with();
1343 Scope function_scope(&scope_, kFunctionScope); 1344 FunctionState function_scope(&function_state_, &scope_, FUNCTION_SCOPE);
1344 function_scope.set_is_generator(is_generator); 1345 function_scope.set_is_generator(is_generator);
1345 // FormalParameterList :: 1346 // FormalParameterList ::
1346 // '(' (Identifier)*[','] ')' 1347 // '(' (Identifier)*[','] ')'
1347 Expect(Token::LPAREN, CHECK_OK); 1348 Expect(Token::LPAREN, CHECK_OK);
1348 int start_position = position(); 1349 int start_position = position();
1349 bool done = (peek() == Token::RPAREN); 1350 bool done = (peek() == Token::RPAREN);
1350 DuplicateFinder duplicate_finder(scanner()->unicode_cache()); 1351 DuplicateFinder duplicate_finder(scanner()->unicode_cache());
1351 // We don't yet know if the function will be strict, so we cannot yet produce 1352 // We don't yet know if the function will be strict, so we cannot yet produce
1352 // errors for parameter names or duplicates. However, we remember the 1353 // errors for parameter names or duplicates. However, we remember the
1353 // locations of these errors if they occur and produce the errors later. 1354 // locations of these errors if they occur and produce the errors later.
(...skipping 27 matching lines...) Expand all
1381 done = (peek() == Token::RPAREN); 1382 done = (peek() == Token::RPAREN);
1382 if (!done) { 1383 if (!done) {
1383 Expect(Token::COMMA, CHECK_OK); 1384 Expect(Token::COMMA, CHECK_OK);
1384 } 1385 }
1385 } 1386 }
1386 Expect(Token::RPAREN, CHECK_OK); 1387 Expect(Token::RPAREN, CHECK_OK);
1387 1388
1388 // Determine if the function will be lazily compiled. 1389 // Determine if the function will be lazily compiled.
1389 // Currently only happens to top-level functions. 1390 // Currently only happens to top-level functions.
1390 // Optimistically assume that all top-level functions are lazily compiled. 1391 // Optimistically assume that all top-level functions are lazily compiled.
1391 bool is_lazily_compiled = (outer_scope_type == kTopLevelScope && 1392 bool is_lazily_compiled = (outer_scope_type == GLOBAL_SCOPE &&
1392 !inside_with && allow_lazy() && 1393 !inside_with && allow_lazy() &&
1393 !parenthesized_function_); 1394 !parenthesized_function_);
1394 parenthesized_function_ = false; 1395 parenthesized_function_ = false;
1395 1396
1396 Expect(Token::LBRACE, CHECK_OK); 1397 Expect(Token::LBRACE, CHECK_OK);
1397 if (is_lazily_compiled) { 1398 if (is_lazily_compiled) {
1398 ParseLazyFunctionLiteralBody(CHECK_OK); 1399 ParseLazyFunctionLiteralBody(CHECK_OK);
1399 } else { 1400 } else {
1400 ParseSourceElements(Token::RBRACE, ok); 1401 ParseSourceElements(Token::RBRACE, ok);
1401 } 1402 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1443 int body_start = position(); 1444 int body_start = position();
1444 log_->PauseRecording(); 1445 log_->PauseRecording();
1445 ParseSourceElements(Token::RBRACE, ok); 1446 ParseSourceElements(Token::RBRACE, ok);
1446 log_->ResumeRecording(); 1447 log_->ResumeRecording();
1447 if (!*ok) return; 1448 if (!*ok) return;
1448 1449
1449 // Position right after terminal '}'. 1450 // Position right after terminal '}'.
1450 ASSERT_EQ(Token::RBRACE, scanner()->peek()); 1451 ASSERT_EQ(Token::RBRACE, scanner()->peek());
1451 int body_end = scanner()->peek_location().end_pos; 1452 int body_end = scanner()->peek_location().end_pos;
1452 log_->LogFunction(body_start, body_end, 1453 log_->LogFunction(body_start, body_end,
1453 scope_->materialized_literal_count(), 1454 function_state_->materialized_literal_count(),
1454 scope_->expected_properties(), 1455 function_state_->expected_properties(),
1455 language_mode()); 1456 scope_->language_mode());
1456 } 1457 }
1457 1458
1458 1459
1459 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { 1460 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
1460 // CallRuntime :: 1461 // CallRuntime ::
1461 // '%' Identifier Arguments 1462 // '%' Identifier Arguments
1462 Expect(Token::MOD, CHECK_OK); 1463 Expect(Token::MOD, CHECK_OK);
1463 if (!allow_natives_syntax()) { 1464 if (!allow_natives_syntax()) {
1464 *ok = false; 1465 *ok = false;
1465 return Expression::Default(); 1466 return Expression::Default();
(...skipping 27 matching lines...) Expand all
1493 !scanner()->literal_contains_escapes() && 1494 !scanner()->literal_contains_escapes() &&
1494 !strncmp(scanner()->literal_ascii_string().start(), kUseStrictChars, 1495 !strncmp(scanner()->literal_ascii_string().start(), kUseStrictChars,
1495 kUseStrictLength)) { 1496 kUseStrictLength)) {
1496 return Expression::UseStrictStringLiteral(); 1497 return Expression::UseStrictStringLiteral();
1497 } 1498 }
1498 return Expression::StringLiteral(); 1499 return Expression::StringLiteral();
1499 } 1500 }
1500 1501
1501 1502
1502 } } // v8::internal 1503 } } // v8::internal
OLDNEW
« no previous file with comments | « src/preparser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698