OLD | NEW |
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 Loading... |
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 i::LanguageMode 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 set_language_mode(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 (!is_classic_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 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1343 "strict_param_dupe", | 1371 "strict_param_dupe", |
1344 CHECK_OK); | 1372 CHECK_OK); |
1345 } | 1373 } |
1346 done = (peek() == i::Token::RPAREN); | 1374 done = (peek() == i::Token::RPAREN); |
1347 if (!done) { | 1375 if (!done) { |
1348 Expect(i::Token::COMMA, CHECK_OK); | 1376 Expect(i::Token::COMMA, CHECK_OK); |
1349 } | 1377 } |
1350 } | 1378 } |
1351 Expect(i::Token::RPAREN, CHECK_OK); | 1379 Expect(i::Token::RPAREN, CHECK_OK); |
1352 | 1380 |
1353 Expect(i::Token::LBRACE, CHECK_OK); | |
1354 int function_block_pos = scanner_->location().beg_pos; | |
1355 | |
1356 // Determine if the function will be lazily compiled. | 1381 // Determine if the function will be lazily compiled. |
1357 // Currently only happens to top-level functions. | 1382 // Currently only happens to top-level functions. |
1358 // Optimistically assume that all top-level functions are lazily compiled. | 1383 // Optimistically assume that all top-level functions are lazily compiled. |
1359 bool is_lazily_compiled = (outer_scope_type == kTopLevelScope && | 1384 bool is_lazily_compiled = (outer_scope_type == kTopLevelScope && |
1360 !inside_with && allow_lazy_ && | 1385 !inside_with && allow_lazy_ && |
1361 !parenthesized_function_); | 1386 !parenthesized_function_); |
1362 parenthesized_function_ = false; | 1387 parenthesized_function_ = false; |
1363 | 1388 |
| 1389 Expect(i::Token::LBRACE, CHECK_OK); |
1364 if (is_lazily_compiled) { | 1390 if (is_lazily_compiled) { |
1365 log_->PauseRecording(); | 1391 ParseLazyFunctionLiteralBody(CHECK_OK); |
| 1392 } else { |
1366 ParseSourceElements(i::Token::RBRACE, ok); | 1393 ParseSourceElements(i::Token::RBRACE, ok); |
1367 log_->ResumeRecording(); | |
1368 if (!*ok) Expression::Default(); | |
1369 | |
1370 Expect(i::Token::RBRACE, CHECK_OK); | |
1371 | |
1372 // Position right after terminal '}'. | |
1373 int end_pos = scanner_->location().end_pos; | |
1374 log_->LogFunction(function_block_pos, end_pos, | |
1375 function_scope.materialized_literal_count(), | |
1376 function_scope.expected_properties(), | |
1377 language_mode()); | |
1378 } else { | |
1379 ParseSourceElements(i::Token::RBRACE, CHECK_OK); | |
1380 Expect(i::Token::RBRACE, CHECK_OK); | |
1381 } | 1394 } |
| 1395 Expect(i::Token::RBRACE, CHECK_OK); |
1382 | 1396 |
1383 if (!is_classic_mode()) { | 1397 if (!is_classic_mode()) { |
1384 int end_position = scanner_->location().end_pos; | 1398 int end_position = scanner_->location().end_pos; |
1385 CheckOctalLiteral(start_position, end_position, CHECK_OK); | 1399 CheckOctalLiteral(start_position, end_position, CHECK_OK); |
1386 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK); | 1400 CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK); |
1387 return Expression::StrictFunction(); | 1401 return Expression::StrictFunction(); |
1388 } | 1402 } |
1389 | 1403 |
1390 return Expression::Default(); | 1404 return Expression::Default(); |
1391 } | 1405 } |
1392 | 1406 |
1393 | 1407 |
| 1408 void PreParser::ParseLazyFunctionLiteralBody(bool* ok) { |
| 1409 int body_start = scanner_->location().beg_pos; |
| 1410 log_->PauseRecording(); |
| 1411 ParseSourceElements(i::Token::RBRACE, ok); |
| 1412 log_->ResumeRecording(); |
| 1413 if (!*ok) return; |
| 1414 |
| 1415 // Position right after terminal '}'. |
| 1416 ASSERT_EQ(i::Token::RBRACE, scanner_->peek()); |
| 1417 int body_end = scanner_->peek_location().end_pos; |
| 1418 log_->LogFunction(body_start, body_end, |
| 1419 scope_->materialized_literal_count(), |
| 1420 scope_->expected_properties(), |
| 1421 language_mode()); |
| 1422 } |
| 1423 |
| 1424 |
1394 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { | 1425 PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) { |
1395 // CallRuntime :: | 1426 // CallRuntime :: |
1396 // '%' Identifier Arguments | 1427 // '%' Identifier Arguments |
1397 Expect(i::Token::MOD, CHECK_OK); | 1428 Expect(i::Token::MOD, CHECK_OK); |
1398 if (!allow_natives_syntax_) { | 1429 if (!allow_natives_syntax_) { |
1399 *ok = false; | 1430 *ok = false; |
1400 return Expression::Default(); | 1431 return Expression::Default(); |
1401 } | 1432 } |
1402 ParseIdentifier(CHECK_OK); | 1433 ParseIdentifier(CHECK_OK); |
1403 ParseArguments(ok); | 1434 ParseArguments(ok); |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1724 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); | 1755 backing_store_.Add(static_cast<byte>((ascii_length >> 14) | 0x80u)); |
1725 } | 1756 } |
1726 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); | 1757 backing_store_.Add(static_cast<byte>((ascii_length >> 7) | 0x80u)); |
1727 } | 1758 } |
1728 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); | 1759 backing_store_.Add(static_cast<byte>(ascii_length & 0x7f)); |
1729 | 1760 |
1730 backing_store_.AddBlock(bytes); | 1761 backing_store_.AddBlock(bytes); |
1731 return backing_store_.EndSequence().start(); | 1762 return backing_store_.EndSequence().start(); |
1732 } | 1763 } |
1733 } } // v8::preparser | 1764 } } // v8::preparser |
OLD | NEW |