OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 auto stream = i::ScannerStream::ForTesting(source); | 170 auto stream = i::ScannerStream::ForTesting(source); |
171 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 171 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
172 scanner.Initialize(stream.get()); | 172 scanner.Initialize(stream.get()); |
173 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 173 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
174 i::AstValueFactory ast_value_factory( | 174 i::AstValueFactory ast_value_factory( |
175 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 175 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
176 i::PendingCompilationErrorHandler pending_error_handler; | 176 i::PendingCompilationErrorHandler pending_error_handler; |
177 i::PreParser preparser( | 177 i::PreParser preparser( |
178 &zone, &scanner, &ast_value_factory, &pending_error_handler, | 178 &zone, &scanner, &ast_value_factory, &pending_error_handler, |
179 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); | 179 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); |
180 preparser.set_allow_lazy(true); | |
181 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 180 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
182 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 181 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
183 CHECK(!pending_error_handler.has_pending_error()); | 182 CHECK(!pending_error_handler.has_pending_error()); |
184 } | 183 } |
185 | 184 |
186 for (int i = 0; fail_tests[i]; i++) { | 185 for (int i = 0; fail_tests[i]; i++) { |
187 const char* source = fail_tests[i]; | 186 const char* source = fail_tests[i]; |
188 auto stream = i::ScannerStream::ForTesting(source); | 187 auto stream = i::ScannerStream::ForTesting(source); |
189 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 188 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
190 scanner.Initialize(stream.get()); | 189 scanner.Initialize(stream.get()); |
191 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 190 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
192 i::AstValueFactory ast_value_factory( | 191 i::AstValueFactory ast_value_factory( |
193 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 192 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
194 i::PendingCompilationErrorHandler pending_error_handler; | 193 i::PendingCompilationErrorHandler pending_error_handler; |
195 i::PreParser preparser( | 194 i::PreParser preparser( |
196 &zone, &scanner, &ast_value_factory, &pending_error_handler, | 195 &zone, &scanner, &ast_value_factory, &pending_error_handler, |
197 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); | 196 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); |
198 preparser.set_allow_lazy(true); | |
199 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 197 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
200 // Even in the case of a syntax error, kPreParseSuccess is returned. | 198 // Even in the case of a syntax error, kPreParseSuccess is returned. |
201 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 199 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
202 CHECK(pending_error_handler.has_pending_error()); | 200 CHECK(pending_error_handler.has_pending_error()); |
203 } | 201 } |
204 } | 202 } |
205 | 203 |
206 | 204 |
207 class ScriptResource : public v8::String::ExternalOneByteStringResource { | 205 class ScriptResource : public v8::String::ExternalOneByteStringResource { |
208 public: | 206 public: |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 361 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
364 scanner.Initialize(stream.get()); | 362 scanner.Initialize(stream.get()); |
365 | 363 |
366 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 364 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
367 i::AstValueFactory ast_value_factory( | 365 i::AstValueFactory ast_value_factory( |
368 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 366 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
369 i::PendingCompilationErrorHandler pending_error_handler; | 367 i::PendingCompilationErrorHandler pending_error_handler; |
370 i::PreParser preparser( | 368 i::PreParser preparser( |
371 &zone, &scanner, &ast_value_factory, &pending_error_handler, | 369 &zone, &scanner, &ast_value_factory, &pending_error_handler, |
372 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); | 370 CcTest::i_isolate()->counters()->runtime_call_stats(), stack_limit); |
373 preparser.set_allow_lazy(true); | |
374 preparser.set_allow_natives(true); | 371 preparser.set_allow_natives(true); |
375 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 372 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
376 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 373 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
377 CHECK(!pending_error_handler.has_pending_error()); | 374 CHECK(!pending_error_handler.has_pending_error()); |
378 } | 375 } |
379 } | 376 } |
380 | 377 |
381 | 378 |
382 TEST(StandAlonePreParserNoNatives) { | 379 TEST(StandAlonePreParserNoNatives) { |
383 v8::V8::Initialize(); | 380 v8::V8::Initialize(); |
(...skipping 15 matching lines...) Expand all Loading... |
399 scanner.Initialize(stream.get()); | 396 scanner.Initialize(stream.get()); |
400 | 397 |
401 // Preparser defaults to disallowing natives syntax. | 398 // Preparser defaults to disallowing natives syntax. |
402 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 399 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
403 i::AstValueFactory ast_value_factory( | 400 i::AstValueFactory ast_value_factory( |
404 &zone, CcTest::i_isolate()->heap()->HashSeed()); | 401 &zone, CcTest::i_isolate()->heap()->HashSeed()); |
405 i::PendingCompilationErrorHandler pending_error_handler; | 402 i::PendingCompilationErrorHandler pending_error_handler; |
406 i::PreParser preparser( | 403 i::PreParser preparser( |
407 &zone, &scanner, &ast_value_factory, &pending_error_handler, | 404 &zone, &scanner, &ast_value_factory, &pending_error_handler, |
408 isolate->counters()->runtime_call_stats(), stack_limit); | 405 isolate->counters()->runtime_call_stats(), stack_limit); |
409 preparser.set_allow_lazy(true); | |
410 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 406 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
411 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 407 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
412 CHECK(pending_error_handler.has_pending_error()); | 408 CHECK(pending_error_handler.has_pending_error()); |
413 } | 409 } |
414 } | 410 } |
415 | 411 |
416 | 412 |
417 TEST(PreparsingObjectLiterals) { | 413 TEST(PreparsingObjectLiterals) { |
418 // Regression test for a bug where the symbol stream produced by PreParser | 414 // Regression test for a bug where the symbol stream produced by PreParser |
419 // didn't match what Parser wanted to consume. | 415 // didn't match what Parser wanted to consume. |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 464 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
469 scanner.Initialize(stream.get()); | 465 scanner.Initialize(stream.get()); |
470 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 466 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
471 i::AstValueFactory ast_value_factory(&zone, | 467 i::AstValueFactory ast_value_factory(&zone, |
472 CcTest::i_isolate()->heap()->HashSeed()); | 468 CcTest::i_isolate()->heap()->HashSeed()); |
473 i::PendingCompilationErrorHandler pending_error_handler; | 469 i::PendingCompilationErrorHandler pending_error_handler; |
474 i::PreParser preparser(&zone, &scanner, &ast_value_factory, | 470 i::PreParser preparser(&zone, &scanner, &ast_value_factory, |
475 &pending_error_handler, | 471 &pending_error_handler, |
476 isolate->counters()->runtime_call_stats(), | 472 isolate->counters()->runtime_call_stats(), |
477 CcTest::i_isolate()->stack_guard()->real_climit()); | 473 CcTest::i_isolate()->stack_guard()->real_climit()); |
478 preparser.set_allow_lazy(true); | |
479 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 474 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
480 // Even in the case of a syntax error, kPreParseSuccess is returned. | 475 // Even in the case of a syntax error, kPreParseSuccess is returned. |
481 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 476 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
482 CHECK(pending_error_handler.has_pending_error()); | 477 CHECK(pending_error_handler.has_pending_error()); |
483 } | 478 } |
484 | 479 |
485 | 480 |
486 TEST(Regress928) { | 481 TEST(Regress928) { |
487 // Test only applies when lazy parsing. | 482 // Test only applies when lazy parsing. |
488 if (!i::FLAG_lazy) return; | 483 if (!i::FLAG_lazy) return; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
544 i::Scanner scanner(isolate->unicode_cache()); | 539 i::Scanner scanner(isolate->unicode_cache()); |
545 scanner.Initialize(stream.get()); | 540 scanner.Initialize(stream.get()); |
546 | 541 |
547 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 542 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
548 i::AstValueFactory ast_value_factory(&zone, | 543 i::AstValueFactory ast_value_factory(&zone, |
549 CcTest::i_isolate()->heap()->HashSeed()); | 544 CcTest::i_isolate()->heap()->HashSeed()); |
550 i::PendingCompilationErrorHandler pending_error_handler; | 545 i::PendingCompilationErrorHandler pending_error_handler; |
551 i::PreParser preparser( | 546 i::PreParser preparser( |
552 &zone, &scanner, &ast_value_factory, &pending_error_handler, | 547 &zone, &scanner, &ast_value_factory, &pending_error_handler, |
553 isolate->counters()->runtime_call_stats(), stack_limit); | 548 isolate->counters()->runtime_call_stats(), stack_limit); |
554 preparser.set_allow_lazy(true); | |
555 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 549 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
556 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); | 550 CHECK_EQ(i::PreParser::kPreParseStackOverflow, result); |
557 } | 551 } |
558 | 552 |
559 | 553 |
560 void TestStreamScanner(i::Utf16CharacterStream* stream, | 554 void TestStreamScanner(i::Utf16CharacterStream* stream, |
561 i::Token::Value* expected_tokens, | 555 i::Token::Value* expected_tokens, |
562 int skip_pos = 0, // Zero means not skipping. | 556 int skip_pos = 0, // Zero means not skipping. |
563 int skip_to = 0) { | 557 int skip_to = 0) { |
564 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 558 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); |
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1173 source_data[i].outer_suffix); | 1167 source_data[i].outer_suffix); |
1174 | 1168 |
1175 // Parse program source. | 1169 // Parse program source. |
1176 i::Handle<i::String> source = factory->NewStringFromUtf8( | 1170 i::Handle<i::String> source = factory->NewStringFromUtf8( |
1177 i::CStrVector(program.start())).ToHandleChecked(); | 1171 i::CStrVector(program.start())).ToHandleChecked(); |
1178 CHECK_EQ(source->length(), kProgramSize); | 1172 CHECK_EQ(source->length(), kProgramSize); |
1179 i::Handle<i::Script> script = factory->NewScript(source); | 1173 i::Handle<i::Script> script = factory->NewScript(source); |
1180 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 1174 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
1181 i::ParseInfo info(&zone, script); | 1175 i::ParseInfo info(&zone, script); |
1182 i::Parser parser(&info); | 1176 i::Parser parser(&info); |
1183 parser.set_allow_lazy(true); | |
1184 info.set_language_mode(source_data[i].language_mode); | 1177 info.set_language_mode(source_data[i].language_mode); |
| 1178 info.set_allow_lazy_parsing(); |
1185 parser.Parse(&info); | 1179 parser.Parse(&info); |
1186 CHECK(info.literal() != NULL); | 1180 CHECK_NOT_NULL(info.literal()); |
1187 | 1181 |
1188 // Check scope types and positions. | 1182 // Check scope types and positions. |
1189 i::Scope* scope = info.literal()->scope(); | 1183 i::Scope* scope = info.literal()->scope(); |
1190 CHECK(scope->is_script_scope()); | 1184 CHECK(scope->is_script_scope()); |
1191 CHECK_EQ(scope->start_position(), 0); | 1185 CHECK_EQ(scope->start_position(), 0); |
1192 CHECK_EQ(scope->end_position(), kProgramSize); | 1186 CHECK_EQ(scope->end_position(), kProgramSize); |
1193 | 1187 |
1194 i::Scope* inner_scope = scope->inner_scope(); | 1188 i::Scope* inner_scope = scope->inner_scope(); |
1195 DCHECK_NOT_NULL(inner_scope); | 1189 DCHECK_NOT_NULL(inner_scope); |
1196 DCHECK_NULL(inner_scope->sibling()); | 1190 DCHECK_NULL(inner_scope->sibling()); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1291 | 1285 |
1292 enum ParserSyncTestResult { | 1286 enum ParserSyncTestResult { |
1293 kSuccessOrError, | 1287 kSuccessOrError, |
1294 kSuccess, | 1288 kSuccess, |
1295 kError | 1289 kError |
1296 }; | 1290 }; |
1297 | 1291 |
1298 template <typename Traits> | 1292 template <typename Traits> |
1299 void SetParserFlags(i::ParserBase<Traits>* parser, | 1293 void SetParserFlags(i::ParserBase<Traits>* parser, |
1300 i::EnumSet<ParserFlag> flags) { | 1294 i::EnumSet<ParserFlag> flags) { |
1301 parser->set_allow_lazy(flags.Contains(kAllowLazy)); | |
1302 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1295 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
1303 parser->set_allow_harmony_function_sent( | 1296 parser->set_allow_harmony_function_sent( |
1304 flags.Contains(kAllowHarmonyFunctionSent)); | 1297 flags.Contains(kAllowHarmonyFunctionSent)); |
1305 parser->set_allow_harmony_async_await( | 1298 parser->set_allow_harmony_async_await( |
1306 flags.Contains(kAllowHarmonyAsyncAwait)); | 1299 flags.Contains(kAllowHarmonyAsyncAwait)); |
1307 parser->set_allow_harmony_restrictive_generators( | 1300 parser->set_allow_harmony_restrictive_generators( |
1308 flags.Contains(kAllowHarmonyRestrictiveGenerators)); | 1301 flags.Contains(kAllowHarmonyRestrictiveGenerators)); |
1309 parser->set_allow_harmony_trailing_commas( | 1302 parser->set_allow_harmony_trailing_commas( |
1310 flags.Contains(kAllowHarmonyTrailingCommas)); | 1303 flags.Contains(kAllowHarmonyTrailingCommas)); |
1311 parser->set_allow_harmony_class_fields( | 1304 parser->set_allow_harmony_class_fields( |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1343 preparser.PreParseProgram(&preparser_materialized_literals, is_module); | 1336 preparser.PreParseProgram(&preparser_materialized_literals, is_module); |
1344 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 1337 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
1345 } | 1338 } |
1346 | 1339 |
1347 // Parse the data | 1340 // Parse the data |
1348 i::FunctionLiteral* function; | 1341 i::FunctionLiteral* function; |
1349 { | 1342 { |
1350 i::Handle<i::Script> script = factory->NewScript(source); | 1343 i::Handle<i::Script> script = factory->NewScript(source); |
1351 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 1344 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
1352 i::ParseInfo info(&zone, script); | 1345 i::ParseInfo info(&zone, script); |
| 1346 info.set_allow_lazy_parsing(flags.Contains(kAllowLazy)); |
1353 i::Parser parser(&info); | 1347 i::Parser parser(&info); |
1354 SetParserFlags(&parser, flags); | 1348 SetParserFlags(&parser, flags); |
1355 if (is_module) info.set_module(); | 1349 if (is_module) info.set_module(); |
1356 parser.Parse(&info); | 1350 parser.Parse(&info); |
1357 function = info.literal(); | 1351 function = info.literal(); |
1358 if (function) { | 1352 if (function) { |
1359 parser_materialized_literals = function->materialized_literal_count(); | 1353 parser_materialized_literals = function->materialized_literal_count(); |
1360 } | 1354 } |
1361 } | 1355 } |
1362 | 1356 |
(...skipping 6945 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8308 const char* data[] = { | 8302 const char* data[] = { |
8309 "const arguments = 1", | 8303 "const arguments = 1", |
8310 "let arguments", | 8304 "let arguments", |
8311 "var arguments", | 8305 "var arguments", |
8312 NULL | 8306 NULL |
8313 }; | 8307 }; |
8314 // clang-format on | 8308 // clang-format on |
8315 RunParserSyncTest(context_data, data, kSuccess); | 8309 RunParserSyncTest(context_data, data, kSuccess); |
8316 } | 8310 } |
8317 } | 8311 } |
OLD | NEW |