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

Side by Side Diff: src/preparser.cc

Issue 8662037: Don't preparse large files to find boundaries of lazy functions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 9 years 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
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 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 namespace v8 { 45 namespace v8 {
46 46
47 #ifdef _MSC_VER 47 #ifdef _MSC_VER
48 // Usually defined in math.h, but not in MSVC. 48 // Usually defined in math.h, but not in MSVC.
49 // Abstracted to work 49 // Abstracted to work
50 int isfinite(double value); 50 int isfinite(double value);
51 #endif 51 #endif
52 52
53 namespace preparser { 53 namespace preparser {
54 54
55 PreParser::PreParseResult PreParser::PreParseLazyFunction(
56 bool strict_mode, i::ParserRecorder* log) {
57 log_ = log;
58 // Lazy functions always have trivial outer scopes (no with/catch scopes).
59 Scope top_scope(&scope_, kTopLevelScope);
60 if (strict_mode) set_strict_mode();
61 Scope function_scope(&scope_, kFunctionScope);
62 ASSERT_EQ(i::Token::LBRACE, scanner_->current_token());
63 bool ok = true;
64 int start_position = scanner_->peek_location().beg_pos;
65 ParseLazyFunctionLiteralBody(&ok);
66 if (stack_overflow_) return kPreParseStackOverflow;
67 if (!ok) {
68 ReportUnexpectedToken(scanner_->current_token());
69 } else {
70 ASSERT_EQ(i::Token::RBRACE, scanner_->peek());
71 if (scope_->is_strict_mode()) {
72 int end_pos = scanner_->location().end_pos;
73 CheckOctalLiteral(start_position, end_pos, &ok);
74 if (ok) {
75 CheckDelayedStrictModeViolation(start_position, end_pos, &ok);
76 }
77 }
78 }
79 return kPreParseSuccess;
80 }
81
82
55 // Preparsing checks a JavaScript program and emits preparse-data that helps 83 // Preparsing checks a JavaScript program and emits preparse-data that helps
56 // a later parsing to be faster. 84 // a later parsing to be faster.
57 // See preparser-data.h for the data. 85 // See preparser-data.h for the data.
58 86
59 // The PreParser checks that the syntax follows the grammar for JavaScript, 87 // The PreParser checks that the syntax follows the grammar for JavaScript,
60 // and collects some information about the program along the way. 88 // and collects some information about the program along the way.
61 // The grammar check is only performed in order to understand the program 89 // The grammar check is only performed in order to understand the program
62 // sufficiently to deduce some information about it, that can be used 90 // sufficiently to deduce some information about it, that can be used
63 // to speed up later parsing. Finding errors is not the goal of pre-parsing, 91 // to speed up later parsing. Finding errors is not the goal of pre-parsing,
64 // rather it is to speed up properly written and correct programs. 92 // rather it is to speed up properly written and correct programs.
(...skipping 1268 matching lines...) Expand 10 before | Expand all | Expand 10 after
1333 "strict_param_dupe", 1361 "strict_param_dupe",
1334 CHECK_OK); 1362 CHECK_OK);
1335 } 1363 }
1336 done = (peek() == i::Token::RPAREN); 1364 done = (peek() == i::Token::RPAREN);
1337 if (!done) { 1365 if (!done) {
1338 Expect(i::Token::COMMA, CHECK_OK); 1366 Expect(i::Token::COMMA, CHECK_OK);
1339 } 1367 }
1340 } 1368 }
1341 Expect(i::Token::RPAREN, CHECK_OK); 1369 Expect(i::Token::RPAREN, CHECK_OK);
1342 1370
1343 Expect(i::Token::LBRACE, CHECK_OK);
1344 int function_block_pos = scanner_->location().beg_pos;
1345
1346 // Determine if the function will be lazily compiled. 1371 // Determine if the function will be lazily compiled.
1347 // Currently only happens to top-level functions. 1372 // Currently only happens to top-level functions.
1348 // Optimistically assume that all top-level functions are lazily compiled. 1373 // Optimistically assume that all top-level functions are lazily compiled.
1349 bool is_lazily_compiled = (outer_scope_type == kTopLevelScope && 1374 bool is_lazily_compiled = (outer_scope_type == kTopLevelScope &&
1350 !inside_with && allow_lazy_ && 1375 !inside_with && allow_lazy_ &&
1351 !parenthesized_function_); 1376 !parenthesized_function_);
1352 parenthesized_function_ = false; 1377 parenthesized_function_ = false;
1353 1378
1379 Expect(i::Token::LBRACE, CHECK_OK);
1354 if (is_lazily_compiled) { 1380 if (is_lazily_compiled) {
1355 log_->PauseRecording(); 1381 ParseLazyFunctionLiteralBody(CHECK_OK);
1382 } else {
1356 ParseSourceElements(i::Token::RBRACE, ok); 1383 ParseSourceElements(i::Token::RBRACE, ok);
1357 log_->ResumeRecording();
1358 if (!*ok) Expression::Default();
1359
1360 Expect(i::Token::RBRACE, CHECK_OK);
1361
1362 // Position right after terminal '}'.
1363 int end_pos = scanner_->location().end_pos;
1364 log_->LogFunction(function_block_pos, end_pos,
1365 function_scope.materialized_literal_count(),
1366 function_scope.expected_properties(),
1367 strict_mode_flag());
1368 } else {
1369 ParseSourceElements(i::Token::RBRACE, CHECK_OK);
1370 Expect(i::Token::RBRACE, CHECK_OK);
1371 } 1384 }
1385 Expect(i::Token::RBRACE, CHECK_OK);
1372 1386
1373 if (strict_mode()) { 1387 if (strict_mode()) {
1374 int end_position = scanner_->location().end_pos; 1388 int end_position = scanner_->location().end_pos;
1375 CheckOctalLiteral(start_position, end_position, CHECK_OK); 1389 CheckOctalLiteral(start_position, end_position, CHECK_OK);
1376 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK); 1390 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK);
1377 return Expression::StrictFunction(); 1391 return Expression::StrictFunction();
1378 } 1392 }
1379 1393
1380 return Expression::Default(); 1394 return Expression::Default();
1381 } 1395 }
1382 1396
1383 1397
1398 void PreParser::ParseLazyFunctionLiteralBody(bool* ok) {
1399 int body_start = scanner_->location().beg_pos;
1400 log_->PauseRecording();
1401 ParseSourceElements(i::Token::RBRACE, ok);
1402 log_->ResumeRecording();
1403 if (!*ok) return;
1404
1405 // Position right after terminal '}'.
1406 ASSERT_EQ(i::Token::RBRACE, scanner_->peek());
1407 int body_end = scanner_->peek_location().end_pos;
1408 log_->LogFunction(body_start, body_end,
1409 scope_->materialized_literal_count(),
1410 scope_->expected_properties(),
1411 scope_->strict_mode_flag());
1412 }
1413
1414
1384 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { 1415 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
1385 // CallRuntime :: 1416 // CallRuntime ::
1386 // '%' Identifier Arguments 1417 // '%' Identifier Arguments
1387 Expect(i::Token::MOD, CHECK_OK); 1418 Expect(i::Token::MOD, CHECK_OK);
1388 if (!allow_natives_syntax_) { 1419 if (!allow_natives_syntax_) {
1389 *ok = false; 1420 *ok = false;
1390 return Expression::Default(); 1421 return Expression::Default();
1391 } 1422 }
1392 ParseIdentifier(CHECK_OK); 1423 ParseIdentifier(CHECK_OK);
1393 ParseArguments(ok); 1424 ParseArguments(ok);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); 1745 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u));
1715 } 1746 }
1716 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); 1747 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u));
1717 } 1748 }
1718 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); 1749 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f));
1719 1750
1720 backing_store_.AddBlock(bytes); 1751 backing_store_.AddBlock(bytes);
1721 return backing_store_.EndSequence().start(); 1752 return backing_store_.EndSequence().start();
1722 } 1753 }
1723 } } // v8::preparser 1754 } } // v8::preparser
OLDNEW
« src/parser.cc ('K') | « src/preparser.h ('k') | test/cctest/test-parsing.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698