| 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 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 CcTest::i_isolate()->stack_guard()->real_climit()); | 454 CcTest::i_isolate()->stack_guard()->real_climit()); |
| 455 preparser.set_allow_lazy(true); | 455 preparser.set_allow_lazy(true); |
| 456 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 456 i::PreParser::PreParseResult result = preparser.PreParseProgram(); |
| 457 // Even in the case of a syntax error, kPreParseSuccess is returned. | 457 // Even in the case of a syntax error, kPreParseSuccess is returned. |
| 458 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 458 CHECK_EQ(i::PreParser::kPreParseSuccess, result); |
| 459 CHECK(log.HasError()); | 459 CHECK(log.HasError()); |
| 460 } | 460 } |
| 461 | 461 |
| 462 | 462 |
| 463 TEST(Regress928) { | 463 TEST(Regress928) { |
| 464 v8::V8::Initialize(); | 464 // Test only applies when lazy parsing. |
| 465 i::Isolate* isolate = CcTest::i_isolate(); | 465 if (!i::FLAG_lazy || (i::FLAG_ignition && i::FLAG_ignition_eager)) return; |
| 466 i::FLAG_min_preparse_length = 0; |
| 466 | 467 |
| 467 // Preparsing didn't consider the catch clause of a try statement | 468 // Tests that the first non-toplevel function is not included in the preparse |
| 468 // as with-content, which made it assume that a function inside | 469 // data. |
| 469 // the block could be lazily compiled, and an extra, unexpected, | |
| 470 // entry was added to the data. | |
| 471 isolate->stack_guard()->SetStackLimit(i::GetCurrentStackPosition() - | |
| 472 128 * 1024); | |
| 473 | |
| 474 const char* program = | 470 const char* program = |
| 475 "try { } catch (e) { var foo = function () { /* first */ } }" | 471 "try { } catch (e) { var foo = function () { /* first */ } }" |
| 476 "var bar = function () { /* second */ }"; | 472 "var bar = function () { /* second */ }"; |
| 477 | 473 |
| 478 v8::HandleScope handles(CcTest::isolate()); | 474 v8::Isolate* isolate = CcTest::isolate(); |
| 479 auto stream = i::ScannerStream::ForTesting(program); | 475 v8::HandleScope handles(isolate); |
| 480 i::CompleteParserRecorder log; | 476 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 481 i::Scanner scanner(CcTest::i_isolate()->unicode_cache()); | 477 v8::Context::Scope context_scope(context); |
| 482 scanner.Initialize(stream.get()); | 478 v8::ScriptCompiler::Source script_source(v8_str(program)); |
| 483 i::Zone zone(CcTest::i_isolate()->allocator()); | 479 v8::ScriptCompiler::Compile(context, &script_source, |
| 484 i::AstValueFactory ast_value_factory(&zone, | 480 v8::ScriptCompiler::kProduceParserCache) |
| 485 CcTest::i_isolate()->heap()->HashSeed()); | 481 .ToLocalChecked(); |
| 486 i::PreParser preparser(&zone, &scanner, &ast_value_factory, &log, | 482 |
| 487 CcTest::i_isolate()->stack_guard()->real_climit()); | 483 const v8::ScriptCompiler::CachedData* cached_data = |
| 488 preparser.set_allow_lazy(true); | 484 script_source.GetCachedData(); |
| 489 i::PreParser::PreParseResult result = preparser.PreParseProgram(); | 485 i::ScriptData script_data(cached_data->data, cached_data->length); |
| 490 CHECK_EQ(i::PreParser::kPreParseSuccess, result); | 486 std::unique_ptr<i::ParseData> pd(i::ParseData::FromCachedData(&script_data)); |
| 491 i::ScriptData* sd = log.GetScriptData(); | |
| 492 i::ParseData* pd = i::ParseData::FromCachedData(sd); | |
| 493 pd->Initialize(); | 487 pd->Initialize(); |
| 494 | 488 |
| 495 int first_function = | 489 int first_function = |
| 496 static_cast<int>(strstr(program, "function") - program); | 490 static_cast<int>(strstr(program, "function") - program); |
| 497 int first_lbrace = first_function + i::StrLength("function () "); | 491 int first_lbrace = first_function + i::StrLength("function () "); |
| 498 CHECK_EQ('{', program[first_lbrace]); | 492 CHECK_EQ('{', program[first_lbrace]); |
| 499 i::FunctionEntry entry1 = pd->GetFunctionEntry(first_lbrace); | 493 i::FunctionEntry entry1 = pd->GetFunctionEntry(first_lbrace); |
| 500 CHECK(!entry1.is_valid()); | 494 CHECK(!entry1.is_valid()); |
| 501 | 495 |
| 502 int second_function = | 496 int second_function = |
| 503 static_cast<int>(strstr(program + first_lbrace, "function") - program); | 497 static_cast<int>(strstr(program + first_lbrace, "function") - program); |
| 504 int second_lbrace = | 498 int second_lbrace = |
| 505 second_function + i::StrLength("function () "); | 499 second_function + i::StrLength("function () "); |
| 506 CHECK_EQ('{', program[second_lbrace]); | 500 CHECK_EQ('{', program[second_lbrace]); |
| 507 i::FunctionEntry entry2 = pd->GetFunctionEntry(second_lbrace); | 501 i::FunctionEntry entry2 = pd->GetFunctionEntry(second_lbrace); |
| 508 CHECK(entry2.is_valid()); | 502 CHECK(entry2.is_valid()); |
| 509 CHECK_EQ('}', program[entry2.end_pos() - 1]); | 503 CHECK_EQ('}', program[entry2.end_pos() - 1]); |
| 510 delete sd; | |
| 511 delete pd; | |
| 512 } | 504 } |
| 513 | 505 |
| 514 | 506 |
| 515 TEST(PreParseOverflow) { | 507 TEST(PreParseOverflow) { |
| 516 v8::V8::Initialize(); | 508 v8::V8::Initialize(); |
| 517 | 509 |
| 518 CcTest::i_isolate()->stack_guard()->SetStackLimit( | 510 CcTest::i_isolate()->stack_guard()->SetStackLimit( |
| 519 i::GetCurrentStackPosition() - 128 * 1024); | 511 i::GetCurrentStackPosition() - 128 * 1024); |
| 520 | 512 |
| 521 size_t kProgramSize = 1024 * 1024; | 513 size_t kProgramSize = 1024 * 1024; |
| (...skipping 7804 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8326 const char* data[] = { | 8318 const char* data[] = { |
| 8327 "const arguments = 1", | 8319 "const arguments = 1", |
| 8328 "let arguments", | 8320 "let arguments", |
| 8329 "var arguments", | 8321 "var arguments", |
| 8330 NULL | 8322 NULL |
| 8331 }; | 8323 }; |
| 8332 // clang-format on | 8324 // clang-format on |
| 8333 RunParserSyncTest(context_data, data, kSuccess); | 8325 RunParserSyncTest(context_data, data, kSuccess); |
| 8334 } | 8326 } |
| 8335 } | 8327 } |
| OLD | NEW |