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

Side by Side Diff: test/cctest/test-parsing.cc

Issue 2632123006: Reland: [Parse] ParseInfo owns the parsing Zone. (Closed)
Patch Set: Rebase Created 3 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
« no previous file with comments | « test/cctest/parsing/test-preparser.cc ('k') | test/fuzzer/parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 786 matching lines...) Expand 10 before | Expand all | Expand 10 after
797 int kProgramByteSize = i::StrLength(surroundings[j].prefix) + 797 int kProgramByteSize = i::StrLength(surroundings[j].prefix) +
798 i::StrLength(surroundings[j].suffix) + 798 i::StrLength(surroundings[j].suffix) +
799 i::StrLength(source_data[i].body); 799 i::StrLength(source_data[i].body);
800 i::ScopedVector<char> program(kProgramByteSize + 1); 800 i::ScopedVector<char> program(kProgramByteSize + 1);
801 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, 801 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix,
802 source_data[i].body, surroundings[j].suffix); 802 source_data[i].body, surroundings[j].suffix);
803 i::Handle<i::String> source = 803 i::Handle<i::String> source =
804 factory->NewStringFromUtf8(i::CStrVector(program.start())) 804 factory->NewStringFromUtf8(i::CStrVector(program.start()))
805 .ToHandleChecked(); 805 .ToHandleChecked();
806 i::Handle<i::Script> script = factory->NewScript(source); 806 i::Handle<i::Script> script = factory->NewScript(source);
807 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 807 i::ParseInfo info(script);
808 i::ParseInfo info(&zone, script);
809 // The information we're checking is only produced when eager parsing. 808 // The information we're checking is only produced when eager parsing.
810 info.set_allow_lazy_parsing(false); 809 info.set_allow_lazy_parsing(false);
811 CHECK(i::parsing::ParseProgram(&info)); 810 CHECK(i::parsing::ParseProgram(&info));
812 CHECK(i::Rewriter::Rewrite(&info)); 811 CHECK(i::Rewriter::Rewrite(&info));
813 i::DeclarationScope::Analyze(&info, i::AnalyzeMode::kRegular); 812 i::DeclarationScope::Analyze(&info, i::AnalyzeMode::kRegular);
814 CHECK(info.literal() != NULL); 813 CHECK(info.literal() != NULL);
815 814
816 i::DeclarationScope* script_scope = info.literal()->scope(); 815 i::DeclarationScope* script_scope = info.literal()->scope();
817 CHECK(script_scope->is_script_scope()); 816 CHECK(script_scope->is_script_scope());
818 817
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
854 std::string full_source = "function f() { return "; 853 std::string full_source = "function f() { return ";
855 full_source += source; 854 full_source += source;
856 full_source += "; }"; 855 full_source += "; }";
857 856
858 i::Handle<i::String> source_code = 857 i::Handle<i::String> source_code =
859 factory->NewStringFromUtf8(i::CStrVector(full_source.c_str())) 858 factory->NewStringFromUtf8(i::CStrVector(full_source.c_str()))
860 .ToHandleChecked(); 859 .ToHandleChecked();
861 860
862 i::Handle<i::Script> script = factory->NewScript(source_code); 861 i::Handle<i::Script> script = factory->NewScript(source_code);
863 862
864 i::ParseInfo info(handles.main_zone(), script); 863 i::ParseInfo info(script);
865 i::Parser parser(&info); 864 i::Parser parser(&info);
866 info.set_allow_lazy_parsing(false); 865 info.set_allow_lazy_parsing(false);
867 info.set_toplevel(true); 866 info.set_toplevel(true);
868 867
869 CHECK(i::Compiler::ParseAndAnalyze(&info)); 868 CHECK(i::Compiler::ParseAndAnalyze(&info));
870 869
871 CHECK_EQ(1, info.scope()->declarations()->LengthForTest()); 870 CHECK_EQ(1, info.scope()->declarations()->LengthForTest());
872 i::Declaration* decl = info.scope()->declarations()->AtForTest(0); 871 i::Declaration* decl = info.scope()->declarations()->AtForTest(0);
873 i::FunctionLiteral* fun = decl->AsFunctionDeclaration()->fun(); 872 i::FunctionLiteral* fun = decl->AsFunctionDeclaration()->fun();
874 CHECK(fun->body()->length() == 1); 873 CHECK(fun->body()->length() == 1);
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
1152 i::SNPrintF(program, "%s%s%s", 1151 i::SNPrintF(program, "%s%s%s",
1153 source_data[i].outer_prefix, 1152 source_data[i].outer_prefix,
1154 source_data[i].inner_source, 1153 source_data[i].inner_source,
1155 source_data[i].outer_suffix); 1154 source_data[i].outer_suffix);
1156 1155
1157 // Parse program source. 1156 // Parse program source.
1158 i::Handle<i::String> source = factory->NewStringFromUtf8( 1157 i::Handle<i::String> source = factory->NewStringFromUtf8(
1159 i::CStrVector(program.start())).ToHandleChecked(); 1158 i::CStrVector(program.start())).ToHandleChecked();
1160 CHECK_EQ(source->length(), kProgramSize); 1159 CHECK_EQ(source->length(), kProgramSize);
1161 i::Handle<i::Script> script = factory->NewScript(source); 1160 i::Handle<i::Script> script = factory->NewScript(source);
1162 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 1161 i::ParseInfo info(script);
1163 i::ParseInfo info(&zone, script);
1164 info.set_language_mode(source_data[i].language_mode); 1162 info.set_language_mode(source_data[i].language_mode);
1165 i::parsing::ParseProgram(&info); 1163 i::parsing::ParseProgram(&info);
1166 CHECK_NOT_NULL(info.literal()); 1164 CHECK_NOT_NULL(info.literal());
1167 1165
1168 // Check scope types and positions. 1166 // Check scope types and positions.
1169 i::Scope* scope = info.literal()->scope(); 1167 i::Scope* scope = info.literal()->scope();
1170 CHECK(scope->is_script_scope()); 1168 CHECK(scope->is_script_scope());
1171 CHECK_EQ(scope->start_position(), 0); 1169 CHECK_EQ(scope->start_position(), 0);
1172 CHECK_EQ(scope->end_position(), kProgramSize); 1170 CHECK_EQ(scope->end_position(), kProgramSize);
1173 1171
(...skipping 25 matching lines...) Expand all
1199 i::Isolate* isolate = CcTest::i_isolate(); 1197 i::Isolate* isolate = CcTest::i_isolate();
1200 i::Factory* factory = isolate->factory(); 1198 i::Factory* factory = isolate->factory();
1201 v8::HandleScope handles(CcTest::isolate()); 1199 v8::HandleScope handles(CcTest::isolate());
1202 i::FunctionLiteral* function; 1200 i::FunctionLiteral* function;
1203 1201
1204 for (int i = 0; discard_sources[i]; i++) { 1202 for (int i = 0; discard_sources[i]; i++) {
1205 const char* source = discard_sources[i]; 1203 const char* source = discard_sources[i];
1206 i::Handle<i::String> source_code = 1204 i::Handle<i::String> source_code =
1207 factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked(); 1205 factory->NewStringFromUtf8(i::CStrVector(source)).ToHandleChecked();
1208 i::Handle<i::Script> script = factory->NewScript(source_code); 1206 i::Handle<i::Script> script = factory->NewScript(source_code);
1209 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 1207 i::ParseInfo info(script);
1210 i::ParseInfo info(&zone, script);
1211 i::parsing::ParseProgram(&info); 1208 i::parsing::ParseProgram(&info);
1212 function = info.literal(); 1209 function = info.literal();
1213 CHECK_NOT_NULL(function); 1210 CHECK_NOT_NULL(function);
1214 CHECK_NOT_NULL(function->body()); 1211 CHECK_NOT_NULL(function->body());
1215 CHECK_EQ(1, function->body()->length()); 1212 CHECK_EQ(1, function->body()->length());
1216 i::FunctionLiteral* inner = 1213 i::FunctionLiteral* inner =
1217 function->body()->first()->AsExpressionStatement()->expression()-> 1214 function->body()->first()->AsExpressionStatement()->expression()->
1218 AsCall()->expression()->AsFunctionLiteral(); 1215 AsCall()->expression()->AsFunctionLiteral();
1219 i::Scope* inner_scope = inner->scope(); 1216 i::Scope* inner_scope = inner->scope();
1220 i::FunctionLiteral* fun = nullptr; 1217 i::FunctionLiteral* fun = nullptr;
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 scanner.Initialize(stream.get()); 1327 scanner.Initialize(stream.get());
1331 i::PreParser::PreParseResult result = 1328 i::PreParser::PreParseResult result =
1332 preparser.PreParseProgram(&preparser_materialized_literals, is_module); 1329 preparser.PreParseProgram(&preparser_materialized_literals, is_module);
1333 CHECK_EQ(i::PreParser::kPreParseSuccess, result); 1330 CHECK_EQ(i::PreParser::kPreParseSuccess, result);
1334 } 1331 }
1335 1332
1336 // Parse the data 1333 // Parse the data
1337 i::FunctionLiteral* function; 1334 i::FunctionLiteral* function;
1338 { 1335 {
1339 i::Handle<i::Script> script = factory->NewScript(source); 1336 i::Handle<i::Script> script = factory->NewScript(source);
1340 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 1337 i::ParseInfo info(script);
1341 i::ParseInfo info(&zone, script);
1342 info.set_allow_lazy_parsing(flags.Contains(kAllowLazy)); 1338 info.set_allow_lazy_parsing(flags.Contains(kAllowLazy));
1343 SetGlobalFlags(flags); 1339 SetGlobalFlags(flags);
1344 if (is_module) info.set_module(); 1340 if (is_module) info.set_module();
1345 i::parsing::ParseProgram(&info); 1341 i::parsing::ParseProgram(&info);
1346 function = info.literal(); 1342 function = info.literal();
1347 if (function) { 1343 if (function) {
1348 parser_materialized_literals = function->materialized_literal_count(); 1344 parser_materialized_literals = function->materialized_literal_count();
1349 } 1345 }
1350 } 1346 }
1351 1347
(...skipping 1106 matching lines...) Expand 10 before | Expand all | Expand 10 after
2458 {"function lazy() { var x = {get foo(){} } }", 1}, 2454 {"function lazy() { var x = {get foo(){} } }", 1},
2459 {NULL, 0} 2455 {NULL, 0}
2460 }; 2456 };
2461 2457
2462 for (int i = 0; test_cases[i].program; i++) { 2458 for (int i = 0; test_cases[i].program; i++) {
2463 const char* program = test_cases[i].program; 2459 const char* program = test_cases[i].program;
2464 i::Factory* factory = CcTest::i_isolate()->factory(); 2460 i::Factory* factory = CcTest::i_isolate()->factory();
2465 i::Handle<i::String> source = 2461 i::Handle<i::String> source =
2466 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); 2462 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked();
2467 i::Handle<i::Script> script = factory->NewScript(source); 2463 i::Handle<i::Script> script = factory->NewScript(source);
2468 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 2464 i::ParseInfo info(script);
2469 i::ParseInfo info(&zone, script);
2470 i::ScriptData* sd = NULL; 2465 i::ScriptData* sd = NULL;
2471 info.set_cached_data(&sd); 2466 info.set_cached_data(&sd);
2472 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache); 2467 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache);
2473 i::parsing::ParseProgram(&info); 2468 i::parsing::ParseProgram(&info);
2474 i::ParseData* pd = i::ParseData::FromCachedData(sd); 2469 i::ParseData* pd = i::ParseData::FromCachedData(sd);
2475 2470
2476 if (pd->FunctionCount() != test_cases[i].functions) { 2471 if (pd->FunctionCount() != test_cases[i].functions) {
2477 v8::base::OS::Print( 2472 v8::base::OS::Print(
2478 "Expected preparse data for program:\n" 2473 "Expected preparse data for program:\n"
2479 "\t%s\n" 2474 "\t%s\n"
(...skipping 866 matching lines...) Expand 10 before | Expand all | Expand 10 after
3346 if (outers[i].strict && inners[j].with) continue; 3341 if (outers[i].strict && inners[j].with) continue;
3347 const char* inner = inners[j].source; 3342 const char* inner = inners[j].source;
3348 int inner_len = Utf8LengthHelper(inner); 3343 int inner_len = Utf8LengthHelper(inner);
3349 3344
3350 int len = prefix_len + outer_len + midfix_len + inner_len + suffix_len; 3345 int len = prefix_len + outer_len + midfix_len + inner_len + suffix_len;
3351 i::ScopedVector<char> program(len + 1); 3346 i::ScopedVector<char> program(len + 1);
3352 3347
3353 i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner, 3348 i::SNPrintF(program, "%s%s%s%s%s", prefix, outer, midfix, inner,
3354 suffix); 3349 suffix);
3355 3350
3356 i::Zone zone(isolate->allocator(), ZONE_NAME);
3357 std::unique_ptr<i::ParseInfo> info; 3351 std::unique_ptr<i::ParseInfo> info;
3358 if (lazy) { 3352 if (lazy) {
3359 printf("%s\n", program.start()); 3353 printf("%s\n", program.start());
3360 v8::Local<v8::Value> v = CompileRun(program.start()); 3354 v8::Local<v8::Value> v = CompileRun(program.start());
3361 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); 3355 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3362 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); 3356 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
3363 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared()); 3357 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared());
3364 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared)); 3358 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(shared));
3365 CHECK(i::parsing::ParseFunction(info.get())); 3359 CHECK(i::parsing::ParseFunction(info.get()));
3366 } else { 3360 } else {
3367 i::Handle<i::String> source = 3361 i::Handle<i::String> source =
3368 factory->InternalizeUtf8String(program.start()); 3362 factory->InternalizeUtf8String(program.start());
3369 source->PrintOn(stdout); 3363 source->PrintOn(stdout);
3370 printf("\n"); 3364 printf("\n");
3371 i::Handle<i::Script> script = factory->NewScript(source); 3365 i::Handle<i::Script> script = factory->NewScript(source);
3372 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, script)); 3366 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(script));
3373 info->set_allow_lazy_parsing(false); 3367 info->set_allow_lazy_parsing(false);
3374 CHECK(i::parsing::ParseProgram(info.get())); 3368 CHECK(i::parsing::ParseProgram(info.get()));
3375 } 3369 }
3376 CHECK(i::Compiler::Analyze(info.get())); 3370 CHECK(i::Compiler::Analyze(info.get()));
3377 CHECK(info->literal() != NULL); 3371 CHECK(info->literal() != NULL);
3378 3372
3379 i::Scope* scope = info->literal()->scope(); 3373 i::Scope* scope = info->literal()->scope();
3380 if (!lazy) { 3374 if (!lazy) {
3381 scope = scope->inner_scope(); 3375 scope = scope->inner_scope();
3382 } 3376 }
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
3461 3455
3462 const char* suffix = "; f"; 3456 const char* suffix = "; f";
3463 3457
3464 for (unsigned i = 0; i < arraysize(tests); ++i) { 3458 for (unsigned i = 0; i < arraysize(tests); ++i) {
3465 bool assigned = tests[i].arg_assigned; 3459 bool assigned = tests[i].arg_assigned;
3466 const char* source = tests[i].source; 3460 const char* source = tests[i].source;
3467 for (unsigned allow_lazy = 0; allow_lazy < 2; ++allow_lazy) { 3461 for (unsigned allow_lazy = 0; allow_lazy < 2; ++allow_lazy) {
3468 i::ScopedVector<char> program(Utf8LengthHelper(source) + 3462 i::ScopedVector<char> program(Utf8LengthHelper(source) +
3469 Utf8LengthHelper(suffix) + 1); 3463 Utf8LengthHelper(suffix) + 1);
3470 i::SNPrintF(program, "%s%s", source, suffix); 3464 i::SNPrintF(program, "%s%s", source, suffix);
3471 i::Zone zone(isolate->allocator(), ZONE_NAME);
3472 std::unique_ptr<i::ParseInfo> info; 3465 std::unique_ptr<i::ParseInfo> info;
3473 printf("%s\n", program.start()); 3466 printf("%s\n", program.start());
3474 v8::Local<v8::Value> v = CompileRun(program.start()); 3467 v8::Local<v8::Value> v = CompileRun(program.start());
3475 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v); 3468 i::Handle<i::Object> o = v8::Utils::OpenHandle(*v);
3476 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o); 3469 i::Handle<i::JSFunction> f = i::Handle<i::JSFunction>::cast(o);
3477 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared()); 3470 i::Handle<i::SharedFunctionInfo> shared = i::handle(f->shared());
3478 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, shared)); 3471 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(shared));
3479 info->set_allow_lazy_parsing(allow_lazy); 3472 info->set_allow_lazy_parsing(allow_lazy);
3480 CHECK(i::parsing::ParseFunction(info.get())); 3473 CHECK(i::parsing::ParseFunction(info.get()));
3481 CHECK(i::Compiler::Analyze(info.get())); 3474 CHECK(i::Compiler::Analyze(info.get()));
3482 CHECK_NOT_NULL(info->literal()); 3475 CHECK_NOT_NULL(info->literal());
3483 3476
3484 i::Scope* scope = info->literal()->scope(); 3477 i::Scope* scope = info->literal()->scope();
3485 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed()); 3478 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed());
3486 CHECK_NULL(scope->sibling()); 3479 CHECK_NULL(scope->sibling());
3487 CHECK(scope->is_function_scope()); 3480 CHECK(scope->is_function_scope());
3488 const i::AstRawString* var_name = 3481 const i::AstRawString* var_name =
3489 info->ast_value_factory()->GetOneByteString("arg"); 3482 info->ast_value_factory()->GetOneByteString("arg");
3490 i::Variable* var = scope->Lookup(var_name); 3483 i::Variable* var = scope->Lookup(var_name);
3491 CHECK(var->is_used() || !assigned); 3484 CHECK(var->is_used() || !assigned);
3492 bool is_maybe_assigned = var->maybe_assigned() == i::kMaybeAssigned; 3485 bool is_maybe_assigned = var->maybe_assigned() == i::kMaybeAssigned;
3493 CHECK_EQ(is_maybe_assigned, assigned); 3486 CHECK_EQ(is_maybe_assigned, assigned);
3494 } 3487 }
3495 } 3488 }
3496 } 3489 }
3497 3490
3498 struct Input { 3491 struct Input {
3499 bool assigned; 3492 bool assigned;
3500 std::string source; 3493 std::string source;
3501 std::vector<unsigned> location; // "Directions" to the relevant scope. 3494 std::vector<unsigned> location; // "Directions" to the relevant scope.
3502 }; 3495 };
3503 3496
3504 static void TestMaybeAssigned(i::Zone* zone, Input input, const char* variable, 3497 static void TestMaybeAssigned(Input input, const char* variable, bool module,
3505 bool module, bool allow_lazy_parsing) { 3498 bool allow_lazy_parsing) {
3506 i::Factory* factory = CcTest::i_isolate()->factory(); 3499 i::Factory* factory = CcTest::i_isolate()->factory();
3507 i::Handle<i::String> string = 3500 i::Handle<i::String> string =
3508 factory->InternalizeUtf8String(input.source.c_str()); 3501 factory->InternalizeUtf8String(input.source.c_str());
3509 string->PrintOn(stdout); 3502 string->PrintOn(stdout);
3510 printf("\n"); 3503 printf("\n");
3511 i::Handle<i::Script> script = factory->NewScript(string); 3504 i::Handle<i::Script> script = factory->NewScript(string);
3512 3505
3513 std::unique_ptr<i::ParseInfo> info; 3506 std::unique_ptr<i::ParseInfo> info;
3514 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(zone, script)); 3507 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(script));
3515 info->set_module(module); 3508 info->set_module(module);
3516 info->set_allow_lazy_parsing(allow_lazy_parsing); 3509 info->set_allow_lazy_parsing(allow_lazy_parsing);
3517 3510
3518 CHECK(i::parsing::ParseProgram(info.get())); 3511 CHECK(i::parsing::ParseProgram(info.get()));
3519 CHECK(i::Compiler::Analyze(info.get())); 3512 CHECK(i::Compiler::Analyze(info.get()));
3520 3513
3521 CHECK_NOT_NULL(info->literal()); 3514 CHECK_NOT_NULL(info->literal());
3522 i::Scope* scope = info->literal()->scope(); 3515 i::Scope* scope = info->literal()->scope();
3523 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed()); 3516 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed());
3524 CHECK_NULL(scope->sibling()); 3517 CHECK_NULL(scope->sibling());
(...skipping 28 matching lines...) Expand all
3553 for (auto n : input.location) { 3546 for (auto n : input.location) {
3554 result.location.push_back(n); 3547 result.location.push_back(n);
3555 } 3548 }
3556 return result; 3549 return result;
3557 } 3550 }
3558 3551
3559 TEST(MaybeAssignedInsideLoop) { 3552 TEST(MaybeAssignedInsideLoop) {
3560 i::Isolate* isolate = CcTest::i_isolate(); 3553 i::Isolate* isolate = CcTest::i_isolate();
3561 i::HandleScope scope(isolate); 3554 i::HandleScope scope(isolate);
3562 LocalContext env; 3555 LocalContext env;
3563 i::Zone zone(isolate->allocator(), ZONE_NAME);
3564 3556
3565 std::vector<unsigned> top; // Can't use {} in initializers below. 3557 std::vector<unsigned> top; // Can't use {} in initializers below.
3566 3558
3567 Input module_and_script_tests[] = { 3559 Input module_and_script_tests[] = {
3568 {1, "for (j=x; j<10; ++j) { foo = j }", top}, 3560 {1, "for (j=x; j<10; ++j) { foo = j }", top},
3569 {1, "for (j=x; j<10; ++j) { [foo] = [j] }", top}, 3561 {1, "for (j=x; j<10; ++j) { [foo] = [j] }", top},
3570 {1, "for (j=x; j<10; ++j) { var foo = j }", top}, 3562 {1, "for (j=x; j<10; ++j) { var foo = j }", top},
3571 {1, "for (j=x; j<10; ++j) { var [foo] = [j] }", top}, 3563 {1, "for (j=x; j<10; ++j) { var [foo] = [j] }", top},
3572 {0, "for (j=x; j<10; ++j) { let foo = j }", {0}}, 3564 {0, "for (j=x; j<10; ++j) { let foo = j }", {0}},
3573 {0, "for (j=x; j<10; ++j) { let [foo] = [j] }", {0}}, 3565 {0, "for (j=x; j<10; ++j) { let [foo] = [j] }", {0}},
(...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after
3831 {1, "for (const {j} in x) { function foo() {return j} }", top}, 3823 {1, "for (const {j} in x) { function foo() {return j} }", top},
3832 {1, "while (j) { function foo() {return j} }", top}, 3824 {1, "while (j) { function foo() {return j} }", top},
3833 {1, "do { function foo() {return j} } while (j)", top}, 3825 {1, "do { function foo() {return j} } while (j)", top},
3834 }; 3826 };
3835 3827
3836 for (unsigned i = 0; i < arraysize(module_and_script_tests); ++i) { 3828 for (unsigned i = 0; i < arraysize(module_and_script_tests); ++i) {
3837 Input input = module_and_script_tests[i]; 3829 Input input = module_and_script_tests[i];
3838 for (unsigned module = 0; module <= 1; ++module) { 3830 for (unsigned module = 0; module <= 1; ++module) {
3839 for (unsigned allow_lazy_parsing = 0; allow_lazy_parsing <= 1; 3831 for (unsigned allow_lazy_parsing = 0; allow_lazy_parsing <= 1;
3840 ++allow_lazy_parsing) { 3832 ++allow_lazy_parsing) {
3841 TestMaybeAssigned(&zone, input, "foo", module, allow_lazy_parsing); 3833 TestMaybeAssigned(input, "foo", module, allow_lazy_parsing);
3842 } 3834 }
3843 TestMaybeAssigned(&zone, wrap(input), "foo", module, false); 3835 TestMaybeAssigned(wrap(input), "foo", module, false);
3844 } 3836 }
3845 } 3837 }
3846 3838
3847 for (unsigned i = 0; i < arraysize(script_only_tests); ++i) { 3839 for (unsigned i = 0; i < arraysize(script_only_tests); ++i) {
3848 Input input = script_only_tests[i]; 3840 Input input = script_only_tests[i];
3849 for (unsigned allow_lazy_parsing = 0; allow_lazy_parsing <= 1; 3841 for (unsigned allow_lazy_parsing = 0; allow_lazy_parsing <= 1;
3850 ++allow_lazy_parsing) { 3842 ++allow_lazy_parsing) {
3851 TestMaybeAssigned(&zone, input, "foo", false, allow_lazy_parsing); 3843 TestMaybeAssigned(input, "foo", false, allow_lazy_parsing);
3852 } 3844 }
3853 TestMaybeAssigned(&zone, wrap(input), "foo", false, false); 3845 TestMaybeAssigned(wrap(input), "foo", false, false);
3854 } 3846 }
3855 } 3847 }
3856 3848
3857 TEST(MaybeAssignedTopLevel) { 3849 TEST(MaybeAssignedTopLevel) {
3858 i::Isolate* isolate = CcTest::i_isolate(); 3850 i::Isolate* isolate = CcTest::i_isolate();
3859 i::HandleScope scope(isolate); 3851 i::HandleScope scope(isolate);
3860 LocalContext env; 3852 LocalContext env;
3861 i::Factory* factory = isolate->factory(); 3853 i::Factory* factory = isolate->factory();
3862 3854
3863 const char* prefixes[] = { 3855 const char* prefixes[] = {
(...skipping 11 matching lines...) Expand all
3875 "function* bar() {eval(ext)}; ext(bar); ext(foo)", 3867 "function* bar() {eval(ext)}; ext(bar); ext(foo)",
3876 }; 3868 };
3877 3869
3878 for (unsigned i = 0; i < arraysize(prefixes); ++i) { 3870 for (unsigned i = 0; i < arraysize(prefixes); ++i) {
3879 const char* prefix = prefixes[i]; 3871 const char* prefix = prefixes[i];
3880 for (unsigned j = 0; j < arraysize(sources); ++j) { 3872 for (unsigned j = 0; j < arraysize(sources); ++j) {
3881 const char* source = sources[j]; 3873 const char* source = sources[j];
3882 i::ScopedVector<char> program(Utf8LengthHelper(prefix) + 3874 i::ScopedVector<char> program(Utf8LengthHelper(prefix) +
3883 Utf8LengthHelper(source) + 1); 3875 Utf8LengthHelper(source) + 1);
3884 i::SNPrintF(program, "%s%s", prefix, source); 3876 i::SNPrintF(program, "%s%s", prefix, source);
3885 i::Zone zone(isolate->allocator(), ZONE_NAME);
3886 3877
3887 i::Handle<i::String> string = 3878 i::Handle<i::String> string =
3888 factory->InternalizeUtf8String(program.start()); 3879 factory->InternalizeUtf8String(program.start());
3889 string->PrintOn(stdout); 3880 string->PrintOn(stdout);
3890 printf("\n"); 3881 printf("\n");
3891 i::Handle<i::Script> script = factory->NewScript(string); 3882 i::Handle<i::Script> script = factory->NewScript(string);
3892 3883
3893 for (unsigned allow_lazy = 0; allow_lazy < 2; ++allow_lazy) { 3884 for (unsigned allow_lazy = 0; allow_lazy < 2; ++allow_lazy) {
3894 for (unsigned module = 0; module < 2; ++module) { 3885 for (unsigned module = 0; module < 2; ++module) {
3895 std::unique_ptr<i::ParseInfo> info; 3886 std::unique_ptr<i::ParseInfo> info;
3896 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(&zone, script)); 3887 info = std::unique_ptr<i::ParseInfo>(new i::ParseInfo(script));
3897 info->set_module(module); 3888 info->set_module(module);
3898 info->set_allow_lazy_parsing(allow_lazy); 3889 info->set_allow_lazy_parsing(allow_lazy);
3899 3890
3900 CHECK(i::parsing::ParseProgram(info.get())); 3891 CHECK(i::parsing::ParseProgram(info.get()));
3901 CHECK(i::Compiler::Analyze(info.get())); 3892 CHECK(i::Compiler::Analyze(info.get()));
3902 3893
3903 CHECK_NOT_NULL(info->literal()); 3894 CHECK_NOT_NULL(info->literal());
3904 i::Scope* scope = info->literal()->scope(); 3895 i::Scope* scope = info->literal()->scope();
3905 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed()); 3896 CHECK(!scope->AsDeclarationScope()->was_lazily_parsed());
3906 CHECK_NULL(scope->sibling()); 3897 CHECK_NULL(scope->sibling());
(...skipping 2432 matching lines...) Expand 10 before | Expand all | Expand 10 after
6339 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 6330 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
6340 128 * 1024); 6331 128 * 1024);
6341 6332
6342 for (unsigned i = 0; i < arraysize(kSources); ++i) { 6333 for (unsigned i = 0; i < arraysize(kSources); ++i) {
6343 i::Handle<i::String> source = 6334 i::Handle<i::String> source =
6344 factory->NewStringFromAsciiChecked(kSources[i]); 6335 factory->NewStringFromAsciiChecked(kSources[i]);
6345 6336
6346 // Show that parsing as a module works 6337 // Show that parsing as a module works
6347 { 6338 {
6348 i::Handle<i::Script> script = factory->NewScript(source); 6339 i::Handle<i::Script> script = factory->NewScript(source);
6349 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6340 i::ParseInfo info(script);
6350 i::ParseInfo info(&zone, script);
6351 info.set_module(); 6341 info.set_module();
6352 if (!i::parsing::ParseProgram(&info)) { 6342 if (!i::parsing::ParseProgram(&info)) {
6353 i::Handle<i::JSObject> exception_handle( 6343 i::Handle<i::JSObject> exception_handle(
6354 i::JSObject::cast(isolate->pending_exception())); 6344 i::JSObject::cast(isolate->pending_exception()));
6355 i::Handle<i::String> message_string = i::Handle<i::String>::cast( 6345 i::Handle<i::String> message_string = i::Handle<i::String>::cast(
6356 i::JSReceiver::GetProperty(isolate, exception_handle, "message") 6346 i::JSReceiver::GetProperty(isolate, exception_handle, "message")
6357 .ToHandleChecked()); 6347 .ToHandleChecked());
6358 isolate->clear_pending_exception(); 6348 isolate->clear_pending_exception();
6359 6349
6360 v8::base::OS::Print( 6350 v8::base::OS::Print(
6361 "Parser failed on:\n" 6351 "Parser failed on:\n"
6362 "\t%s\n" 6352 "\t%s\n"
6363 "with error:\n" 6353 "with error:\n"
6364 "\t%s\n" 6354 "\t%s\n"
6365 "However, we expected no error.", 6355 "However, we expected no error.",
6366 source->ToCString().get(), message_string->ToCString().get()); 6356 source->ToCString().get(), message_string->ToCString().get());
6367 CHECK(false); 6357 CHECK(false);
6368 } 6358 }
6369 } 6359 }
6370 6360
6371 // And that parsing a script does not. 6361 // And that parsing a script does not.
6372 { 6362 {
6373 i::Handle<i::Script> script = factory->NewScript(source); 6363 i::Handle<i::Script> script = factory->NewScript(source);
6374 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6364 i::ParseInfo info(script);
6375 i::ParseInfo info(&zone, script);
6376 CHECK(!i::parsing::ParseProgram(&info)); 6365 CHECK(!i::parsing::ParseProgram(&info));
6377 isolate->clear_pending_exception(); 6366 isolate->clear_pending_exception();
6378 } 6367 }
6379 } 6368 }
6380 } 6369 }
6381 6370
6382 6371
6383 TEST(ImportExportParsingErrors) { 6372 TEST(ImportExportParsingErrors) {
6384 // clang-format off 6373 // clang-format off
6385 const char* kErrorSources[] = { 6374 const char* kErrorSources[] = {
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
6455 v8::Context::Scope context_scope(context); 6444 v8::Context::Scope context_scope(context);
6456 6445
6457 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 6446 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
6458 128 * 1024); 6447 128 * 1024);
6459 6448
6460 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { 6449 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) {
6461 i::Handle<i::String> source = 6450 i::Handle<i::String> source =
6462 factory->NewStringFromAsciiChecked(kErrorSources[i]); 6451 factory->NewStringFromAsciiChecked(kErrorSources[i]);
6463 6452
6464 i::Handle<i::Script> script = factory->NewScript(source); 6453 i::Handle<i::Script> script = factory->NewScript(source);
6465 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6454 i::ParseInfo info(script);
6466 i::ParseInfo info(&zone, script);
6467 info.set_module(); 6455 info.set_module();
6468 CHECK(!i::parsing::ParseProgram(&info)); 6456 CHECK(!i::parsing::ParseProgram(&info));
6469 isolate->clear_pending_exception(); 6457 isolate->clear_pending_exception();
6470 } 6458 }
6471 } 6459 }
6472 6460
6473 TEST(ModuleTopLevelFunctionDecl) { 6461 TEST(ModuleTopLevelFunctionDecl) {
6474 // clang-format off 6462 // clang-format off
6475 const char* kErrorSources[] = { 6463 const char* kErrorSources[] = {
6476 "function f() {} function f() {}", 6464 "function f() {} function f() {}",
(...skipping 15 matching lines...) Expand all
6492 v8::Context::Scope context_scope(context); 6480 v8::Context::Scope context_scope(context);
6493 6481
6494 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 6482 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
6495 128 * 1024); 6483 128 * 1024);
6496 6484
6497 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { 6485 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) {
6498 i::Handle<i::String> source = 6486 i::Handle<i::String> source =
6499 factory->NewStringFromAsciiChecked(kErrorSources[i]); 6487 factory->NewStringFromAsciiChecked(kErrorSources[i]);
6500 6488
6501 i::Handle<i::Script> script = factory->NewScript(source); 6489 i::Handle<i::Script> script = factory->NewScript(source);
6502 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6490 i::ParseInfo info(script);
6503 i::ParseInfo info(&zone, script);
6504 info.set_module(); 6491 info.set_module();
6505 CHECK(!i::parsing::ParseProgram(&info)); 6492 CHECK(!i::parsing::ParseProgram(&info));
6506 isolate->clear_pending_exception(); 6493 isolate->clear_pending_exception();
6507 } 6494 }
6508 } 6495 }
6509 6496
6510 TEST(ModuleAwaitReserved) { 6497 TEST(ModuleAwaitReserved) {
6511 // clang-format off 6498 // clang-format off
6512 const char* kErrorSources[] = { 6499 const char* kErrorSources[] = {
6513 "await;", 6500 "await;",
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
6690 "import 'q.js';" 6677 "import 'q.js';"
6691 "let nonexport = 42;" 6678 "let nonexport = 42;"
6692 "import {m as mm} from 'm.js';" 6679 "import {m as mm} from 'm.js';"
6693 "import {aa} from 'm.js';" 6680 "import {aa} from 'm.js';"
6694 "export {aa as bb, x};" 6681 "export {aa as bb, x};"
6695 "import * as loo from 'bar.js';" 6682 "import * as loo from 'bar.js';"
6696 "import * as foob from 'bar.js';" 6683 "import * as foob from 'bar.js';"
6697 "export {foob};"; 6684 "export {foob};";
6698 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); 6685 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource);
6699 i::Handle<i::Script> script = factory->NewScript(source); 6686 i::Handle<i::Script> script = factory->NewScript(source);
6700 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6687 i::ParseInfo info(script);
6701 i::ParseInfo info(&zone, script);
6702 info.set_module(); 6688 info.set_module();
6703 CHECK(i::parsing::ParseProgram(&info)); 6689 CHECK(i::parsing::ParseProgram(&info));
6704 CHECK(i::Compiler::Analyze(&info)); 6690 CHECK(i::Compiler::Analyze(&info));
6705 i::FunctionLiteral* func = info.literal(); 6691 i::FunctionLiteral* func = info.literal();
6706 i::ModuleScope* module_scope = func->scope()->AsModuleScope(); 6692 i::ModuleScope* module_scope = func->scope()->AsModuleScope();
6707 i::Scope* outer_scope = module_scope->outer_scope(); 6693 i::Scope* outer_scope = module_scope->outer_scope();
6708 CHECK(outer_scope->is_script_scope()); 6694 CHECK(outer_scope->is_script_scope());
6709 CHECK_NULL(outer_scope->outer_scope()); 6695 CHECK_NULL(outer_scope->outer_scope());
6710 CHECK(module_scope->is_module_scope()); 6696 CHECK(module_scope->is_module_scope());
6711 const i::ModuleDescriptor::Entry* entry; 6697 const i::ModuleDescriptor::Entry* entry;
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
6950 i::Isolate* isolate = CcTest::i_isolate(); 6936 i::Isolate* isolate = CcTest::i_isolate();
6951 i::Factory* factory = isolate->factory(); 6937 i::Factory* factory = isolate->factory();
6952 v8::HandleScope handles(CcTest::isolate()); 6938 v8::HandleScope handles(CcTest::isolate());
6953 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate()); 6939 v8::Local<v8::Context> context = v8::Context::New(CcTest::isolate());
6954 v8::Context::Scope context_scope(context); 6940 v8::Context::Scope context_scope(context);
6955 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - 6941 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() -
6956 128 * 1024); 6942 128 * 1024);
6957 6943
6958 i::Handle<i::Script> script = 6944 i::Handle<i::Script> script =
6959 factory->NewScript(factory->NewStringFromAsciiChecked(source)); 6945 factory->NewScript(factory->NewStringFromAsciiChecked(source));
6960 i::Zone zone(CcTest::i_isolate()->allocator(), ZONE_NAME); 6946 i::ParseInfo info(script);
6961 i::ParseInfo info(&zone, script);
6962 i::parsing::ParseProgram(&info); 6947 i::parsing::ParseProgram(&info);
6963 CHECK(info.literal() != NULL); 6948 CHECK(info.literal() != NULL);
6964 CHECK_EQ(expected_language_mode, info.literal()->language_mode()); 6949 CHECK_EQ(expected_language_mode, info.literal()->language_mode());
6965 } 6950 }
6966 6951
6967 6952
6968 TEST(LanguageModeDirectives) { 6953 TEST(LanguageModeDirectives) {
6969 TestLanguageMode("\"use nothing\"", i::SLOPPY); 6954 TestLanguageMode("\"use nothing\"", i::SLOPPY);
6970 TestLanguageMode("\"use strict\"", i::STRICT); 6955 TestLanguageMode("\"use strict\"", i::STRICT);
6971 6956
(...skipping 2453 matching lines...) Expand 10 before | Expand all | Expand 10 after
9425 i::SNPrintF( 9410 i::SNPrintF(
9426 program + prefix_len + inner_function_len + params_len + source_len, 9411 program + prefix_len + inner_function_len + params_len + source_len,
9427 "%s", suffix); 9412 "%s", suffix);
9428 9413
9429 i::Handle<i::String> source = 9414 i::Handle<i::String> source =
9430 factory->InternalizeUtf8String(program.start()); 9415 factory->InternalizeUtf8String(program.start());
9431 source->PrintOn(stdout); 9416 source->PrintOn(stdout);
9432 printf("\n"); 9417 printf("\n");
9433 9418
9434 i::Handle<i::Script> script = factory->NewScript(source); 9419 i::Handle<i::Script> script = factory->NewScript(source);
9435 i::Zone zone(isolate->allocator(), ZONE_NAME); 9420 i::ParseInfo info(script);
9436 i::ParseInfo info(&zone, script);
9437 9421
9438 CHECK(i::parsing::ParseProgram(&info)); 9422 CHECK(i::parsing::ParseProgram(&info));
9439 CHECK(i::Compiler::Analyze(&info)); 9423 CHECK(i::Compiler::Analyze(&info));
9440 CHECK(info.literal() != NULL); 9424 CHECK(info.literal() != NULL);
9441 9425
9442 i::Scope* scope = info.literal()->scope()->inner_scope(); 9426 i::Scope* scope = info.literal()->scope()->inner_scope();
9443 DCHECK_NOT_NULL(scope); 9427 DCHECK_NOT_NULL(scope);
9444 DCHECK_NULL(scope->sibling()); 9428 DCHECK_NULL(scope->sibling());
9445 DCHECK(scope->is_function_scope()); 9429 DCHECK(scope->is_function_scope());
9446 const i::AstRawString* var_name = 9430 const i::AstRawString* var_name =
9447 info.ast_value_factory()->GetOneByteString("my_var"); 9431 info.ast_value_factory()->GetOneByteString("my_var");
9448 i::Variable* var = scope->Lookup(var_name); 9432 i::Variable* var = scope->Lookup(var_name);
9449 CHECK_EQ(inners[i].ctxt_allocate, 9433 CHECK_EQ(inners[i].ctxt_allocate,
9450 i::ScopeTestHelper::MustAllocateInContext(var)); 9434 i::ScopeTestHelper::MustAllocateInContext(var));
9451 } 9435 }
9452 } 9436 }
9453 } 9437 }
OLDNEW
« no previous file with comments | « test/cctest/parsing/test-preparser.cc ('k') | test/fuzzer/parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698