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 25 matching lines...) Expand all Loading... |
36 #include "src/ast/ast-numbering.h" | 36 #include "src/ast/ast-numbering.h" |
37 #include "src/ast/ast-value-factory.h" | 37 #include "src/ast/ast-value-factory.h" |
38 #include "src/ast/ast.h" | 38 #include "src/ast/ast.h" |
39 #include "src/compiler.h" | 39 #include "src/compiler.h" |
40 #include "src/execution.h" | 40 #include "src/execution.h" |
41 #include "src/flags.h" | 41 #include "src/flags.h" |
42 #include "src/isolate.h" | 42 #include "src/isolate.h" |
43 #include "src/objects.h" | 43 #include "src/objects.h" |
44 #include "src/parsing/parse-info.h" | 44 #include "src/parsing/parse-info.h" |
45 #include "src/parsing/parser.h" | 45 #include "src/parsing/parser.h" |
| 46 #include "src/parsing/parsing.h" |
46 #include "src/parsing/preparser.h" | 47 #include "src/parsing/preparser.h" |
47 #include "src/parsing/rewriter.h" | 48 #include "src/parsing/rewriter.h" |
48 #include "src/parsing/scanner-character-streams.h" | 49 #include "src/parsing/scanner-character-streams.h" |
49 #include "src/parsing/token.h" | 50 #include "src/parsing/token.h" |
50 #include "src/utils.h" | 51 #include "src/utils.h" |
51 | 52 |
52 #include "test/cctest/cctest.h" | 53 #include "test/cctest/cctest.h" |
53 | 54 |
54 TEST(ScanKeywords) { | 55 TEST(ScanKeywords) { |
55 struct KeywordToken { | 56 struct KeywordToken { |
(...skipping 756 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, | 813 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, |
813 source_data[i].body, surroundings[j].suffix); | 814 source_data[i].body, surroundings[j].suffix); |
814 i::Handle<i::String> source = | 815 i::Handle<i::String> source = |
815 factory->NewStringFromUtf8(i::CStrVector(program.start())) | 816 factory->NewStringFromUtf8(i::CStrVector(program.start())) |
816 .ToHandleChecked(); | 817 .ToHandleChecked(); |
817 i::Handle<i::Script> script = factory->NewScript(source); | 818 i::Handle<i::Script> script = factory->NewScript(source); |
818 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 819 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
819 i::ParseInfo info(&zone, script); | 820 i::ParseInfo info(&zone, script); |
820 // The information we're checking is only produced when eager parsing. | 821 // The information we're checking is only produced when eager parsing. |
821 info.set_allow_lazy_parsing(false); | 822 info.set_allow_lazy_parsing(false); |
822 i::Parser parser(&info); | 823 CHECK(i::parsing::ParseProgram(&info)); |
823 CHECK(parser.Parse(&info)); | |
824 CHECK(i::Rewriter::Rewrite(&info)); | 824 CHECK(i::Rewriter::Rewrite(&info)); |
825 i::DeclarationScope::Analyze(&info, i::AnalyzeMode::kRegular); | 825 i::DeclarationScope::Analyze(&info, i::AnalyzeMode::kRegular); |
826 CHECK(info.literal() != NULL); | 826 CHECK(info.literal() != NULL); |
827 | 827 |
828 i::DeclarationScope* script_scope = info.literal()->scope(); | 828 i::DeclarationScope* script_scope = info.literal()->scope(); |
829 CHECK(script_scope->is_script_scope()); | 829 CHECK(script_scope->is_script_scope()); |
830 | 830 |
831 i::Scope* scope = script_scope->inner_scope(); | 831 i::Scope* scope = script_scope->inner_scope(); |
832 DCHECK_NOT_NULL(scope); | 832 DCHECK_NOT_NULL(scope); |
833 DCHECK_NULL(scope->sibling()); | 833 DCHECK_NULL(scope->sibling()); |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1166 source_data[i].inner_source, | 1166 source_data[i].inner_source, |
1167 source_data[i].outer_suffix); | 1167 source_data[i].outer_suffix); |
1168 | 1168 |
1169 // Parse program source. | 1169 // Parse program source. |
1170 i::Handle<i::String> source = factory->NewStringFromUtf8( | 1170 i::Handle<i::String> source = factory->NewStringFromUtf8( |
1171 i::CStrVector(program.start())).ToHandleChecked(); | 1171 i::CStrVector(program.start())).ToHandleChecked(); |
1172 CHECK_EQ(source->length(), kProgramSize); | 1172 CHECK_EQ(source->length(), kProgramSize); |
1173 i::Handle<i::Script> script = factory->NewScript(source); | 1173 i::Handle<i::Script> script = factory->NewScript(source); |
1174 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 1174 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
1175 i::ParseInfo info(&zone, script); | 1175 i::ParseInfo info(&zone, script); |
1176 i::Parser parser(&info); | |
1177 info.set_language_mode(source_data[i].language_mode); | 1176 info.set_language_mode(source_data[i].language_mode); |
1178 parser.Parse(&info); | 1177 i::parsing::ParseProgram(&info); |
1179 CHECK_NOT_NULL(info.literal()); | 1178 CHECK_NOT_NULL(info.literal()); |
1180 | 1179 |
1181 // Check scope types and positions. | 1180 // Check scope types and positions. |
1182 i::Scope* scope = info.literal()->scope(); | 1181 i::Scope* scope = info.literal()->scope(); |
1183 CHECK(scope->is_script_scope()); | 1182 CHECK(scope->is_script_scope()); |
1184 CHECK_EQ(scope->start_position(), 0); | 1183 CHECK_EQ(scope->start_position(), 0); |
1185 CHECK_EQ(scope->end_position(), kProgramSize); | 1184 CHECK_EQ(scope->end_position(), kProgramSize); |
1186 | 1185 |
1187 i::Scope* inner_scope = scope->inner_scope(); | 1186 i::Scope* inner_scope = scope->inner_scope(); |
1188 DCHECK_NOT_NULL(inner_scope); | 1187 DCHECK_NOT_NULL(inner_scope); |
(...skipping 25 matching lines...) Expand all Loading... |
1214 v8::HandleScope handles(CcTest::isolate()); | 1213 v8::HandleScope handles(CcTest::isolate()); |
1215 i::FunctionLiteral* function; | 1214 i::FunctionLiteral* function; |
1216 | 1215 |
1217 for (int i = 0; discard_sources[i]; i++) { | 1216 for (int i = 0; discard_sources[i]; i++) { |
1218 const char* source = discard_sources[i]; | 1217 const char* source = discard_sources[i]; |
1219 i::Handle<i::String> source_code = | 1218 i::Handle<i::String> source_code = |
1220 factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked(); | 1219 factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked(); |
1221 i::Handle<i::Script> script = factory->NewScript(source_code); | 1220 i::Handle<i::Script> script = factory->NewScript(source_code); |
1222 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 1221 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
1223 i::ParseInfo info(&zone, script); | 1222 i::ParseInfo info(&zone, script); |
1224 i::Parser parser(&info); | 1223 i::parsing::ParseProgram(&info); |
1225 parser.Parse(&info); | |
1226 function = info.literal(); | 1224 function = info.literal(); |
1227 CHECK_NOT_NULL(function); | 1225 CHECK_NOT_NULL(function); |
1228 CHECK_NOT_NULL(function->body()); | 1226 CHECK_NOT_NULL(function->body()); |
1229 CHECK_EQ(1, function->body()->length()); | 1227 CHECK_EQ(1, function->body()->length()); |
1230 i::FunctionLiteral* inner = | 1228 i::FunctionLiteral* inner = |
1231 function->body()->first()->AsExpressionStatement()->expression()-> | 1229 function->body()->first()->AsExpressionStatement()->expression()-> |
1232 AsCall()->expression()->AsFunctionLiteral(); | 1230 AsCall()->expression()->AsFunctionLiteral(); |
1233 i::Scope* inner_scope = inner->scope(); | 1231 i::Scope* inner_scope = inner->scope(); |
1234 i::FunctionLiteral* fun = nullptr; | 1232 i::FunctionLiteral* fun = nullptr; |
1235 if (!inner_scope->declarations()->is_empty()) { | 1233 if (!inner_scope->declarations()->is_empty()) { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 kAllowHarmonyTrailingCommas, | 1278 kAllowHarmonyTrailingCommas, |
1281 kAllowHarmonyClassFields, | 1279 kAllowHarmonyClassFields, |
1282 }; | 1280 }; |
1283 | 1281 |
1284 enum ParserSyncTestResult { | 1282 enum ParserSyncTestResult { |
1285 kSuccessOrError, | 1283 kSuccessOrError, |
1286 kSuccess, | 1284 kSuccess, |
1287 kError | 1285 kError |
1288 }; | 1286 }; |
1289 | 1287 |
1290 template <typename Traits> | 1288 void SetGlobalFlags(i::EnumSet<ParserFlag> flags) { |
1291 void SetParserFlags(i::ParserBase<Traits>* parser, | 1289 i::FLAG_allow_natives_syntax = flags.Contains(kAllowNatives); |
1292 i::EnumSet<ParserFlag> flags) { | 1290 i::FLAG_harmony_function_sent = flags.Contains(kAllowHarmonyFunctionSent); |
| 1291 i::FLAG_harmony_async_await = flags.Contains(kAllowHarmonyAsyncAwait); |
| 1292 i::FLAG_harmony_restrictive_generators = |
| 1293 flags.Contains(kAllowHarmonyRestrictiveGenerators); |
| 1294 i::FLAG_harmony_trailing_commas = flags.Contains(kAllowHarmonyTrailingCommas); |
| 1295 i::FLAG_harmony_class_fields = flags.Contains(kAllowHarmonyClassFields); |
| 1296 } |
| 1297 |
| 1298 void SetParserFlags(i::PreParser* parser, i::EnumSet<ParserFlag> flags) { |
1293 parser->set_allow_natives(flags.Contains(kAllowNatives)); | 1299 parser->set_allow_natives(flags.Contains(kAllowNatives)); |
1294 parser->set_allow_harmony_function_sent( | 1300 parser->set_allow_harmony_function_sent( |
1295 flags.Contains(kAllowHarmonyFunctionSent)); | 1301 flags.Contains(kAllowHarmonyFunctionSent)); |
1296 parser->set_allow_harmony_async_await( | 1302 parser->set_allow_harmony_async_await( |
1297 flags.Contains(kAllowHarmonyAsyncAwait)); | 1303 flags.Contains(kAllowHarmonyAsyncAwait)); |
1298 parser->set_allow_harmony_restrictive_generators( | 1304 parser->set_allow_harmony_restrictive_generators( |
1299 flags.Contains(kAllowHarmonyRestrictiveGenerators)); | 1305 flags.Contains(kAllowHarmonyRestrictiveGenerators)); |
1300 parser->set_allow_harmony_trailing_commas( | 1306 parser->set_allow_harmony_trailing_commas( |
1301 flags.Contains(kAllowHarmonyTrailingCommas)); | 1307 flags.Contains(kAllowHarmonyTrailingCommas)); |
1302 parser->set_allow_harmony_class_fields( | 1308 parser->set_allow_harmony_class_fields( |
1303 flags.Contains(kAllowHarmonyClassFields)); | 1309 flags.Contains(kAllowHarmonyClassFields)); |
1304 } | 1310 } |
1305 | 1311 |
1306 | |
1307 void TestParserSyncWithFlags(i::Handle<i::String> source, | 1312 void TestParserSyncWithFlags(i::Handle<i::String> source, |
1308 i::EnumSet<ParserFlag> flags, | 1313 i::EnumSet<ParserFlag> flags, |
1309 ParserSyncTestResult result, | 1314 ParserSyncTestResult result, |
1310 bool is_module = false, | 1315 bool is_module = false, |
1311 bool test_preparser = true) { | 1316 bool test_preparser = true) { |
1312 i::Isolate* isolate = CcTest::i_isolate(); | 1317 i::Isolate* isolate = CcTest::i_isolate(); |
1313 i::Factory* factory = isolate->factory(); | 1318 i::Factory* factory = isolate->factory(); |
1314 | 1319 |
1315 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); | 1320 uintptr_t stack_limit = isolate->stack_guard()->real_climit(); |
1316 int preparser_materialized_literals = -1; | 1321 int preparser_materialized_literals = -1; |
(...skipping 18 matching lines...) Expand all Loading... |
1335 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 1340 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
1336 } | 1341 } |
1337 | 1342 |
1338 // Parse the data | 1343 // Parse the data |
1339 i::FunctionLiteral* function; | 1344 i::FunctionLiteral* function; |
1340 { | 1345 { |
1341 i::Handle<i::Script> script = factory->NewScript(source); | 1346 i::Handle<i::Script> script = factory->NewScript(source); |
1342 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 1347 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
1343 i::ParseInfo info(&zone, script); | 1348 i::ParseInfo info(&zone, script); |
1344 info.set_allow_lazy_parsing(flags.Contains(kAllowLazy)); | 1349 info.set_allow_lazy_parsing(flags.Contains(kAllowLazy)); |
1345 i::Parser parser(&info); | 1350 SetGlobalFlags(flags); |
1346 SetParserFlags(&parser, flags); | |
1347 if (is_module) info.set_module(); | 1351 if (is_module) info.set_module(); |
1348 parser.Parse(&info); | 1352 i::parsing::ParseProgram(&info); |
1349 function = info.literal(); | 1353 function = info.literal(); |
1350 if (function) { | 1354 if (function) { |
1351 parser_materialized_literals = function->materialized_literal_count(); | 1355 parser_materialized_literals = function->materialized_literal_count(); |
1352 } | 1356 } |
1353 } | 1357 } |
1354 | 1358 |
1355 // Check that preparsing fails iff parsing fails. | 1359 // Check that preparsing fails iff parsing fails. |
1356 if (function == NULL) { | 1360 if (function == NULL) { |
1357 // Extract exception from the parser. | 1361 // Extract exception from the parser. |
1358 CHECK(isolate->has_pending_exception()); | 1362 CHECK(isolate->has_pending_exception()); |
(...skipping 1111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2470 const char* program = test_cases[i].program; | 2474 const char* program = test_cases[i].program; |
2471 i::Factory* factory = CcTest::i_isolate()->factory(); | 2475 i::Factory* factory = CcTest::i_isolate()->factory(); |
2472 i::Handle<i::String> source = | 2476 i::Handle<i::String> source = |
2473 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); | 2477 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); |
2474 i::Handle<i::Script> script = factory->NewScript(source); | 2478 i::Handle<i::Script> script = factory->NewScript(source); |
2475 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 2479 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
2476 i::ParseInfo info(&zone, script); | 2480 i::ParseInfo info(&zone, script); |
2477 i::ScriptData* sd = NULL; | 2481 i::ScriptData* sd = NULL; |
2478 info.set_cached_data(&sd); | 2482 info.set_cached_data(&sd); |
2479 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache); | 2483 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache); |
2480 i::Parser::ParseStatic(&info); | 2484 i::parsing::ParseProgram(&info); |
2481 i::ParseData* pd = i::ParseData::FromCachedData(sd); | 2485 i::ParseData* pd = i::ParseData::FromCachedData(sd); |
2482 | 2486 |
2483 if (pd->FunctionCount() != test_cases[i].functions) { | 2487 if (pd->FunctionCount() != test_cases[i].functions) { |
2484 v8::base::OS::Print( | 2488 v8::base::OS::Print( |
2485 "Expected preparse data for program:\n" | 2489 "Expected preparse data for program:\n" |
2486 "\t%s\n" | 2490 "\t%s\n" |
2487 "to contain %d functions, however, received %d functions.\n", | 2491 "to contain %d functions, however, received %d functions.\n", |
2488 program, test_cases[i].functions, pd->FunctionCount()); | 2492 program, test_cases[i].functions, pd->FunctionCount()); |
2489 CHECK(false); | 2493 CHECK(false); |
2490 } | 2494 } |
(...skipping 865 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3356 | 3360 |
3357 i::Zone zone(isolate->allocator(), ZONE_NAME); | 3361 i::Zone zone(isolate->allocator(), ZONE_NAME); |
3358 std::unique_ptr<i::ParseInfo> info; | 3362 std::unique_ptr<i::ParseInfo> info; |
3359 if (lazy) { | 3363 if (lazy) { |
3360 printf("%s\n", program.start()); | 3364 printf("%s\n", program.start()); |
3361 v8::Local<v8::Value> v = CompileRun(program.start()); | 3365 v8::Local<v8::Value> v = CompileRun(program.start()); |
3362 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); | 3366 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); |
3363 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); | 3367 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); |
3364 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared()); | 3368 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared()); |
3365 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared)); | 3369 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared)); |
| 3370 CHECK(i::parsing::ParseFunction(info.get())); |
3366 } else { | 3371 } else { |
3367 i::Handle<i::String> source = | 3372 i::Handle<i::String> source = |
3368 factory->InternalizeUtf8String(program.start()); | 3373 factory->InternalizeUtf8String(program.start()); |
3369 source->PrintOn(stdout); | 3374 source->PrintOn(stdout); |
3370 printf("\n"); | 3375 printf("\n"); |
3371 i::Handle<i::Script> script = factory->NewScript(source); | 3376 i::Handle<i::Script> script = factory->NewScript(source); |
3372 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, script)); | 3377 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, script)); |
3373 info->set_allow_lazy_parsing(false); | 3378 info->set_allow_lazy_parsing(false); |
| 3379 CHECK(i::parsing::ParseProgram(info.get())); |
3374 } | 3380 } |
3375 i::Parser parser(info.get()); | |
3376 CHECK(parser.Parse(info.get())); | |
3377 CHECK(i::Compiler::Analyze(info.get())); | 3381 CHECK(i::Compiler::Analyze(info.get())); |
3378 CHECK(info->literal() != NULL); | 3382 CHECK(info->literal() != NULL); |
3379 | 3383 |
3380 i::Scope* scope = info->literal()->scope(); | 3384 i::Scope* scope = info->literal()->scope(); |
3381 if (!lazy) { | 3385 if (!lazy) { |
3382 scope = scope->inner_scope(); | 3386 scope = scope->inner_scope(); |
3383 } | 3387 } |
3384 DCHECK_NOT_NULL(scope); | 3388 DCHECK_NOT_NULL(scope); |
3385 DCHECK_NULL(scope->sibling()); | 3389 DCHECK_NULL(scope->sibling()); |
3386 DCHECK(scope->is_function_scope()); | 3390 DCHECK(scope->is_function_scope()); |
(...skipping 2342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5729 | 5733 |
5730 for (unsigned i = 0; i < arraysize(kSources); ++i) { | 5734 for (unsigned i = 0; i < arraysize(kSources); ++i) { |
5731 i::Handle<i::String> source = | 5735 i::Handle<i::String> source = |
5732 factory->NewStringFromAsciiChecked(kSources[i]); | 5736 factory->NewStringFromAsciiChecked(kSources[i]); |
5733 | 5737 |
5734 // Show that parsing as a module works | 5738 // Show that parsing as a module works |
5735 { | 5739 { |
5736 i::Handle<i::Script> script = factory->NewScript(source); | 5740 i::Handle<i::Script> script = factory->NewScript(source); |
5737 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 5741 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
5738 i::ParseInfo info(&zone, script); | 5742 i::ParseInfo info(&zone, script); |
5739 i::Parser parser(&info); | |
5740 info.set_module(); | 5743 info.set_module(); |
5741 if (!parser.Parse(&info)) { | 5744 if (!i::parsing::ParseProgram(&info)) { |
5742 i::Handle<i::JSObject> exception_handle( | 5745 i::Handle<i::JSObject> exception_handle( |
5743 i::JSObject::cast(isolate->pending_exception())); | 5746 i::JSObject::cast(isolate->pending_exception())); |
5744 i::Handle<i::String> message_string = i::Handle<i::String>::cast( | 5747 i::Handle<i::String> message_string = i::Handle<i::String>::cast( |
5745 i::JSReceiver::GetProperty(isolate, exception_handle, "message") | 5748 i::JSReceiver::GetProperty(isolate, exception_handle, "message") |
5746 .ToHandleChecked()); | 5749 .ToHandleChecked()); |
5747 isolate->clear_pending_exception(); | 5750 isolate->clear_pending_exception(); |
5748 | 5751 |
5749 v8::base::OS::Print( | 5752 v8::base::OS::Print( |
5750 "Parser failed on:\n" | 5753 "Parser failed on:\n" |
5751 "\t%s\n" | 5754 "\t%s\n" |
5752 "with error:\n" | 5755 "with error:\n" |
5753 "\t%s\n" | 5756 "\t%s\n" |
5754 "However, we expected no error.", | 5757 "However, we expected no error.", |
5755 source->ToCString().get(), message_string->ToCString().get()); | 5758 source->ToCString().get(), message_string->ToCString().get()); |
5756 CHECK(false); | 5759 CHECK(false); |
5757 } | 5760 } |
5758 } | 5761 } |
5759 | 5762 |
5760 // And that parsing a script does not. | 5763 // And that parsing a script does not. |
5761 { | 5764 { |
5762 i::Handle<i::Script> script = factory->NewScript(source); | 5765 i::Handle<i::Script> script = factory->NewScript(source); |
5763 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 5766 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
5764 i::ParseInfo info(&zone, script); | 5767 i::ParseInfo info(&zone, script); |
5765 i::Parser parser(&info); | 5768 CHECK(!i::parsing::ParseProgram(&info)); |
5766 CHECK(!parser.Parse(&info)); | |
5767 isolate->clear_pending_exception(); | 5769 isolate->clear_pending_exception(); |
5768 } | 5770 } |
5769 } | 5771 } |
5770 } | 5772 } |
5771 | 5773 |
5772 | 5774 |
5773 TEST(ImportExportParsingErrors) { | 5775 TEST(ImportExportParsingErrors) { |
5774 // clang-format off | 5776 // clang-format off |
5775 const char* kErrorSources[] = { | 5777 const char* kErrorSources[] = { |
5776 "export {", | 5778 "export {", |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5847 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5849 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
5848 128 * 1024); | 5850 128 * 1024); |
5849 | 5851 |
5850 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { | 5852 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { |
5851 i::Handle<i::String> source = | 5853 i::Handle<i::String> source = |
5852 factory->NewStringFromAsciiChecked(kErrorSources[i]); | 5854 factory->NewStringFromAsciiChecked(kErrorSources[i]); |
5853 | 5855 |
5854 i::Handle<i::Script> script = factory->NewScript(source); | 5856 i::Handle<i::Script> script = factory->NewScript(source); |
5855 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 5857 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
5856 i::ParseInfo info(&zone, script); | 5858 i::ParseInfo info(&zone, script); |
5857 i::Parser parser(&info); | |
5858 info.set_module(); | 5859 info.set_module(); |
5859 CHECK(!parser.Parse(&info)); | 5860 CHECK(!i::parsing::ParseProgram(&info)); |
5860 isolate->clear_pending_exception(); | 5861 isolate->clear_pending_exception(); |
5861 } | 5862 } |
5862 } | 5863 } |
5863 | 5864 |
5864 TEST(ModuleTopLevelFunctionDecl) { | 5865 TEST(ModuleTopLevelFunctionDecl) { |
5865 // clang-format off | 5866 // clang-format off |
5866 const char* kErrorSources[] = { | 5867 const char* kErrorSources[] = { |
5867 "function f() {} function f() {}", | 5868 "function f() {} function f() {}", |
5868 "var f; function f() {}", | 5869 "var f; function f() {}", |
5869 "function f() {} var f;", | 5870 "function f() {} var f;", |
(...skipping 15 matching lines...) Expand all Loading... |
5885 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5886 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
5886 128 * 1024); | 5887 128 * 1024); |
5887 | 5888 |
5888 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { | 5889 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { |
5889 i::Handle<i::String> source = | 5890 i::Handle<i::String> source = |
5890 factory->NewStringFromAsciiChecked(kErrorSources[i]); | 5891 factory->NewStringFromAsciiChecked(kErrorSources[i]); |
5891 | 5892 |
5892 i::Handle<i::Script> script = factory->NewScript(source); | 5893 i::Handle<i::Script> script = factory->NewScript(source); |
5893 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 5894 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
5894 i::ParseInfo info(&zone, script); | 5895 i::ParseInfo info(&zone, script); |
5895 i::Parser parser(&info); | |
5896 info.set_module(); | 5896 info.set_module(); |
5897 CHECK(!parser.Parse(&info)); | 5897 CHECK(!i::parsing::ParseProgram(&info)); |
5898 isolate->clear_pending_exception(); | 5898 isolate->clear_pending_exception(); |
5899 } | 5899 } |
5900 } | 5900 } |
5901 | 5901 |
5902 TEST(ModuleAwaitReserved) { | 5902 TEST(ModuleAwaitReserved) { |
5903 // clang-format off | 5903 // clang-format off |
5904 const char* kErrorSources[] = { | 5904 const char* kErrorSources[] = { |
5905 "await;", | 5905 "await;", |
5906 "await: ;", | 5906 "await: ;", |
5907 "var await;", | 5907 "var await;", |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6084 "import {m as mm} from 'm.js';" | 6084 "import {m as mm} from 'm.js';" |
6085 "import {aa} from 'm.js';" | 6085 "import {aa} from 'm.js';" |
6086 "export {aa as bb, x};" | 6086 "export {aa as bb, x};" |
6087 "import * as loo from 'bar.js';" | 6087 "import * as loo from 'bar.js';" |
6088 "import * as foob from 'bar.js';" | 6088 "import * as foob from 'bar.js';" |
6089 "export {foob};"; | 6089 "export {foob};"; |
6090 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); | 6090 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); |
6091 i::Handle<i::Script> script = factory->NewScript(source); | 6091 i::Handle<i::Script> script = factory->NewScript(source); |
6092 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 6092 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
6093 i::ParseInfo info(&zone, script); | 6093 i::ParseInfo info(&zone, script); |
6094 i::Parser parser(&info); | |
6095 info.set_module(); | 6094 info.set_module(); |
6096 CHECK(parser.Parse(&info)); | 6095 CHECK(i::parsing::ParseProgram(&info)); |
6097 CHECK(i::Compiler::Analyze(&info)); | 6096 CHECK(i::Compiler::Analyze(&info)); |
6098 i::FunctionLiteral* func = info.literal(); | 6097 i::FunctionLiteral* func = info.literal(); |
6099 i::ModuleScope* module_scope = func->scope()->AsModuleScope(); | 6098 i::ModuleScope* module_scope = func->scope()->AsModuleScope(); |
6100 i::Scope* outer_scope = module_scope->outer_scope(); | 6099 i::Scope* outer_scope = module_scope->outer_scope(); |
6101 CHECK(outer_scope->is_script_scope()); | 6100 CHECK(outer_scope->is_script_scope()); |
6102 CHECK_NULL(outer_scope->outer_scope()); | 6101 CHECK_NULL(outer_scope->outer_scope()); |
6103 CHECK(module_scope->is_module_scope()); | 6102 CHECK(module_scope->is_module_scope()); |
6104 const i::ModuleDescriptor::Entry* entry; | 6103 const i::ModuleDescriptor::Entry* entry; |
6105 i::Declaration::List* declarations = module_scope->declarations(); | 6104 i::Declaration::List* declarations = module_scope->declarations(); |
6106 CHECK_EQ(13, declarations->LengthForTest()); | 6105 CHECK_EQ(13, declarations->LengthForTest()); |
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6345 v8::HandleScope handles(CcTest::isolate()); | 6344 v8::HandleScope handles(CcTest::isolate()); |
6346 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); | 6345 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); |
6347 v8::Context::Scope context_scope(context); | 6346 v8::Context::Scope context_scope(context); |
6348 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 6347 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
6349 128 * 1024); | 6348 128 * 1024); |
6350 | 6349 |
6351 i::Handle<i::Script> script = | 6350 i::Handle<i::Script> script = |
6352 factory->NewScript(factory->NewStringFromAsciiChecked(source)); | 6351 factory->NewScript(factory->NewStringFromAsciiChecked(source)); |
6353 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); | 6352 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); |
6354 i::ParseInfo info(&zone, script); | 6353 i::ParseInfo info(&zone, script); |
6355 i::Parser parser(&info); | 6354 i::parsing::ParseProgram(&info); |
6356 parser.Parse(&info); | |
6357 CHECK(info.literal() != NULL); | 6355 CHECK(info.literal() != NULL); |
6358 CHECK_EQ(expected_language_mode, info.literal()->language_mode()); | 6356 CHECK_EQ(expected_language_mode, info.literal()->language_mode()); |
6359 } | 6357 } |
6360 | 6358 |
6361 | 6359 |
6362 TEST(LanguageModeDirectives) { | 6360 TEST(LanguageModeDirectives) { |
6363 TestLanguageMode("\"use nothing\"", i::SLOPPY); | 6361 TestLanguageMode("\"use nothing\"", i::SLOPPY); |
6364 TestLanguageMode("\"use strict\"", i::STRICT); | 6362 TestLanguageMode("\"use strict\"", i::STRICT); |
6365 | 6363 |
6366 TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY); | 6364 TestLanguageMode("var x = 1; \"use strict\"", i::SLOPPY); |
(...skipping 2031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8398 const char* data[] = { | 8396 const char* data[] = { |
8399 "const arguments = 1", | 8397 "const arguments = 1", |
8400 "let arguments", | 8398 "let arguments", |
8401 "var arguments", | 8399 "var arguments", |
8402 NULL | 8400 NULL |
8403 }; | 8401 }; |
8404 // clang-format on | 8402 // clang-format on |
8405 RunParserSyncTest(context_data, data, kSuccess); | 8403 RunParserSyncTest(context_data, data, kSuccess); |
8406 } | 8404 } |
8407 } | 8405 } |
OLD | NEW |