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 1028 matching lines...) Loading... |
1039 i::StrLength(surroundings[j].suffix) + | 1039 i::StrLength(surroundings[j].suffix) + |
1040 i::StrLength(source_data[i].body); | 1040 i::StrLength(source_data[i].body); |
1041 i::ScopedVector<char> program(kProgramByteSize + 1); | 1041 i::ScopedVector<char> program(kProgramByteSize + 1); |
1042 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, | 1042 i::SNPrintF(program, "%s%s%s", surroundings[j].prefix, |
1043 source_data[i].body, surroundings[j].suffix); | 1043 source_data[i].body, surroundings[j].suffix); |
1044 i::Handle<i::String> source = | 1044 i::Handle<i::String> source = |
1045 factory->NewStringFromUtf8(i::CStrVector(program.start())) | 1045 factory->NewStringFromUtf8(i::CStrVector(program.start())) |
1046 .ToHandleChecked(); | 1046 .ToHandleChecked(); |
1047 i::Handle<i::Script> script = factory->NewScript(source); | 1047 i::Handle<i::Script> script = factory->NewScript(source); |
1048 i::Zone zone; | 1048 i::Zone zone; |
1049 i::ParseInfo info(&zone); | 1049 i::ParseInfo info(&zone, script); |
1050 info.InitializeFromScript(script); | |
1051 i::Parser parser(&info); | 1050 i::Parser parser(&info); |
1052 parser.set_allow_harmony_arrow_functions(true); | 1051 parser.set_allow_harmony_arrow_functions(true); |
1053 parser.set_allow_harmony_classes(true); | 1052 parser.set_allow_harmony_classes(true); |
1054 parser.set_allow_harmony_object_literals(true); | 1053 parser.set_allow_harmony_object_literals(true); |
1055 parser.set_allow_harmony_scoping(true); | 1054 parser.set_allow_harmony_scoping(true); |
1056 parser.set_allow_harmony_sloppy(true); | 1055 parser.set_allow_harmony_sloppy(true); |
1057 info.set_global(); | 1056 info.set_global(); |
1058 CHECK(parser.Parse(&info)); | 1057 CHECK(parser.Parse(&info)); |
1059 CHECK(i::Rewriter::Rewrite(&info)); | 1058 CHECK(i::Rewriter::Rewrite(&info)); |
1060 CHECK(i::Scope::Analyze(&info)); | 1059 CHECK(i::Scope::Analyze(&info)); |
(...skipping 231 matching lines...) Loading... |
1292 source_data[i].outer_prefix, | 1291 source_data[i].outer_prefix, |
1293 source_data[i].inner_source, | 1292 source_data[i].inner_source, |
1294 source_data[i].outer_suffix); | 1293 source_data[i].outer_suffix); |
1295 | 1294 |
1296 // Parse program source. | 1295 // Parse program source. |
1297 i::Handle<i::String> source = factory->NewStringFromUtf8( | 1296 i::Handle<i::String> source = factory->NewStringFromUtf8( |
1298 i::CStrVector(program.start())).ToHandleChecked(); | 1297 i::CStrVector(program.start())).ToHandleChecked(); |
1299 CHECK_EQ(source->length(), kProgramSize); | 1298 CHECK_EQ(source->length(), kProgramSize); |
1300 i::Handle<i::Script> script = factory->NewScript(source); | 1299 i::Handle<i::Script> script = factory->NewScript(source); |
1301 i::Zone zone; | 1300 i::Zone zone; |
1302 i::ParseInfo info(&zone); | 1301 i::ParseInfo info(&zone, script); |
1303 info.InitializeFromScript(script); | |
1304 i::Parser parser(&info); | 1302 i::Parser parser(&info); |
1305 parser.set_allow_lazy(true); | 1303 parser.set_allow_lazy(true); |
1306 parser.set_allow_harmony_scoping(true); | 1304 parser.set_allow_harmony_scoping(true); |
1307 parser.set_allow_harmony_arrow_functions(true); | 1305 parser.set_allow_harmony_arrow_functions(true); |
1308 info.set_global(); | 1306 info.set_global(); |
1309 info.set_language_mode(source_data[i].language_mode); | 1307 info.set_language_mode(source_data[i].language_mode); |
1310 parser.Parse(&info); | 1308 parser.Parse(&info); |
1311 CHECK(info.function() != NULL); | 1309 CHECK(info.function() != NULL); |
1312 | 1310 |
1313 // Check scope types and positions. | 1311 // Check scope types and positions. |
(...skipping 138 matching lines...) Loading... |
1452 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 1450 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
1453 } | 1451 } |
1454 | 1452 |
1455 bool preparse_error = log.HasError(); | 1453 bool preparse_error = log.HasError(); |
1456 | 1454 |
1457 // Parse the data | 1455 // Parse the data |
1458 i::FunctionLiteral* function; | 1456 i::FunctionLiteral* function; |
1459 { | 1457 { |
1460 i::Handle<i::Script> script = factory->NewScript(source); | 1458 i::Handle<i::Script> script = factory->NewScript(source); |
1461 i::Zone zone; | 1459 i::Zone zone; |
1462 i::ParseInfo info(&zone); | 1460 i::ParseInfo info(&zone, script); |
1463 info.InitializeFromScript(script); | |
1464 i::Parser parser(&info); | 1461 i::Parser parser(&info); |
1465 SetParserFlags(&parser, flags); | 1462 SetParserFlags(&parser, flags); |
1466 info.set_global(); | 1463 info.set_global(); |
1467 parser.Parse(&info); | 1464 parser.Parse(&info); |
1468 function = info.function(); | 1465 function = info.function(); |
1469 if (function) { | 1466 if (function) { |
1470 parser_materialized_literals = function->materialized_literal_count(); | 1467 parser_materialized_literals = function->materialized_literal_count(); |
1471 } | 1468 } |
1472 } | 1469 } |
1473 | 1470 |
(...skipping 1067 matching lines...) Loading... |
2541 {NULL, 0} | 2538 {NULL, 0} |
2542 }; | 2539 }; |
2543 | 2540 |
2544 for (int i = 0; test_cases[i].program; i++) { | 2541 for (int i = 0; test_cases[i].program; i++) { |
2545 const char* program = test_cases[i].program; | 2542 const char* program = test_cases[i].program; |
2546 i::Factory* factory = CcTest::i_isolate()->factory(); | 2543 i::Factory* factory = CcTest::i_isolate()->factory(); |
2547 i::Handle<i::String> source = | 2544 i::Handle<i::String> source = |
2548 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); | 2545 factory->NewStringFromUtf8(i::CStrVector(program)).ToHandleChecked(); |
2549 i::Handle<i::Script> script = factory->NewScript(source); | 2546 i::Handle<i::Script> script = factory->NewScript(source); |
2550 i::Zone zone; | 2547 i::Zone zone; |
2551 i::ParseInfo info(&zone); | 2548 i::ParseInfo info(&zone, script); |
2552 info.InitializeFromScript(script); | |
2553 i::ScriptData* sd = NULL; | 2549 i::ScriptData* sd = NULL; |
2554 info.set_cached_data(&sd); | 2550 info.set_cached_data(&sd); |
2555 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache); | 2551 info.set_compile_options(v8::ScriptCompiler::kProduceParserCache); |
2556 info.set_allow_lazy_parsing(); | 2552 info.set_allow_lazy_parsing(); |
2557 i::Parser::ParseStatic(&info); | 2553 i::Parser::ParseStatic(&info); |
2558 i::ParseData* pd = i::ParseData::FromCachedData(sd); | 2554 i::ParseData* pd = i::ParseData::FromCachedData(sd); |
2559 | 2555 |
2560 if (pd->FunctionCount() != test_cases[i].functions) { | 2556 if (pd->FunctionCount() != test_cases[i].functions) { |
2561 v8::base::OS::Print( | 2557 v8::base::OS::Print( |
2562 "Expected preparse data for program:\n" | 2558 "Expected preparse data for program:\n" |
(...skipping 805 matching lines...) Loading... |
3368 | 3364 |
3369 i::SNPrintF(program, "%s%s%s%s%s%s%s", prefix, outer_comment, outer, | 3365 i::SNPrintF(program, "%s%s%s%s%s%s%s", prefix, outer_comment, outer, |
3370 midfix, inner_comment, inner, suffix); | 3366 midfix, inner_comment, inner, suffix); |
3371 i::Handle<i::String> source = | 3367 i::Handle<i::String> source = |
3372 factory->InternalizeUtf8String(program.start()); | 3368 factory->InternalizeUtf8String(program.start()); |
3373 source->PrintOn(stdout); | 3369 source->PrintOn(stdout); |
3374 printf("\n"); | 3370 printf("\n"); |
3375 | 3371 |
3376 i::Handle<i::Script> script = factory->NewScript(source); | 3372 i::Handle<i::Script> script = factory->NewScript(source); |
3377 i::Zone zone; | 3373 i::Zone zone; |
3378 i::ParseInfo info(&zone); | 3374 i::ParseInfo info(&zone, script); |
3379 info.InitializeFromScript(script); | |
3380 i::Parser parser(&info); | 3375 i::Parser parser(&info); |
3381 parser.set_allow_harmony_scoping(true); | 3376 parser.set_allow_harmony_scoping(true); |
3382 CHECK(parser.Parse(&info)); | 3377 CHECK(parser.Parse(&info)); |
3383 CHECK(i::Compiler::Analyze(&info)); | 3378 CHECK(i::Compiler::Analyze(&info)); |
3384 CHECK(info.function() != NULL); | 3379 CHECK(info.function() != NULL); |
3385 | 3380 |
3386 i::Scope* scope = info.function()->scope(); | 3381 i::Scope* scope = info.function()->scope(); |
3387 CHECK_EQ(scope->inner_scopes()->length(), 1); | 3382 CHECK_EQ(scope->inner_scopes()->length(), 1); |
3388 i::Scope* inner_scope = scope->inner_scopes()->at(0); | 3383 i::Scope* inner_scope = scope->inner_scopes()->at(0); |
3389 const i::AstRawString* var_name = | 3384 const i::AstRawString* var_name = |
(...skipping 1689 matching lines...) Loading... |
5079 128 * 1024); | 5074 128 * 1024); |
5080 | 5075 |
5081 for (unsigned i = 0; i < arraysize(kSources); ++i) { | 5076 for (unsigned i = 0; i < arraysize(kSources); ++i) { |
5082 i::Handle<i::String> source = | 5077 i::Handle<i::String> source = |
5083 factory->NewStringFromAsciiChecked(kSources[i]); | 5078 factory->NewStringFromAsciiChecked(kSources[i]); |
5084 | 5079 |
5085 // Show that parsing as a module works | 5080 // Show that parsing as a module works |
5086 { | 5081 { |
5087 i::Handle<i::Script> script = factory->NewScript(source); | 5082 i::Handle<i::Script> script = factory->NewScript(source); |
5088 i::Zone zone; | 5083 i::Zone zone; |
5089 i::ParseInfo info(&zone); | 5084 i::ParseInfo info(&zone, script); |
5090 info.InitializeFromScript(script); | |
5091 i::Parser parser(&info); | 5085 i::Parser parser(&info); |
5092 parser.set_allow_harmony_classes(true); | 5086 parser.set_allow_harmony_classes(true); |
5093 parser.set_allow_harmony_modules(true); | 5087 parser.set_allow_harmony_modules(true); |
5094 parser.set_allow_harmony_scoping(true); | 5088 parser.set_allow_harmony_scoping(true); |
5095 info.set_module(); | 5089 info.set_module(); |
5096 if (!parser.Parse(&info)) { | 5090 if (!parser.Parse(&info)) { |
5097 i::Handle<i::JSObject> exception_handle( | 5091 i::Handle<i::JSObject> exception_handle( |
5098 i::JSObject::cast(isolate->pending_exception())); | 5092 i::JSObject::cast(isolate->pending_exception())); |
5099 i::Handle<i::String> message_string = | 5093 i::Handle<i::String> message_string = |
5100 i::Handle<i::String>::cast(i::Object::GetProperty( | 5094 i::Handle<i::String>::cast(i::Object::GetProperty( |
5101 isolate, exception_handle, "message").ToHandleChecked()); | 5095 isolate, exception_handle, "message").ToHandleChecked()); |
5102 | 5096 |
5103 v8::base::OS::Print( | 5097 v8::base::OS::Print( |
5104 "Parser failed on:\n" | 5098 "Parser failed on:\n" |
5105 "\t%s\n" | 5099 "\t%s\n" |
5106 "with error:\n" | 5100 "with error:\n" |
5107 "\t%s\n" | 5101 "\t%s\n" |
5108 "However, we expected no error.", | 5102 "However, we expected no error.", |
5109 source->ToCString().get(), message_string->ToCString().get()); | 5103 source->ToCString().get(), message_string->ToCString().get()); |
5110 CHECK(false); | 5104 CHECK(false); |
5111 } | 5105 } |
5112 } | 5106 } |
5113 | 5107 |
5114 // And that parsing a script does not. | 5108 // And that parsing a script does not. |
5115 { | 5109 { |
5116 i::Handle<i::Script> script = factory->NewScript(source); | 5110 i::Handle<i::Script> script = factory->NewScript(source); |
5117 i::Zone zone; | 5111 i::Zone zone; |
5118 i::ParseInfo info(&zone); | 5112 i::ParseInfo info(&zone, script); |
5119 info.InitializeFromScript(script); | |
5120 i::Parser parser(&info); | 5113 i::Parser parser(&info); |
5121 parser.set_allow_harmony_classes(true); | 5114 parser.set_allow_harmony_classes(true); |
5122 parser.set_allow_harmony_modules(true); | 5115 parser.set_allow_harmony_modules(true); |
5123 parser.set_allow_harmony_scoping(true); | 5116 parser.set_allow_harmony_scoping(true); |
5124 info.set_global(); | 5117 info.set_global(); |
5125 CHECK(!parser.Parse(&info)); | 5118 CHECK(!parser.Parse(&info)); |
5126 } | 5119 } |
5127 } | 5120 } |
5128 } | 5121 } |
5129 | 5122 |
(...skipping 70 matching lines...) Loading... |
5200 | 5193 |
5201 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5194 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
5202 128 * 1024); | 5195 128 * 1024); |
5203 | 5196 |
5204 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { | 5197 for (unsigned i = 0; i < arraysize(kErrorSources); ++i) { |
5205 i::Handle<i::String> source = | 5198 i::Handle<i::String> source = |
5206 factory->NewStringFromAsciiChecked(kErrorSources[i]); | 5199 factory->NewStringFromAsciiChecked(kErrorSources[i]); |
5207 | 5200 |
5208 i::Handle<i::Script> script = factory->NewScript(source); | 5201 i::Handle<i::Script> script = factory->NewScript(source); |
5209 i::Zone zone; | 5202 i::Zone zone; |
5210 i::ParseInfo info(&zone); | 5203 i::ParseInfo info(&zone, script); |
5211 info.InitializeFromScript(script); | |
5212 i::Parser parser(&info); | 5204 i::Parser parser(&info); |
5213 parser.set_allow_harmony_classes(true); | 5205 parser.set_allow_harmony_classes(true); |
5214 parser.set_allow_harmony_modules(true); | 5206 parser.set_allow_harmony_modules(true); |
5215 parser.set_allow_harmony_scoping(true); | 5207 parser.set_allow_harmony_scoping(true); |
5216 info.set_module(); | 5208 info.set_module(); |
5217 CHECK(!parser.Parse(&info)); | 5209 CHECK(!parser.Parse(&info)); |
5218 } | 5210 } |
5219 } | 5211 } |
5220 | 5212 |
5221 | 5213 |
5222 TEST(ModuleParsingInternals) { | 5214 TEST(ModuleParsingInternals) { |
5223 i::FLAG_harmony_modules = true; | 5215 i::FLAG_harmony_modules = true; |
5224 | 5216 |
5225 i::Isolate* isolate = CcTest::i_isolate(); | 5217 i::Isolate* isolate = CcTest::i_isolate(); |
5226 i::Factory* factory = isolate->factory(); | 5218 i::Factory* factory = isolate->factory(); |
5227 v8::HandleScope handles(CcTest::isolate()); | 5219 v8::HandleScope handles(CcTest::isolate()); |
5228 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 5220 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
5229 v8::Context::Scope context_scope(context); | 5221 v8::Context::Scope context_scope(context); |
5230 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5222 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
5231 128 * 1024); | 5223 128 * 1024); |
5232 | 5224 |
5233 static const char kSource[] = | 5225 static const char kSource[] = |
5234 "let x = 5;" | 5226 "let x = 5;" |
5235 "export { x as y };" | 5227 "export { x as y };" |
5236 "import { q as z } from 'm.js';" | 5228 "import { q as z } from 'm.js';" |
5237 "import n from 'n.js'"; | 5229 "import n from 'n.js'"; |
5238 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); | 5230 i::Handle<i::String> source = factory->NewStringFromAsciiChecked(kSource); |
5239 i::Handle<i::Script> script = factory->NewScript(source); | 5231 i::Handle<i::Script> script = factory->NewScript(source); |
5240 i::Zone zone; | 5232 i::Zone zone; |
5241 i::ParseInfo info(&zone); | 5233 i::ParseInfo info(&zone, script); |
5242 info.InitializeFromScript(script); | |
5243 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed()); | 5234 i::AstValueFactory avf(&zone, isolate->heap()->HashSeed()); |
5244 i::Parser parser(&info); | 5235 i::Parser parser(&info); |
5245 parser.set_allow_harmony_modules(true); | 5236 parser.set_allow_harmony_modules(true); |
5246 parser.set_allow_harmony_scoping(true); | 5237 parser.set_allow_harmony_scoping(true); |
5247 info.set_module(); | 5238 info.set_module(); |
5248 CHECK(parser.Parse(&info)); | 5239 CHECK(parser.Parse(&info)); |
5249 CHECK(i::Compiler::Analyze(&info)); | 5240 CHECK(i::Compiler::Analyze(&info)); |
5250 | 5241 |
5251 i::FunctionLiteral* func = info.function(); | 5242 i::FunctionLiteral* func = info.function(); |
5252 i::Scope* module_scope = func->scope(); | 5243 i::Scope* module_scope = func->scope(); |
(...skipping 104 matching lines...) Loading... |
5357 i::Factory* factory = isolate->factory(); | 5348 i::Factory* factory = isolate->factory(); |
5358 v8::HandleScope handles(CcTest::isolate()); | 5349 v8::HandleScope handles(CcTest::isolate()); |
5359 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); | 5350 v8::Handle<v8::Context> context = v8::Context::New(CcTest::isolate()); |
5360 v8::Context::Scope context_scope(context); | 5351 v8::Context::Scope context_scope(context); |
5361 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | 5352 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - |
5362 128 * 1024); | 5353 128 * 1024); |
5363 | 5354 |
5364 i::Handle<i::Script> script = | 5355 i::Handle<i::Script> script = |
5365 factory->NewScript(factory->NewStringFromAsciiChecked(source)); | 5356 factory->NewScript(factory->NewStringFromAsciiChecked(source)); |
5366 i::Zone zone; | 5357 i::Zone zone; |
5367 i::ParseInfo info(&zone); | 5358 i::ParseInfo info(&zone, script); |
5368 info.InitializeFromScript(script); | |
5369 i::Parser parser(&info); | 5359 i::Parser parser(&info); |
5370 parser.set_allow_strong_mode(true); | 5360 parser.set_allow_strong_mode(true); |
5371 info.set_global(); | 5361 info.set_global(); |
5372 parser.Parse(&info); | 5362 parser.Parse(&info); |
5373 CHECK(info.function() != NULL); | 5363 CHECK(info.function() != NULL); |
5374 CHECK_EQ(expected_language_mode, info.function()->language_mode()); | 5364 CHECK_EQ(expected_language_mode, info.function()->language_mode()); |
5375 } | 5365 } |
5376 | 5366 |
5377 | 5367 |
5378 TEST(LanguageModeDirectives) { | 5368 TEST(LanguageModeDirectives) { |
(...skipping 208 matching lines...) Loading... |
5587 "(a/*\n*/=> a)(1)", | 5577 "(a/*\n*/=> a)(1)", |
5588 "((a)\n=> a)(1)", | 5578 "((a)\n=> a)(1)", |
5589 "((a)/*\n*/=> a)(1)", | 5579 "((a)/*\n*/=> a)(1)", |
5590 "((a, b)\n=> a + b)(1, 2)", | 5580 "((a, b)\n=> a + b)(1, 2)", |
5591 "((a, b)/*\n*/=> a + b)(1, 2)", | 5581 "((a, b)/*\n*/=> a + b)(1, 2)", |
5592 NULL}; | 5582 NULL}; |
5593 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; | 5583 static const ParserFlag always_flags[] = {kAllowHarmonyArrowFunctions}; |
5594 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, | 5584 RunParserSyncTest(context_data, data, kError, NULL, 0, always_flags, |
5595 arraysize(always_flags)); | 5585 arraysize(always_flags)); |
5596 } | 5586 } |
OLD | NEW |