| OLD | NEW |
| 1 // Copyright 2007-2010 the V8 project authors. All rights reserved. | 1 // Copyright 2007-2010 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 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 v8::HandleScope scope(isolate); | 149 v8::HandleScope scope(isolate); |
| 150 v8::Context::New(isolate); | 150 v8::Context::New(isolate); |
| 151 } | 151 } |
| 152 | 152 |
| 153 Isolate* internal_isolate = reinterpret_cast<Isolate*>(isolate); | 153 Isolate* internal_isolate = reinterpret_cast<Isolate*>(isolate); |
| 154 internal_isolate->heap()->CollectAllAvailableGarbage("serialize"); | 154 internal_isolate->heap()->CollectAllAvailableGarbage("serialize"); |
| 155 WriteToFile(internal_isolate, FLAG_testing_serialization_file); | 155 WriteToFile(internal_isolate, FLAG_testing_serialization_file); |
| 156 } | 156 } |
| 157 | 157 |
| 158 | 158 |
| 159 Vector<const uint8_t> ConstructSource(Vector<const uint8_t> head, | |
| 160 Vector<const uint8_t> body, | |
| 161 Vector<const uint8_t> tail, int repeats) { | |
| 162 int source_length = head.length() + body.length() * repeats + tail.length(); | |
| 163 uint8_t* source = NewArray<uint8_t>(static_cast<size_t>(source_length)); | |
| 164 CopyChars(source, head.start(), head.length()); | |
| 165 for (int i = 0; i < repeats; i++) { | |
| 166 CopyChars(source + head.length() + i * body.length(), body.start(), | |
| 167 body.length()); | |
| 168 } | |
| 169 CopyChars(source + head.length() + repeats * body.length(), tail.start(), | |
| 170 tail.length()); | |
| 171 return Vector<const uint8_t>(const_cast<const uint8_t*>(source), | |
| 172 source_length); | |
| 173 } | |
| 174 | |
| 175 | |
| 176 // Test that the whole heap can be serialized. | 159 // Test that the whole heap can be serialized. |
| 177 UNINITIALIZED_TEST(Serialize) { | 160 UNINITIALIZED_TEST(Serialize) { |
| 178 if (!Snapshot::HaveASnapshotToStartFrom()) { | 161 if (!Snapshot::HaveASnapshotToStartFrom()) { |
| 179 v8::Isolate::CreateParams params; | 162 v8::Isolate::CreateParams params; |
| 180 params.enable_serializer = true; | 163 params.enable_serializer = true; |
| 181 v8::Isolate* isolate = v8::Isolate::New(params); | 164 v8::Isolate* isolate = v8::Isolate::New(params); |
| 182 Serialize(isolate); | 165 Serialize(isolate); |
| 183 } | 166 } |
| 184 } | 167 } |
| 185 | 168 |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 const char* c_source = "\"1234\".length"; | 293 const char* c_source = "\"1234\".length"; |
| 311 v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); | 294 v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); |
| 312 v8::Local<v8::Script> script = v8::Script::Compile(source); | 295 v8::Local<v8::Script> script = v8::Script::Compile(source); |
| 313 CHECK_EQ(4, script->Run()->Int32Value()); | 296 CHECK_EQ(4, script->Run()->Int32Value()); |
| 314 } | 297 } |
| 315 isolate->Dispose(); | 298 isolate->Dispose(); |
| 316 } | 299 } |
| 317 } | 300 } |
| 318 | 301 |
| 319 | 302 |
| 320 // Test that the whole heap can be serialized. | |
| 321 UNINITIALIZED_TEST(SerializeMultiplePages) { | |
| 322 if (!Snapshot::HaveASnapshotToStartFrom()) { | |
| 323 v8::Isolate::CreateParams params; | |
| 324 params.enable_serializer = true; | |
| 325 v8::Isolate* isolate = v8::Isolate::New(params); | |
| 326 { | |
| 327 v8::Isolate::Scope isolate_scope(isolate); | |
| 328 v8::HandleScope handle_scope(isolate); | |
| 329 v8::Local<v8::Context> context = v8::Context::New(isolate); | |
| 330 v8::Context::Scope context_scope(context); | |
| 331 Vector<const uint8_t> source = ConstructSource( | |
| 332 STATIC_CHAR_VECTOR("var s='"), STATIC_CHAR_VECTOR("A"), | |
| 333 STATIC_CHAR_VECTOR("';"), Page::kMaxRegularHeapObjectSize - 100); | |
| 334 v8::Handle<v8::String> source_str = v8::String::NewFromOneByte( | |
| 335 isolate, source.start(), v8::String::kNormalString, source.length()); | |
| 336 CompileRun(source_str); | |
| 337 } | |
| 338 | |
| 339 Isolate* internal_isolate = reinterpret_cast<Isolate*>(isolate); | |
| 340 internal_isolate->heap()->CollectAllAvailableGarbage("serialize"); | |
| 341 WriteToFile(internal_isolate, FLAG_testing_serialization_file); | |
| 342 } | |
| 343 } | |
| 344 | |
| 345 | |
| 346 UNINITIALIZED_TEST(PartialSerialization) { | 303 UNINITIALIZED_TEST(PartialSerialization) { |
| 347 if (!Snapshot::HaveASnapshotToStartFrom()) { | 304 if (!Snapshot::HaveASnapshotToStartFrom()) { |
| 348 v8::Isolate::CreateParams params; | 305 v8::Isolate::CreateParams params; |
| 349 params.enable_serializer = true; | 306 params.enable_serializer = true; |
| 350 v8::Isolate* v8_isolate = v8::Isolate::New(params); | 307 v8::Isolate* v8_isolate = v8::Isolate::New(params); |
| 351 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 308 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
| 352 v8_isolate->Enter(); | 309 v8_isolate->Enter(); |
| 353 { | 310 { |
| 354 Heap* heap = isolate->heap(); | 311 Heap* heap = isolate->heap(); |
| 355 | 312 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 582 } | 539 } |
| 583 } | 540 } |
| 584 | 541 |
| 585 | 542 |
| 586 UNINITIALIZED_TEST(CustomContextSerialization) { | 543 UNINITIALIZED_TEST(CustomContextSerialization) { |
| 587 if (!Snapshot::HaveASnapshotToStartFrom()) { | 544 if (!Snapshot::HaveASnapshotToStartFrom()) { |
| 588 v8::Isolate::CreateParams params; | 545 v8::Isolate::CreateParams params; |
| 589 params.enable_serializer = true; | 546 params.enable_serializer = true; |
| 590 v8::Isolate* v8_isolate = v8::Isolate::New(params); | 547 v8::Isolate* v8_isolate = v8::Isolate::New(params); |
| 591 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 548 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
| 549 Heap* heap = isolate->heap(); |
| 592 { | 550 { |
| 593 v8::Isolate::Scope isolate_scope(v8_isolate); | 551 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 594 | 552 |
| 595 v8::Persistent<v8::Context> env; | 553 v8::Persistent<v8::Context> env; |
| 596 { | 554 { |
| 597 HandleScope scope(isolate); | 555 HandleScope scope(isolate); |
| 598 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); | 556 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); |
| 599 } | 557 } |
| 600 DCHECK(!env.IsEmpty()); | 558 DCHECK(!env.IsEmpty()); |
| 601 { | 559 { |
| 602 v8::HandleScope handle_scope(v8_isolate); | 560 v8::HandleScope handle_scope(v8_isolate); |
| 603 v8::Local<v8::Context>::New(v8_isolate, env)->Enter(); | 561 v8::Local<v8::Context>::New(v8_isolate, env)->Enter(); |
| 604 // After execution, e's function context refers to the global object. | 562 // After execution, e's function context refers to the global object. |
| 605 CompileRun( | 563 CompileRun( |
| 606 "var e;" | 564 "var e;" |
| 607 "(function() {" | 565 "(function() {" |
| 608 " e = function(s) { return eval (s); }" | 566 " e = function(s) { return eval (s); }" |
| 609 "})();" | 567 "})();" |
| 610 "var o = this;" | 568 "var o = this;" |
| 611 "var r = Math.random() + Math.cos(0);" | 569 "var r = Math.random() + Math.cos(0);" |
| 612 "var f = (function(a, b) { return a + b; }).bind(1, 2, 3);" | 570 "var f = (function(a, b) { return a + b; }).bind(1, 2, 3);" |
| 613 "var s = parseInt('12345');"); | 571 "var s = parseInt('12345');"); |
| 614 | |
| 615 Vector<const uint8_t> source = ConstructSource( | |
| 616 STATIC_CHAR_VECTOR("function g() { return [,"), | |
| 617 STATIC_CHAR_VECTOR("1,"), | |
| 618 STATIC_CHAR_VECTOR("];} a = g(); b = g(); b.push(1);"), 100000); | |
| 619 v8::Handle<v8::String> source_str = v8::String::NewFromOneByte( | |
| 620 v8_isolate, source.start(), v8::String::kNormalString, | |
| 621 source.length()); | |
| 622 CompileRun(source_str); | |
| 623 source.Dispose(); | |
| 624 } | 572 } |
| 625 // Make sure all builtin scripts are cached. | 573 // Make sure all builtin scripts are cached. |
| 626 { | 574 { |
| 627 HandleScope scope(isolate); | 575 HandleScope scope(isolate); |
| 628 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { | 576 for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { |
| 629 isolate->bootstrapper()->NativesSourceLookup(i); | 577 isolate->bootstrapper()->NativesSourceLookup(i); |
| 630 } | 578 } |
| 631 } | 579 } |
| 632 // If we don't do this then we end up with a stray root pointing at the | 580 // If we don't do this then we end up with a stray root pointing at the |
| 633 // context even after we have disposed of env. | 581 // context even after we have disposed of env. |
| 634 isolate->heap()->CollectAllAvailableGarbage("snapshotting"); | 582 heap->CollectAllGarbage(Heap::kNoGCFlags); |
| 635 | 583 |
| 636 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 584 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
| 637 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 585 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
| 638 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 586 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
| 639 | 587 |
| 640 { | 588 { |
| 641 v8::HandleScope handle_scope(v8_isolate); | 589 v8::HandleScope handle_scope(v8_isolate); |
| 642 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); | 590 v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); |
| 643 } | 591 } |
| 644 | 592 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 712 v8::Handle<v8::Context> v8_context = v8::Utils::ToLocal(context); | 660 v8::Handle<v8::Context> v8_context = v8::Utils::ToLocal(context); |
| 713 v8::Context::Scope context_scope(v8_context); | 661 v8::Context::Scope context_scope(v8_context); |
| 714 double r = CompileRun("r")->ToNumber(v8_isolate)->Value(); | 662 double r = CompileRun("r")->ToNumber(v8_isolate)->Value(); |
| 715 CHECK(r >= 1 && r <= 2); | 663 CHECK(r >= 1 && r <= 2); |
| 716 int f = CompileRun("f()")->ToNumber(v8_isolate)->Int32Value(); | 664 int f = CompileRun("f()")->ToNumber(v8_isolate)->Int32Value(); |
| 717 CHECK_EQ(5, f); | 665 CHECK_EQ(5, f); |
| 718 f = CompileRun("e('f()')")->ToNumber(v8_isolate)->Int32Value(); | 666 f = CompileRun("e('f()')")->ToNumber(v8_isolate)->Int32Value(); |
| 719 CHECK_EQ(5, f); | 667 CHECK_EQ(5, f); |
| 720 v8::Handle<v8::String> s = CompileRun("s")->ToString(v8_isolate); | 668 v8::Handle<v8::String> s = CompileRun("s")->ToString(v8_isolate); |
| 721 CHECK(s->Equals(v8_str("12345"))); | 669 CHECK(s->Equals(v8_str("12345"))); |
| 722 int a = CompileRun("a.length")->ToNumber(v8_isolate)->Int32Value(); | |
| 723 CHECK_EQ(100001, a); | |
| 724 int b = CompileRun("b.length")->ToNumber(v8_isolate)->Int32Value(); | |
| 725 CHECK_EQ(100002, b); | |
| 726 } | 670 } |
| 727 } | 671 } |
| 728 v8_isolate->Dispose(); | 672 v8_isolate->Dispose(); |
| 729 } | 673 } |
| 730 } | 674 } |
| 731 | 675 |
| 732 | 676 |
| 733 TEST(TestThatAlwaysSucceeds) { | 677 TEST(TestThatAlwaysSucceeds) { |
| 734 } | 678 } |
| 735 | 679 |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 868 Handle<String> expected = | 812 Handle<String> expected = |
| 869 isolate->factory()->NewStringFromAsciiChecked("string1"); | 813 isolate->factory()->NewStringFromAsciiChecked("string1"); |
| 870 | 814 |
| 871 CHECK(Handle<String>::cast(copy_result)->Equals(*expected)); | 815 CHECK(Handle<String>::cast(copy_result)->Equals(*expected)); |
| 872 CHECK_EQ(builtins_count, CountBuiltins()); | 816 CHECK_EQ(builtins_count, CountBuiltins()); |
| 873 | 817 |
| 874 delete cache; | 818 delete cache; |
| 875 } | 819 } |
| 876 | 820 |
| 877 | 821 |
| 822 Vector<const uint8_t> ConstructSource(Vector<const uint8_t> head, |
| 823 Vector<const uint8_t> body, |
| 824 Vector<const uint8_t> tail, int repeats) { |
| 825 int source_length = head.length() + body.length() * repeats + tail.length(); |
| 826 uint8_t* source = NewArray<uint8_t>(static_cast<size_t>(source_length)); |
| 827 CopyChars(source, head.start(), head.length()); |
| 828 for (int i = 0; i < repeats; i++) { |
| 829 CopyChars(source + head.length() + i * body.length(), body.start(), |
| 830 body.length()); |
| 831 } |
| 832 CopyChars(source + head.length() + repeats * body.length(), tail.start(), |
| 833 tail.length()); |
| 834 return Vector<const uint8_t>(const_cast<const uint8_t*>(source), |
| 835 source_length); |
| 836 } |
| 837 |
| 838 |
| 878 TEST(SerializeToplevelLargeCodeObject) { | 839 TEST(SerializeToplevelLargeCodeObject) { |
| 879 FLAG_serialize_toplevel = true; | 840 FLAG_serialize_toplevel = true; |
| 880 LocalContext context; | 841 LocalContext context; |
| 881 Isolate* isolate = CcTest::i_isolate(); | 842 Isolate* isolate = CcTest::i_isolate(); |
| 882 isolate->compilation_cache()->Disable(); // Disable same-isolate code cache. | 843 isolate->compilation_cache()->Disable(); // Disable same-isolate code cache. |
| 883 | 844 |
| 884 v8::HandleScope scope(CcTest::isolate()); | 845 v8::HandleScope scope(CcTest::isolate()); |
| 885 | 846 |
| 886 Vector<const uint8_t> source = | 847 Vector<const uint8_t> source = |
| 887 ConstructSource(STATIC_CHAR_VECTOR("var j=1; try { if (j) throw 1;"), | 848 ConstructSource(STATIC_CHAR_VECTOR("var j=1; try { if (j) throw 1;"), |
| (...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1399 { | 1360 { |
| 1400 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); | 1361 DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2)); |
| 1401 script = v8::ScriptCompiler::CompileUnbound( | 1362 script = v8::ScriptCompiler::CompileUnbound( |
| 1402 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache); | 1363 isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache); |
| 1403 } | 1364 } |
| 1404 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); | 1365 v8::Local<v8::Value> result = script->BindToCurrentContext()->Run(); |
| 1405 CHECK(result->ToString(isolate2)->Equals(v8_str("XY"))); | 1366 CHECK(result->ToString(isolate2)->Equals(v8_str("XY"))); |
| 1406 } | 1367 } |
| 1407 isolate2->Dispose(); | 1368 isolate2->Dispose(); |
| 1408 } | 1369 } |
| OLD | NEW |