Chromium Code Reviews| 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 43 #include "src/snapshot/deserializer.h" | 43 #include "src/snapshot/deserializer.h" |
| 44 #include "src/snapshot/natives.h" | 44 #include "src/snapshot/natives.h" |
| 45 #include "src/snapshot/partial-serializer.h" | 45 #include "src/snapshot/partial-serializer.h" |
| 46 #include "src/snapshot/snapshot.h" | 46 #include "src/snapshot/snapshot.h" |
| 47 #include "src/snapshot/startup-serializer.h" | 47 #include "src/snapshot/startup-serializer.h" |
| 48 #include "test/cctest/cctest.h" | 48 #include "test/cctest/cctest.h" |
| 49 #include "test/cctest/heap/heap-utils.h" | 49 #include "test/cctest/heap/heap-utils.h" |
| 50 | 50 |
| 51 using namespace v8::internal; | 51 using namespace v8::internal; |
| 52 | 52 |
| 53 void DisableTurbofan() { | |
| 54 const char* flag = "--turbo-filter=\"\""; | |
| 55 FlagList::SetFlagsFromString(flag, StrLength(flag)); | |
| 56 } | |
| 57 | |
| 58 | |
| 59 // TestIsolate is used for testing isolate serialization. | 53 // TestIsolate is used for testing isolate serialization. |
| 60 class TestIsolate : public Isolate { | 54 class TestIsolate : public Isolate { |
| 61 public: | 55 public: |
| 62 static v8::Isolate* NewInitialized(bool enable_serializer) { | 56 static v8::Isolate* NewInitialized(bool enable_serializer) { |
| 63 i::Isolate* isolate = new TestIsolate(enable_serializer); | 57 i::Isolate* isolate = new TestIsolate(enable_serializer); |
| 64 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 58 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
| 65 v8::Isolate::Scope isolate_scope(v8_isolate); | 59 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 66 isolate->Init(NULL); | 60 isolate->Init(NULL); |
| 67 return v8_isolate; | 61 return v8_isolate; |
| 68 } | 62 } |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 143 #ifdef VERIFY_HEAP | 137 #ifdef VERIFY_HEAP |
| 144 isolate->heap()->Verify(); | 138 isolate->heap()->Verify(); |
| 145 #endif | 139 #endif |
| 146 CHECK(isolate->global_object()->IsJSObject()); | 140 CHECK(isolate->global_object()->IsJSObject()); |
| 147 CHECK(isolate->native_context()->IsContext()); | 141 CHECK(isolate->native_context()->IsContext()); |
| 148 CHECK(isolate->heap()->string_table()->IsStringTable()); | 142 CHECK(isolate->heap()->string_table()->IsStringTable()); |
| 149 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); | 143 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); |
| 150 } | 144 } |
| 151 | 145 |
| 152 UNINITIALIZED_TEST(StartupSerializerOnce) { | 146 UNINITIALIZED_TEST(StartupSerializerOnce) { |
| 153 // The serialize-deserialize tests only work if the VM is built without | |
| 154 // serialization. That doesn't matter. We don't need to be able to | |
| 155 // serialize a snapshot in a VM that is booted from a snapshot. | |
|
Yang
2016/11/04 09:00:29
This comment doesn't make any sense nowadays.
| |
| 156 DisableTurbofan(); | |
| 157 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 147 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 158 Vector<const byte> blob = Serialize(isolate); | 148 Vector<const byte> blob = Serialize(isolate); |
| 159 isolate = Deserialize(blob); | 149 isolate = Deserialize(blob); |
| 160 blob.Dispose(); | 150 blob.Dispose(); |
| 161 { | 151 { |
| 162 v8::HandleScope handle_scope(isolate); | 152 v8::HandleScope handle_scope(isolate); |
| 163 v8::Isolate::Scope isolate_scope(isolate); | 153 v8::Isolate::Scope isolate_scope(isolate); |
| 164 | 154 |
| 165 v8::Local<v8::Context> env = v8::Context::New(isolate); | 155 v8::Local<v8::Context> env = v8::Context::New(isolate); |
| 166 env->Enter(); | 156 env->Enter(); |
| 167 | 157 |
| 168 SanityCheck(isolate); | 158 SanityCheck(isolate); |
| 169 } | 159 } |
| 170 isolate->Dispose(); | 160 isolate->Dispose(); |
| 171 } | 161 } |
| 172 | 162 |
| 173 UNINITIALIZED_TEST(StartupSerializerTwice) { | 163 UNINITIALIZED_TEST(StartupSerializerTwice) { |
| 174 DisableTurbofan(); | |
| 175 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 164 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 176 Vector<const byte> blob1 = Serialize(isolate); | 165 Vector<const byte> blob1 = Serialize(isolate); |
| 177 Vector<const byte> blob2 = Serialize(isolate); | 166 Vector<const byte> blob2 = Serialize(isolate); |
| 178 blob1.Dispose(); | 167 blob1.Dispose(); |
| 179 isolate = Deserialize(blob2); | 168 isolate = Deserialize(blob2); |
| 180 blob2.Dispose(); | 169 blob2.Dispose(); |
| 181 { | 170 { |
| 182 v8::Isolate::Scope isolate_scope(isolate); | 171 v8::Isolate::Scope isolate_scope(isolate); |
| 183 v8::HandleScope handle_scope(isolate); | 172 v8::HandleScope handle_scope(isolate); |
| 184 | 173 |
| 185 v8::Local<v8::Context> env = v8::Context::New(isolate); | 174 v8::Local<v8::Context> env = v8::Context::New(isolate); |
| 186 env->Enter(); | 175 env->Enter(); |
| 187 | 176 |
| 188 SanityCheck(isolate); | 177 SanityCheck(isolate); |
| 189 } | 178 } |
| 190 isolate->Dispose(); | 179 isolate->Dispose(); |
| 191 } | 180 } |
| 192 | 181 |
| 193 UNINITIALIZED_TEST(StartupSerializerOnceRunScript) { | 182 UNINITIALIZED_TEST(StartupSerializerOnceRunScript) { |
| 194 DisableTurbofan(); | |
| 195 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 183 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 196 Vector<const byte> blob = Serialize(isolate); | 184 Vector<const byte> blob = Serialize(isolate); |
| 197 isolate = Deserialize(blob); | 185 isolate = Deserialize(blob); |
| 198 blob.Dispose(); | 186 blob.Dispose(); |
| 199 { | 187 { |
| 200 v8::Isolate::Scope isolate_scope(isolate); | 188 v8::Isolate::Scope isolate_scope(isolate); |
| 201 v8::HandleScope handle_scope(isolate); | 189 v8::HandleScope handle_scope(isolate); |
| 202 | 190 |
| 203 | 191 |
| 204 v8::Local<v8::Context> env = v8::Context::New(isolate); | 192 v8::Local<v8::Context> env = v8::Context::New(isolate); |
| 205 env->Enter(); | 193 env->Enter(); |
| 206 | 194 |
| 207 const char* c_source = "\"1234\".length"; | 195 const char* c_source = "\"1234\".length"; |
| 208 v8::Local<v8::Script> script = v8_compile(c_source); | 196 v8::Local<v8::Script> script = v8_compile(c_source); |
| 209 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) | 197 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
| 210 .ToLocalChecked() | 198 .ToLocalChecked() |
| 211 ->Int32Value(isolate->GetCurrentContext()); | 199 ->Int32Value(isolate->GetCurrentContext()); |
| 212 CHECK_EQ(4, result.FromJust()); | 200 CHECK_EQ(4, result.FromJust()); |
| 213 } | 201 } |
| 214 isolate->Dispose(); | 202 isolate->Dispose(); |
| 215 } | 203 } |
| 216 | 204 |
| 217 UNINITIALIZED_TEST(StartupSerializerTwiceRunScript) { | 205 UNINITIALIZED_TEST(StartupSerializerTwiceRunScript) { |
| 218 DisableTurbofan(); | |
| 219 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 206 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 220 Vector<const byte> blob1 = Serialize(isolate); | 207 Vector<const byte> blob1 = Serialize(isolate); |
| 221 Vector<const byte> blob2 = Serialize(isolate); | 208 Vector<const byte> blob2 = Serialize(isolate); |
| 222 blob1.Dispose(); | 209 blob1.Dispose(); |
| 223 isolate = Deserialize(blob2); | 210 isolate = Deserialize(blob2); |
| 224 blob2.Dispose(); | 211 blob2.Dispose(); |
| 225 { | 212 { |
| 226 v8::Isolate::Scope isolate_scope(isolate); | 213 v8::Isolate::Scope isolate_scope(isolate); |
| 227 v8::HandleScope handle_scope(isolate); | 214 v8::HandleScope handle_scope(isolate); |
| 228 | 215 |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 SnapshotData partial_snapshot(&partial_serializer); | 283 SnapshotData partial_snapshot(&partial_serializer); |
| 297 | 284 |
| 298 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 285 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
| 299 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 286 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
| 300 } | 287 } |
| 301 v8_isolate->Exit(); | 288 v8_isolate->Exit(); |
| 302 v8_isolate->Dispose(); | 289 v8_isolate->Dispose(); |
| 303 } | 290 } |
| 304 | 291 |
| 305 UNINITIALIZED_TEST(PartialSerializerObject) { | 292 UNINITIALIZED_TEST(PartialSerializerObject) { |
| 306 DisableTurbofan(); | |
| 307 Vector<const byte> startup_blob; | 293 Vector<const byte> startup_blob; |
| 308 Vector<const byte> partial_blob; | 294 Vector<const byte> partial_blob; |
| 309 PartiallySerializeObject(&startup_blob, &partial_blob); | 295 PartiallySerializeObject(&startup_blob, &partial_blob); |
| 310 | 296 |
| 311 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 297 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
| 312 startup_blob.Dispose(); | 298 startup_blob.Dispose(); |
| 313 CHECK(v8_isolate); | 299 CHECK(v8_isolate); |
| 314 { | 300 { |
| 315 v8::Isolate::Scope isolate_scope(v8_isolate); | 301 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 316 | 302 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 394 SnapshotData startup_snapshot(&startup_serializer); | 380 SnapshotData startup_snapshot(&startup_serializer); |
| 395 SnapshotData partial_snapshot(&partial_serializer); | 381 SnapshotData partial_snapshot(&partial_serializer); |
| 396 | 382 |
| 397 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 383 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
| 398 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 384 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
| 399 } | 385 } |
| 400 v8_isolate->Dispose(); | 386 v8_isolate->Dispose(); |
| 401 } | 387 } |
| 402 | 388 |
| 403 UNINITIALIZED_TEST(PartialSerializerContext) { | 389 UNINITIALIZED_TEST(PartialSerializerContext) { |
| 404 DisableTurbofan(); | |
| 405 Vector<const byte> startup_blob; | 390 Vector<const byte> startup_blob; |
| 406 Vector<const byte> partial_blob; | 391 Vector<const byte> partial_blob; |
| 407 PartiallySerializeContext(&startup_blob, &partial_blob); | 392 PartiallySerializeContext(&startup_blob, &partial_blob); |
| 408 | 393 |
| 409 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 394 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
| 410 CHECK(v8_isolate); | 395 CHECK(v8_isolate); |
| 411 startup_blob.Dispose(); | 396 startup_blob.Dispose(); |
| 412 { | 397 { |
| 413 v8::Isolate::Scope isolate_scope(v8_isolate); | 398 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 414 | 399 |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 513 SnapshotData startup_snapshot(&startup_serializer); | 498 SnapshotData startup_snapshot(&startup_serializer); |
| 514 SnapshotData partial_snapshot(&partial_serializer); | 499 SnapshotData partial_snapshot(&partial_serializer); |
| 515 | 500 |
| 516 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 501 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
| 517 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 502 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
| 518 } | 503 } |
| 519 v8_isolate->Dispose(); | 504 v8_isolate->Dispose(); |
| 520 } | 505 } |
| 521 | 506 |
| 522 UNINITIALIZED_TEST(PartialSerializerCustomContext) { | 507 UNINITIALIZED_TEST(PartialSerializerCustomContext) { |
| 523 DisableTurbofan(); | |
| 524 Vector<const byte> startup_blob; | 508 Vector<const byte> startup_blob; |
| 525 Vector<const byte> partial_blob; | 509 Vector<const byte> partial_blob; |
| 526 PartiallySerializeCustomContext(&startup_blob, &partial_blob); | 510 PartiallySerializeCustomContext(&startup_blob, &partial_blob); |
| 527 | 511 |
| 528 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 512 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
| 529 CHECK(v8_isolate); | 513 CHECK(v8_isolate); |
| 530 startup_blob.Dispose(); | 514 startup_blob.Dispose(); |
| 531 { | 515 { |
| 532 v8::Isolate::Scope isolate_scope(v8_isolate); | 516 v8::Isolate::Scope isolate_scope(v8_isolate); |
| 533 | 517 |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 603 ->Int32Value(v8_isolate->GetCurrentContext()) | 587 ->Int32Value(v8_isolate->GetCurrentContext()) |
| 604 .FromJust(); | 588 .FromJust(); |
| 605 CHECK_EQ(100002, b); | 589 CHECK_EQ(100002, b); |
| 606 } | 590 } |
| 607 partial_blob.Dispose(); | 591 partial_blob.Dispose(); |
| 608 } | 592 } |
| 609 v8_isolate->Dispose(); | 593 v8_isolate->Dispose(); |
| 610 } | 594 } |
| 611 | 595 |
| 612 TEST(CustomSnapshotDataBlob) { | 596 TEST(CustomSnapshotDataBlob) { |
| 613 DisableTurbofan(); | |
| 614 const char* source1 = "function f() { return 42; }"; | 597 const char* source1 = "function f() { return 42; }"; |
| 615 const char* source2 = | 598 const char* source2 = |
| 616 "function f() { return g() * 2; }" | 599 "function f() { return g() * 2; }" |
| 617 "function g() { return 43; }" | 600 "function g() { return 43; }" |
| 618 "/./.test('a')"; | 601 "/./.test('a')"; |
| 619 | 602 |
| 620 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); | 603 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); |
| 621 v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2); | 604 v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2); |
| 622 | 605 |
| 623 v8::Isolate::CreateParams params1; | 606 v8::Isolate::CreateParams params1; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 657 isolate2->Dispose(); | 640 isolate2->Dispose(); |
| 658 } | 641 } |
| 659 | 642 |
| 660 | 643 |
| 661 static void SerializationFunctionTemplate( | 644 static void SerializationFunctionTemplate( |
| 662 const v8::FunctionCallbackInfo<v8::Value>& args) { | 645 const v8::FunctionCallbackInfo<v8::Value>& args) { |
| 663 args.GetReturnValue().Set(args[0]); | 646 args.GetReturnValue().Set(args[0]); |
| 664 } | 647 } |
| 665 | 648 |
| 666 TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) { | 649 TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) { |
| 667 DisableTurbofan(); | |
| 668 | |
| 669 const char* source1 = | 650 const char* source1 = |
| 670 "var o = {};" | 651 "var o = {};" |
| 671 "(function() {" | 652 "(function() {" |
| 672 " function f1(x) { return f2(x) instanceof Array; }" | 653 " function f1(x) { return f2(x) instanceof Array; }" |
| 673 " function f2(x) { return foo.bar(x); }" | 654 " function f2(x) { return foo.bar(x); }" |
| 674 " o.a = f2.bind(null);" | 655 " o.a = f2.bind(null);" |
| 675 " o.b = 1;" | 656 " o.b = 1;" |
| 676 " o.c = 2;" | 657 " o.c = 2;" |
| 677 " o.d = 3;" | 658 " o.d = 3;" |
| 678 " o.e = 4;" | 659 " o.e = 4;" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 703 v8::Context::Scope c_scope(context); | 684 v8::Context::Scope c_scope(context); |
| 704 v8::Local<v8::Value> result = CompileRun(source2); | 685 v8::Local<v8::Value> result = CompileRun(source2); |
| 705 v8::Maybe<bool> compare = v8_str("42")->Equals( | 686 v8::Maybe<bool> compare = v8_str("42")->Equals( |
| 706 v8::Isolate::GetCurrent()->GetCurrentContext(), result); | 687 v8::Isolate::GetCurrent()->GetCurrentContext(), result); |
| 707 CHECK(compare.FromJust()); | 688 CHECK(compare.FromJust()); |
| 708 } | 689 } |
| 709 isolate->Dispose(); | 690 isolate->Dispose(); |
| 710 } | 691 } |
| 711 | 692 |
| 712 TEST(CustomSnapshotDataBlobWithLocker) { | 693 TEST(CustomSnapshotDataBlobWithLocker) { |
| 713 DisableTurbofan(); | |
| 714 v8::Isolate::CreateParams create_params; | 694 v8::Isolate::CreateParams create_params; |
| 715 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 695 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| 716 v8::Isolate* isolate0 = v8::Isolate::New(create_params); | 696 v8::Isolate* isolate0 = v8::Isolate::New(create_params); |
| 717 { | 697 { |
| 718 v8::Locker locker(isolate0); | 698 v8::Locker locker(isolate0); |
| 719 v8::Isolate::Scope i_scope(isolate0); | 699 v8::Isolate::Scope i_scope(isolate0); |
| 720 v8::HandleScope h_scope(isolate0); | 700 v8::HandleScope h_scope(isolate0); |
| 721 v8::Local<v8::Context> context = v8::Context::New(isolate0); | 701 v8::Local<v8::Context> context = v8::Context::New(isolate0); |
| 722 v8::Context::Scope c_scope(context); | 702 v8::Context::Scope c_scope(context); |
| 723 v8::Maybe<int32_t> result = | 703 v8::Maybe<int32_t> result = |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 741 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 721 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
| 742 delete[] data1.data; // We can dispose of the snapshot blob now. | 722 delete[] data1.data; // We can dispose of the snapshot blob now. |
| 743 v8::Context::Scope c_scope(context); | 723 v8::Context::Scope c_scope(context); |
| 744 v8::Maybe<int32_t> result = CompileRun("f()")->Int32Value(context); | 724 v8::Maybe<int32_t> result = CompileRun("f()")->Int32Value(context); |
| 745 CHECK_EQ(42, result.FromJust()); | 725 CHECK_EQ(42, result.FromJust()); |
| 746 } | 726 } |
| 747 isolate1->Dispose(); | 727 isolate1->Dispose(); |
| 748 } | 728 } |
| 749 | 729 |
| 750 TEST(CustomSnapshotDataBlobStackOverflow) { | 730 TEST(CustomSnapshotDataBlobStackOverflow) { |
| 751 DisableTurbofan(); | |
| 752 const char* source = | 731 const char* source = |
| 753 "var a = [0];" | 732 "var a = [0];" |
| 754 "var b = a;" | 733 "var b = a;" |
| 755 "for (var i = 0; i < 10000; i++) {" | 734 "for (var i = 0; i < 10000; i++) {" |
| 756 " var c = [i];" | 735 " var c = [i];" |
| 757 " b.push(c);" | 736 " b.push(c);" |
| 758 " b.push(c);" | 737 " b.push(c);" |
| 759 " b = c;" | 738 " b = c;" |
| 760 "}"; | 739 "}"; |
| 761 | 740 |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 787 } | 766 } |
| 788 | 767 |
| 789 bool IsCompiled(const char* name) { | 768 bool IsCompiled(const char* name) { |
| 790 return i::Handle<i::JSFunction>::cast( | 769 return i::Handle<i::JSFunction>::cast( |
| 791 v8::Utils::OpenHandle(*CompileRun(name))) | 770 v8::Utils::OpenHandle(*CompileRun(name))) |
| 792 ->shared() | 771 ->shared() |
| 793 ->is_compiled(); | 772 ->is_compiled(); |
| 794 } | 773 } |
| 795 | 774 |
| 796 TEST(SnapshotDataBlobWithWarmup) { | 775 TEST(SnapshotDataBlobWithWarmup) { |
| 797 DisableTurbofan(); | |
| 798 const char* warmup = "Math.abs(1); Math.random = 1;"; | 776 const char* warmup = "Math.abs(1); Math.random = 1;"; |
| 799 | 777 |
| 800 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(); | 778 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(); |
| 801 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); | 779 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); |
| 802 delete[] cold.data; | 780 delete[] cold.data; |
| 803 | 781 |
| 804 v8::Isolate::CreateParams params; | 782 v8::Isolate::CreateParams params; |
| 805 params.snapshot_blob = &warm; | 783 params.snapshot_blob = &warm; |
| 806 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 784 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
| 807 | 785 |
| 808 v8::Isolate* isolate = v8::Isolate::New(params); | 786 v8::Isolate* isolate = v8::Isolate::New(params); |
| 809 { | 787 { |
| 810 v8::Isolate::Scope i_scope(isolate); | 788 v8::Isolate::Scope i_scope(isolate); |
| 811 v8::HandleScope h_scope(isolate); | 789 v8::HandleScope h_scope(isolate); |
| 812 v8::Local<v8::Context> context = v8::Context::New(isolate); | 790 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 813 delete[] warm.data; | 791 delete[] warm.data; |
| 814 v8::Context::Scope c_scope(context); | 792 v8::Context::Scope c_scope(context); |
| 815 // Running the warmup script has effect on whether functions are | 793 // Running the warmup script has effect on whether functions are |
| 816 // pre-compiled, but does not pollute the context. | 794 // pre-compiled, but does not pollute the context. |
| 817 CHECK(IsCompiled("Math.abs")); | 795 CHECK(IsCompiled("Math.abs")); |
| 818 CHECK(!IsCompiled("String.raw")); | 796 CHECK(!IsCompiled("String.raw")); |
| 819 CHECK(CompileRun("Math.random")->IsFunction()); | 797 CHECK(CompileRun("Math.random")->IsFunction()); |
| 820 } | 798 } |
| 821 isolate->Dispose(); | 799 isolate->Dispose(); |
| 822 } | 800 } |
| 823 | 801 |
| 824 TEST(CustomSnapshotDataBlobWithWarmup) { | 802 TEST(CustomSnapshotDataBlobWithWarmup) { |
| 825 DisableTurbofan(); | |
| 826 const char* source = | 803 const char* source = |
| 827 "function f() { return Math.abs(1); }\n" | 804 "function f() { return Math.abs(1); }\n" |
| 828 "function g() { return String.raw(1); }\n" | 805 "function g() { return String.raw(1); }\n" |
| 829 "Object.valueOf(1);" | 806 "Object.valueOf(1);" |
| 830 "var a = 5"; | 807 "var a = 5"; |
| 831 const char* warmup = "a = f()"; | 808 const char* warmup = "a = f()"; |
| 832 | 809 |
| 833 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(source); | 810 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(source); |
| 834 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); | 811 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); |
| 835 delete[] cold.data; | 812 delete[] cold.data; |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 851 CHECK(IsCompiled("Math.abs")); | 828 CHECK(IsCompiled("Math.abs")); |
| 852 CHECK(!IsCompiled("g")); | 829 CHECK(!IsCompiled("g")); |
| 853 CHECK(!IsCompiled("String.raw")); | 830 CHECK(!IsCompiled("String.raw")); |
| 854 CHECK(!IsCompiled("Object.valueOf")); | 831 CHECK(!IsCompiled("Object.valueOf")); |
| 855 CHECK_EQ(5, CompileRun("a")->Int32Value(context).FromJust()); | 832 CHECK_EQ(5, CompileRun("a")->Int32Value(context).FromJust()); |
| 856 } | 833 } |
| 857 isolate->Dispose(); | 834 isolate->Dispose(); |
| 858 } | 835 } |
| 859 | 836 |
| 860 TEST(CustomSnapshotDataBlobImmortalImmovableRoots) { | 837 TEST(CustomSnapshotDataBlobImmortalImmovableRoots) { |
| 861 DisableTurbofan(); | |
| 862 // Flood the startup snapshot with shared function infos. If they are | 838 // Flood the startup snapshot with shared function infos. If they are |
| 863 // serialized before the immortal immovable root, the root will no longer end | 839 // serialized before the immortal immovable root, the root will no longer end |
| 864 // up on the first page. | 840 // up on the first page. |
| 865 Vector<const uint8_t> source = | 841 Vector<const uint8_t> source = |
| 866 ConstructSource(STATIC_CHAR_VECTOR("var a = [];"), | 842 ConstructSource(STATIC_CHAR_VECTOR("var a = [];"), |
| 867 STATIC_CHAR_VECTOR("a.push(function() {return 7});"), | 843 STATIC_CHAR_VECTOR("a.push(function() {return 7});"), |
| 868 STATIC_CHAR_VECTOR("\0"), 10000); | 844 STATIC_CHAR_VECTOR("\0"), 10000); |
| 869 | 845 |
| 870 v8::StartupData data = v8::V8::CreateSnapshotDataBlob( | 846 v8::StartupData data = v8::V8::CreateSnapshotDataBlob( |
| 871 reinterpret_cast<const char*>(source.start())); | 847 reinterpret_cast<const char*>(source.start())); |
| (...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1942 | 1918 |
| 1943 RelocIterator rit3(copy->code(), | 1919 RelocIterator rit3(copy->code(), |
| 1944 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT)); | 1920 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT)); |
| 1945 CHECK(rit3.rinfo()->target_object()->IsHeapNumber()); | 1921 CHECK(rit3.rinfo()->target_object()->IsHeapNumber()); |
| 1946 CHECK_EQ(0.3, HeapNumber::cast(rit3.rinfo()->target_object())->value()); | 1922 CHECK_EQ(0.3, HeapNumber::cast(rit3.rinfo()->target_object())->value()); |
| 1947 | 1923 |
| 1948 delete script_data; | 1924 delete script_data; |
| 1949 } | 1925 } |
| 1950 | 1926 |
| 1951 TEST(SnapshotCreatorMultipleContexts) { | 1927 TEST(SnapshotCreatorMultipleContexts) { |
| 1952 DisableTurbofan(); | |
| 1953 v8::StartupData blob; | 1928 v8::StartupData blob; |
| 1954 { | 1929 { |
| 1955 v8::SnapshotCreator creator; | 1930 v8::SnapshotCreator creator; |
| 1956 v8::Isolate* isolate = creator.GetIsolate(); | 1931 v8::Isolate* isolate = creator.GetIsolate(); |
| 1957 { | 1932 { |
| 1958 v8::HandleScope handle_scope(isolate); | 1933 v8::HandleScope handle_scope(isolate); |
| 1959 v8::Local<v8::Context> context = v8::Context::New(isolate); | 1934 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 1960 v8::Context::Scope context_scope(context); | 1935 v8::Context::Scope context_scope(context); |
| 1961 CompileRun("var f = function() { return 1; }"); | 1936 CompileRun("var f = function() { return 1; }"); |
| 1962 CHECK_EQ(0, creator.AddContext(context)); | 1937 CHECK_EQ(0, creator.AddContext(context)); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2019 args.GetReturnValue().Set(v8_num(1337)); | 1994 args.GetReturnValue().Set(v8_num(1337)); |
| 2020 } | 1995 } |
| 2021 | 1996 |
| 2022 intptr_t original_external_references[] = { | 1997 intptr_t original_external_references[] = { |
| 2023 reinterpret_cast<intptr_t>(SerializedCallback), 0}; | 1998 reinterpret_cast<intptr_t>(SerializedCallback), 0}; |
| 2024 | 1999 |
| 2025 intptr_t replaced_external_references[] = { | 2000 intptr_t replaced_external_references[] = { |
| 2026 reinterpret_cast<intptr_t>(SerializedCallbackReplacement), 0}; | 2001 reinterpret_cast<intptr_t>(SerializedCallbackReplacement), 0}; |
| 2027 | 2002 |
| 2028 TEST(SnapshotCreatorExternalReferences) { | 2003 TEST(SnapshotCreatorExternalReferences) { |
| 2029 DisableTurbofan(); | |
| 2030 v8::StartupData blob; | 2004 v8::StartupData blob; |
| 2031 { | 2005 { |
| 2032 v8::SnapshotCreator creator(original_external_references); | 2006 v8::SnapshotCreator creator(original_external_references); |
| 2033 v8::Isolate* isolate = creator.GetIsolate(); | 2007 v8::Isolate* isolate = creator.GetIsolate(); |
| 2034 { | 2008 { |
| 2035 v8::HandleScope handle_scope(isolate); | 2009 v8::HandleScope handle_scope(isolate); |
| 2036 v8::Local<v8::Context> context = v8::Context::New(isolate); | 2010 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 2037 v8::Context::Scope context_scope(context); | 2011 v8::Context::Scope context_scope(context); |
| 2038 v8::Local<v8::FunctionTemplate> callback = | 2012 v8::Local<v8::FunctionTemplate> callback = |
| 2039 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2013 v8::FunctionTemplate::New(isolate, SerializedCallback); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2079 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); | 2053 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); |
| 2080 v8::Context::Scope context_scope(context); | 2054 v8::Context::Scope context_scope(context); |
| 2081 ExpectInt32("f()", 1337); | 2055 ExpectInt32("f()", 1337); |
| 2082 } | 2056 } |
| 2083 isolate->Dispose(); | 2057 isolate->Dispose(); |
| 2084 } | 2058 } |
| 2085 delete[] blob.data; | 2059 delete[] blob.data; |
| 2086 } | 2060 } |
| 2087 | 2061 |
| 2088 TEST(SnapshotCreatorUnknownExternalReferences) { | 2062 TEST(SnapshotCreatorUnknownExternalReferences) { |
| 2089 DisableTurbofan(); | |
| 2090 v8::SnapshotCreator creator; | 2063 v8::SnapshotCreator creator; |
| 2091 v8::Isolate* isolate = creator.GetIsolate(); | 2064 v8::Isolate* isolate = creator.GetIsolate(); |
| 2092 { | 2065 { |
| 2093 v8::HandleScope handle_scope(isolate); | 2066 v8::HandleScope handle_scope(isolate); |
| 2094 v8::Local<v8::Context> context = v8::Context::New(isolate); | 2067 v8::Local<v8::Context> context = v8::Context::New(isolate); |
| 2095 v8::Context::Scope context_scope(context); | 2068 v8::Context::Scope context_scope(context); |
| 2096 | 2069 |
| 2097 v8::Local<v8::FunctionTemplate> callback = | 2070 v8::Local<v8::FunctionTemplate> callback = |
| 2098 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2071 v8::FunctionTemplate::New(isolate, SerializedCallback); |
| 2099 v8::Local<v8::Value> function = | 2072 v8::Local<v8::Value> function = |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 2125 } | 2098 } |
| 2126 | 2099 |
| 2127 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, | 2100 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, |
| 2128 v8::StartupData payload) { | 2101 v8::StartupData payload) { |
| 2129 InternalFieldData* data = new InternalFieldData{0}; | 2102 InternalFieldData* data = new InternalFieldData{0}; |
| 2130 memcpy(data, payload.data, payload.raw_size); | 2103 memcpy(data, payload.data, payload.raw_size); |
| 2131 holder->SetAlignedPointerInInternalField(index, data); | 2104 holder->SetAlignedPointerInInternalField(index, data); |
| 2132 } | 2105 } |
| 2133 | 2106 |
| 2134 TEST(SnapshotCreatorTemplates) { | 2107 TEST(SnapshotCreatorTemplates) { |
| 2135 DisableTurbofan(); | |
| 2136 v8::StartupData blob; | 2108 v8::StartupData blob; |
| 2137 | 2109 |
| 2138 { | 2110 { |
| 2139 InternalFieldData* a1 = new InternalFieldData{11}; | 2111 InternalFieldData* a1 = new InternalFieldData{11}; |
| 2140 InternalFieldData* b0 = new InternalFieldData{20}; | 2112 InternalFieldData* b0 = new InternalFieldData{20}; |
| 2141 InternalFieldData* c0 = new InternalFieldData{30}; | 2113 InternalFieldData* c0 = new InternalFieldData{30}; |
| 2142 InternalFieldData* c1 = new InternalFieldData{31}; | 2114 InternalFieldData* c1 = new InternalFieldData{31}; |
| 2143 | 2115 |
| 2144 v8::SnapshotCreator creator(original_external_references); | 2116 v8::SnapshotCreator creator(original_external_references); |
| 2145 v8::Isolate* isolate = creator.GetIsolate(); | 2117 v8::Isolate* isolate = creator.GetIsolate(); |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2283 } | 2255 } |
| 2284 delete[] blob.data; | 2256 delete[] blob.data; |
| 2285 } | 2257 } |
| 2286 | 2258 |
| 2287 TEST(SerializationMemoryStats) { | 2259 TEST(SerializationMemoryStats) { |
| 2288 FLAG_profile_deserialization = true; | 2260 FLAG_profile_deserialization = true; |
| 2289 FLAG_always_opt = false; | 2261 FLAG_always_opt = false; |
| 2290 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 2262 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
| 2291 delete[] blob.data; | 2263 delete[] blob.data; |
| 2292 } | 2264 } |
| OLD | NEW |