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() { | 53 void DisableAlwaysOpt() { |
54 const char* flag = "--turbo-filter=\"\""; | 54 // Isolates prepared for serialization do not optimize. The only exception is |
55 FlagList::SetFlagsFromString(flag, StrLength(flag)); | 55 // with the flag --always-opt. |
| 56 FLAG_always_opt = false; |
56 } | 57 } |
57 | 58 |
58 | 59 |
59 // TestIsolate is used for testing isolate serialization. | 60 // TestIsolate is used for testing isolate serialization. |
60 class TestIsolate : public Isolate { | 61 class TestIsolate : public Isolate { |
61 public: | 62 public: |
62 static v8::Isolate* NewInitialized(bool enable_serializer) { | 63 static v8::Isolate* NewInitialized(bool enable_serializer) { |
63 i::Isolate* isolate = new TestIsolate(enable_serializer); | 64 i::Isolate* isolate = new TestIsolate(enable_serializer); |
64 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); | 65 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); |
65 v8::Isolate::Scope isolate_scope(v8_isolate); | 66 v8::Isolate::Scope isolate_scope(v8_isolate); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 #ifdef VERIFY_HEAP | 144 #ifdef VERIFY_HEAP |
144 isolate->heap()->Verify(); | 145 isolate->heap()->Verify(); |
145 #endif | 146 #endif |
146 CHECK(isolate->global_object()->IsJSObject()); | 147 CHECK(isolate->global_object()->IsJSObject()); |
147 CHECK(isolate->native_context()->IsContext()); | 148 CHECK(isolate->native_context()->IsContext()); |
148 CHECK(isolate->heap()->string_table()->IsStringTable()); | 149 CHECK(isolate->heap()->string_table()->IsStringTable()); |
149 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); | 150 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); |
150 } | 151 } |
151 | 152 |
152 UNINITIALIZED_TEST(StartupSerializerOnce) { | 153 UNINITIALIZED_TEST(StartupSerializerOnce) { |
153 // The serialize-deserialize tests only work if the VM is built without | 154 DisableAlwaysOpt(); |
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. | |
156 DisableTurbofan(); | |
157 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 155 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
158 Vector<const byte> blob = Serialize(isolate); | 156 Vector<const byte> blob = Serialize(isolate); |
159 isolate = Deserialize(blob); | 157 isolate = Deserialize(blob); |
160 blob.Dispose(); | 158 blob.Dispose(); |
161 { | 159 { |
162 v8::HandleScope handle_scope(isolate); | 160 v8::HandleScope handle_scope(isolate); |
163 v8::Isolate::Scope isolate_scope(isolate); | 161 v8::Isolate::Scope isolate_scope(isolate); |
164 | 162 |
165 v8::Local<v8::Context> env = v8::Context::New(isolate); | 163 v8::Local<v8::Context> env = v8::Context::New(isolate); |
166 env->Enter(); | 164 env->Enter(); |
167 | 165 |
168 SanityCheck(isolate); | 166 SanityCheck(isolate); |
169 } | 167 } |
170 isolate->Dispose(); | 168 isolate->Dispose(); |
171 } | 169 } |
172 | 170 |
173 UNINITIALIZED_TEST(StartupSerializerTwice) { | 171 UNINITIALIZED_TEST(StartupSerializerTwice) { |
174 DisableTurbofan(); | 172 DisableAlwaysOpt(); |
175 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 173 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
176 Vector<const byte> blob1 = Serialize(isolate); | 174 Vector<const byte> blob1 = Serialize(isolate); |
177 Vector<const byte> blob2 = Serialize(isolate); | 175 Vector<const byte> blob2 = Serialize(isolate); |
178 blob1.Dispose(); | 176 blob1.Dispose(); |
179 isolate = Deserialize(blob2); | 177 isolate = Deserialize(blob2); |
180 blob2.Dispose(); | 178 blob2.Dispose(); |
181 { | 179 { |
182 v8::Isolate::Scope isolate_scope(isolate); | 180 v8::Isolate::Scope isolate_scope(isolate); |
183 v8::HandleScope handle_scope(isolate); | 181 v8::HandleScope handle_scope(isolate); |
184 | 182 |
185 v8::Local<v8::Context> env = v8::Context::New(isolate); | 183 v8::Local<v8::Context> env = v8::Context::New(isolate); |
186 env->Enter(); | 184 env->Enter(); |
187 | 185 |
188 SanityCheck(isolate); | 186 SanityCheck(isolate); |
189 } | 187 } |
190 isolate->Dispose(); | 188 isolate->Dispose(); |
191 } | 189 } |
192 | 190 |
193 UNINITIALIZED_TEST(StartupSerializerOnceRunScript) { | 191 UNINITIALIZED_TEST(StartupSerializerOnceRunScript) { |
194 DisableTurbofan(); | 192 DisableAlwaysOpt(); |
195 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 193 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
196 Vector<const byte> blob = Serialize(isolate); | 194 Vector<const byte> blob = Serialize(isolate); |
197 isolate = Deserialize(blob); | 195 isolate = Deserialize(blob); |
198 blob.Dispose(); | 196 blob.Dispose(); |
199 { | 197 { |
200 v8::Isolate::Scope isolate_scope(isolate); | 198 v8::Isolate::Scope isolate_scope(isolate); |
201 v8::HandleScope handle_scope(isolate); | 199 v8::HandleScope handle_scope(isolate); |
202 | 200 |
203 | 201 |
204 v8::Local<v8::Context> env = v8::Context::New(isolate); | 202 v8::Local<v8::Context> env = v8::Context::New(isolate); |
205 env->Enter(); | 203 env->Enter(); |
206 | 204 |
207 const char* c_source = "\"1234\".length"; | 205 const char* c_source = "\"1234\".length"; |
208 v8::Local<v8::Script> script = v8_compile(c_source); | 206 v8::Local<v8::Script> script = v8_compile(c_source); |
209 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) | 207 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
210 .ToLocalChecked() | 208 .ToLocalChecked() |
211 ->Int32Value(isolate->GetCurrentContext()); | 209 ->Int32Value(isolate->GetCurrentContext()); |
212 CHECK_EQ(4, result.FromJust()); | 210 CHECK_EQ(4, result.FromJust()); |
213 } | 211 } |
214 isolate->Dispose(); | 212 isolate->Dispose(); |
215 } | 213 } |
216 | 214 |
217 UNINITIALIZED_TEST(StartupSerializerTwiceRunScript) { | 215 UNINITIALIZED_TEST(StartupSerializerTwiceRunScript) { |
218 DisableTurbofan(); | 216 DisableAlwaysOpt(); |
219 v8::Isolate* isolate = TestIsolate::NewInitialized(true); | 217 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
220 Vector<const byte> blob1 = Serialize(isolate); | 218 Vector<const byte> blob1 = Serialize(isolate); |
221 Vector<const byte> blob2 = Serialize(isolate); | 219 Vector<const byte> blob2 = Serialize(isolate); |
222 blob1.Dispose(); | 220 blob1.Dispose(); |
223 isolate = Deserialize(blob2); | 221 isolate = Deserialize(blob2); |
224 blob2.Dispose(); | 222 blob2.Dispose(); |
225 { | 223 { |
226 v8::Isolate::Scope isolate_scope(isolate); | 224 v8::Isolate::Scope isolate_scope(isolate); |
227 v8::HandleScope handle_scope(isolate); | 225 v8::HandleScope handle_scope(isolate); |
228 | 226 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
296 SnapshotData partial_snapshot(&partial_serializer); | 294 SnapshotData partial_snapshot(&partial_serializer); |
297 | 295 |
298 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 296 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
299 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 297 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
300 } | 298 } |
301 v8_isolate->Exit(); | 299 v8_isolate->Exit(); |
302 v8_isolate->Dispose(); | 300 v8_isolate->Dispose(); |
303 } | 301 } |
304 | 302 |
305 UNINITIALIZED_TEST(PartialSerializerObject) { | 303 UNINITIALIZED_TEST(PartialSerializerObject) { |
306 DisableTurbofan(); | 304 DisableAlwaysOpt(); |
307 Vector<const byte> startup_blob; | 305 Vector<const byte> startup_blob; |
308 Vector<const byte> partial_blob; | 306 Vector<const byte> partial_blob; |
309 PartiallySerializeObject(&startup_blob, &partial_blob); | 307 PartiallySerializeObject(&startup_blob, &partial_blob); |
310 | 308 |
311 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 309 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
312 startup_blob.Dispose(); | 310 startup_blob.Dispose(); |
313 CHECK(v8_isolate); | 311 CHECK(v8_isolate); |
314 { | 312 { |
315 v8::Isolate::Scope isolate_scope(v8_isolate); | 313 v8::Isolate::Scope isolate_scope(v8_isolate); |
316 | 314 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 SnapshotData startup_snapshot(&startup_serializer); | 392 SnapshotData startup_snapshot(&startup_serializer); |
395 SnapshotData partial_snapshot(&partial_serializer); | 393 SnapshotData partial_snapshot(&partial_serializer); |
396 | 394 |
397 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 395 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
398 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 396 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
399 } | 397 } |
400 v8_isolate->Dispose(); | 398 v8_isolate->Dispose(); |
401 } | 399 } |
402 | 400 |
403 UNINITIALIZED_TEST(PartialSerializerContext) { | 401 UNINITIALIZED_TEST(PartialSerializerContext) { |
404 DisableTurbofan(); | 402 DisableAlwaysOpt(); |
405 Vector<const byte> startup_blob; | 403 Vector<const byte> startup_blob; |
406 Vector<const byte> partial_blob; | 404 Vector<const byte> partial_blob; |
407 PartiallySerializeContext(&startup_blob, &partial_blob); | 405 PartiallySerializeContext(&startup_blob, &partial_blob); |
408 | 406 |
409 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 407 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
410 CHECK(v8_isolate); | 408 CHECK(v8_isolate); |
411 startup_blob.Dispose(); | 409 startup_blob.Dispose(); |
412 { | 410 { |
413 v8::Isolate::Scope isolate_scope(v8_isolate); | 411 v8::Isolate::Scope isolate_scope(v8_isolate); |
414 | 412 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 SnapshotData startup_snapshot(&startup_serializer); | 511 SnapshotData startup_snapshot(&startup_serializer); |
514 SnapshotData partial_snapshot(&partial_serializer); | 512 SnapshotData partial_snapshot(&partial_serializer); |
515 | 513 |
516 *partial_blob_out = WritePayload(partial_snapshot.RawData()); | 514 *partial_blob_out = WritePayload(partial_snapshot.RawData()); |
517 *startup_blob_out = WritePayload(startup_snapshot.RawData()); | 515 *startup_blob_out = WritePayload(startup_snapshot.RawData()); |
518 } | 516 } |
519 v8_isolate->Dispose(); | 517 v8_isolate->Dispose(); |
520 } | 518 } |
521 | 519 |
522 UNINITIALIZED_TEST(PartialSerializerCustomContext) { | 520 UNINITIALIZED_TEST(PartialSerializerCustomContext) { |
523 DisableTurbofan(); | 521 DisableAlwaysOpt(); |
524 Vector<const byte> startup_blob; | 522 Vector<const byte> startup_blob; |
525 Vector<const byte> partial_blob; | 523 Vector<const byte> partial_blob; |
526 PartiallySerializeCustomContext(&startup_blob, &partial_blob); | 524 PartiallySerializeCustomContext(&startup_blob, &partial_blob); |
527 | 525 |
528 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); | 526 v8::Isolate* v8_isolate = InitializeFromBlob(startup_blob); |
529 CHECK(v8_isolate); | 527 CHECK(v8_isolate); |
530 startup_blob.Dispose(); | 528 startup_blob.Dispose(); |
531 { | 529 { |
532 v8::Isolate::Scope isolate_scope(v8_isolate); | 530 v8::Isolate::Scope isolate_scope(v8_isolate); |
533 | 531 |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 ->Int32Value(v8_isolate->GetCurrentContext()) | 601 ->Int32Value(v8_isolate->GetCurrentContext()) |
604 .FromJust(); | 602 .FromJust(); |
605 CHECK_EQ(100002, b); | 603 CHECK_EQ(100002, b); |
606 } | 604 } |
607 partial_blob.Dispose(); | 605 partial_blob.Dispose(); |
608 } | 606 } |
609 v8_isolate->Dispose(); | 607 v8_isolate->Dispose(); |
610 } | 608 } |
611 | 609 |
612 TEST(CustomSnapshotDataBlob1) { | 610 TEST(CustomSnapshotDataBlob1) { |
613 DisableTurbofan(); | 611 DisableAlwaysOpt(); |
614 const char* source1 = "function f() { return 42; }"; | 612 const char* source1 = "function f() { return 42; }"; |
615 | 613 |
616 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); | 614 v8::StartupData data1 = v8::V8::CreateSnapshotDataBlob(source1); |
617 | 615 |
618 v8::Isolate::CreateParams params1; | 616 v8::Isolate::CreateParams params1; |
619 params1.snapshot_blob = &data1; | 617 params1.snapshot_blob = &data1; |
620 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); | 618 params1.array_buffer_allocator = CcTest::array_buffer_allocator(); |
621 | 619 |
622 v8::Isolate* isolate1 = v8::Isolate::New(params1); | 620 v8::Isolate* isolate1 = v8::Isolate::New(params1); |
623 { | 621 { |
624 v8::Isolate::Scope i_scope(isolate1); | 622 v8::Isolate::Scope i_scope(isolate1); |
625 v8::HandleScope h_scope(isolate1); | 623 v8::HandleScope h_scope(isolate1); |
626 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 624 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
627 delete[] data1.data; // We can dispose of the snapshot blob now. | 625 delete[] data1.data; // We can dispose of the snapshot blob now. |
628 v8::Context::Scope c_scope(context); | 626 v8::Context::Scope c_scope(context); |
629 v8::Maybe<int32_t> result = | 627 v8::Maybe<int32_t> result = |
630 CompileRun("f()")->Int32Value(isolate1->GetCurrentContext()); | 628 CompileRun("f()")->Int32Value(isolate1->GetCurrentContext()); |
631 CHECK_EQ(42, result.FromJust()); | 629 CHECK_EQ(42, result.FromJust()); |
632 CHECK(CompileRun("this.g")->IsUndefined()); | 630 CHECK(CompileRun("this.g")->IsUndefined()); |
633 } | 631 } |
634 isolate1->Dispose(); | 632 isolate1->Dispose(); |
635 } | 633 } |
636 | 634 |
637 TEST(CustomSnapshotDataBlob2) { | 635 TEST(CustomSnapshotDataBlob2) { |
638 DisableTurbofan(); | 636 DisableAlwaysOpt(); |
639 const char* source2 = | 637 const char* source2 = |
640 "function f() { return g() * 2; }" | 638 "function f() { return g() * 2; }" |
641 "function g() { return 43; }" | 639 "function g() { return 43; }" |
642 "/./.test('a')"; | 640 "/./.test('a')"; |
643 | 641 |
644 v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2); | 642 v8::StartupData data2 = v8::V8::CreateSnapshotDataBlob(source2); |
645 | 643 |
646 v8::Isolate::CreateParams params2; | 644 v8::Isolate::CreateParams params2; |
647 params2.snapshot_blob = &data2; | 645 params2.snapshot_blob = &data2; |
648 params2.array_buffer_allocator = CcTest::array_buffer_allocator(); | 646 params2.array_buffer_allocator = CcTest::array_buffer_allocator(); |
(...skipping 12 matching lines...) Expand all Loading... |
661 } | 659 } |
662 isolate2->Dispose(); | 660 isolate2->Dispose(); |
663 } | 661 } |
664 | 662 |
665 static void SerializationFunctionTemplate( | 663 static void SerializationFunctionTemplate( |
666 const v8::FunctionCallbackInfo<v8::Value>& args) { | 664 const v8::FunctionCallbackInfo<v8::Value>& args) { |
667 args.GetReturnValue().Set(args[0]); | 665 args.GetReturnValue().Set(args[0]); |
668 } | 666 } |
669 | 667 |
670 TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) { | 668 TEST(CustomSnapshotDataBlobOutdatedContextWithOverflow) { |
671 DisableTurbofan(); | 669 DisableAlwaysOpt(); |
672 | |
673 const char* source1 = | 670 const char* source1 = |
674 "var o = {};" | 671 "var o = {};" |
675 "(function() {" | 672 "(function() {" |
676 " function f1(x) { return f2(x) instanceof Array; }" | 673 " function f1(x) { return f2(x) instanceof Array; }" |
677 " function f2(x) { return foo.bar(x); }" | 674 " function f2(x) { return foo.bar(x); }" |
678 " o.a = f2.bind(null);" | 675 " o.a = f2.bind(null);" |
679 " o.b = 1;" | 676 " o.b = 1;" |
680 " o.c = 2;" | 677 " o.c = 2;" |
681 " o.d = 3;" | 678 " o.d = 3;" |
682 " o.e = 4;" | 679 " o.e = 4;" |
(...skipping 24 matching lines...) Expand all Loading... |
707 v8::Context::Scope c_scope(context); | 704 v8::Context::Scope c_scope(context); |
708 v8::Local<v8::Value> result = CompileRun(source2); | 705 v8::Local<v8::Value> result = CompileRun(source2); |
709 v8::Maybe<bool> compare = v8_str("42")->Equals( | 706 v8::Maybe<bool> compare = v8_str("42")->Equals( |
710 v8::Isolate::GetCurrent()->GetCurrentContext(), result); | 707 v8::Isolate::GetCurrent()->GetCurrentContext(), result); |
711 CHECK(compare.FromJust()); | 708 CHECK(compare.FromJust()); |
712 } | 709 } |
713 isolate->Dispose(); | 710 isolate->Dispose(); |
714 } | 711 } |
715 | 712 |
716 TEST(CustomSnapshotDataBlobWithLocker) { | 713 TEST(CustomSnapshotDataBlobWithLocker) { |
717 DisableTurbofan(); | 714 DisableAlwaysOpt(); |
718 v8::Isolate::CreateParams create_params; | 715 v8::Isolate::CreateParams create_params; |
719 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 716 create_params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
720 v8::Isolate* isolate0 = v8::Isolate::New(create_params); | 717 v8::Isolate* isolate0 = v8::Isolate::New(create_params); |
721 { | 718 { |
722 v8::Locker locker(isolate0); | 719 v8::Locker locker(isolate0); |
723 v8::Isolate::Scope i_scope(isolate0); | 720 v8::Isolate::Scope i_scope(isolate0); |
724 v8::HandleScope h_scope(isolate0); | 721 v8::HandleScope h_scope(isolate0); |
725 v8::Local<v8::Context> context = v8::Context::New(isolate0); | 722 v8::Local<v8::Context> context = v8::Context::New(isolate0); |
726 v8::Context::Scope c_scope(context); | 723 v8::Context::Scope c_scope(context); |
727 v8::Maybe<int32_t> result = | 724 v8::Maybe<int32_t> result = |
(...skipping 17 matching lines...) Expand all Loading... |
745 v8::Local<v8::Context> context = v8::Context::New(isolate1); | 742 v8::Local<v8::Context> context = v8::Context::New(isolate1); |
746 delete[] data1.data; // We can dispose of the snapshot blob now. | 743 delete[] data1.data; // We can dispose of the snapshot blob now. |
747 v8::Context::Scope c_scope(context); | 744 v8::Context::Scope c_scope(context); |
748 v8::Maybe<int32_t> result = CompileRun("f()")->Int32Value(context); | 745 v8::Maybe<int32_t> result = CompileRun("f()")->Int32Value(context); |
749 CHECK_EQ(42, result.FromJust()); | 746 CHECK_EQ(42, result.FromJust()); |
750 } | 747 } |
751 isolate1->Dispose(); | 748 isolate1->Dispose(); |
752 } | 749 } |
753 | 750 |
754 TEST(CustomSnapshotDataBlobStackOverflow) { | 751 TEST(CustomSnapshotDataBlobStackOverflow) { |
755 DisableTurbofan(); | 752 DisableAlwaysOpt(); |
756 const char* source = | 753 const char* source = |
757 "var a = [0];" | 754 "var a = [0];" |
758 "var b = a;" | 755 "var b = a;" |
759 "for (var i = 0; i < 10000; i++) {" | 756 "for (var i = 0; i < 10000; i++) {" |
760 " var c = [i];" | 757 " var c = [i];" |
761 " b.push(c);" | 758 " b.push(c);" |
762 " b.push(c);" | 759 " b.push(c);" |
763 " b = c;" | 760 " b = c;" |
764 "}"; | 761 "}"; |
765 | 762 |
(...skipping 25 matching lines...) Expand all Loading... |
791 } | 788 } |
792 | 789 |
793 bool IsCompiled(const char* name) { | 790 bool IsCompiled(const char* name) { |
794 return i::Handle<i::JSFunction>::cast( | 791 return i::Handle<i::JSFunction>::cast( |
795 v8::Utils::OpenHandle(*CompileRun(name))) | 792 v8::Utils::OpenHandle(*CompileRun(name))) |
796 ->shared() | 793 ->shared() |
797 ->is_compiled(); | 794 ->is_compiled(); |
798 } | 795 } |
799 | 796 |
800 TEST(SnapshotDataBlobWithWarmup) { | 797 TEST(SnapshotDataBlobWithWarmup) { |
801 DisableTurbofan(); | 798 DisableAlwaysOpt(); |
802 const char* warmup = "Math.abs(1); Math.random = 1;"; | 799 const char* warmup = "Math.abs(1); Math.random = 1;"; |
803 | 800 |
804 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(); | 801 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(); |
805 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); | 802 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); |
806 delete[] cold.data; | 803 delete[] cold.data; |
807 | 804 |
808 v8::Isolate::CreateParams params; | 805 v8::Isolate::CreateParams params; |
809 params.snapshot_blob = &warm; | 806 params.snapshot_blob = &warm; |
810 params.array_buffer_allocator = CcTest::array_buffer_allocator(); | 807 params.array_buffer_allocator = CcTest::array_buffer_allocator(); |
811 | 808 |
812 v8::Isolate* isolate = v8::Isolate::New(params); | 809 v8::Isolate* isolate = v8::Isolate::New(params); |
813 { | 810 { |
814 v8::Isolate::Scope i_scope(isolate); | 811 v8::Isolate::Scope i_scope(isolate); |
815 v8::HandleScope h_scope(isolate); | 812 v8::HandleScope h_scope(isolate); |
816 v8::Local<v8::Context> context = v8::Context::New(isolate); | 813 v8::Local<v8::Context> context = v8::Context::New(isolate); |
817 delete[] warm.data; | 814 delete[] warm.data; |
818 v8::Context::Scope c_scope(context); | 815 v8::Context::Scope c_scope(context); |
819 // Running the warmup script has effect on whether functions are | 816 // Running the warmup script has effect on whether functions are |
820 // pre-compiled, but does not pollute the context. | 817 // pre-compiled, but does not pollute the context. |
821 CHECK(IsCompiled("Math.abs")); | 818 CHECK(IsCompiled("Math.abs")); |
822 CHECK(!IsCompiled("String.raw")); | 819 CHECK(!IsCompiled("String.raw")); |
823 CHECK(CompileRun("Math.random")->IsFunction()); | 820 CHECK(CompileRun("Math.random")->IsFunction()); |
824 } | 821 } |
825 isolate->Dispose(); | 822 isolate->Dispose(); |
826 } | 823 } |
827 | 824 |
828 TEST(CustomSnapshotDataBlobWithWarmup) { | 825 TEST(CustomSnapshotDataBlobWithWarmup) { |
829 DisableTurbofan(); | 826 DisableAlwaysOpt(); |
830 const char* source = | 827 const char* source = |
831 "function f() { return Math.abs(1); }\n" | 828 "function f() { return Math.abs(1); }\n" |
832 "function g() { return String.raw(1); }\n" | 829 "function g() { return String.raw(1); }\n" |
833 "Object.valueOf(1);" | 830 "Object.valueOf(1);" |
834 "var a = 5"; | 831 "var a = 5"; |
835 const char* warmup = "a = f()"; | 832 const char* warmup = "a = f()"; |
836 | 833 |
837 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(source); | 834 v8::StartupData cold = v8::V8::CreateSnapshotDataBlob(source); |
838 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); | 835 v8::StartupData warm = v8::V8::WarmUpSnapshotDataBlob(cold, warmup); |
839 delete[] cold.data; | 836 delete[] cold.data; |
(...skipping 15 matching lines...) Expand all Loading... |
855 CHECK(IsCompiled("Math.abs")); | 852 CHECK(IsCompiled("Math.abs")); |
856 CHECK(!IsCompiled("g")); | 853 CHECK(!IsCompiled("g")); |
857 CHECK(!IsCompiled("String.raw")); | 854 CHECK(!IsCompiled("String.raw")); |
858 CHECK(!IsCompiled("Object.valueOf")); | 855 CHECK(!IsCompiled("Object.valueOf")); |
859 CHECK_EQ(5, CompileRun("a")->Int32Value(context).FromJust()); | 856 CHECK_EQ(5, CompileRun("a")->Int32Value(context).FromJust()); |
860 } | 857 } |
861 isolate->Dispose(); | 858 isolate->Dispose(); |
862 } | 859 } |
863 | 860 |
864 TEST(CustomSnapshotDataBlobImmortalImmovableRoots) { | 861 TEST(CustomSnapshotDataBlobImmortalImmovableRoots) { |
865 DisableTurbofan(); | 862 DisableAlwaysOpt(); |
866 // Flood the startup snapshot with shared function infos. If they are | 863 // Flood the startup snapshot with shared function infos. If they are |
867 // serialized before the immortal immovable root, the root will no longer end | 864 // serialized before the immortal immovable root, the root will no longer end |
868 // up on the first page. | 865 // up on the first page. |
869 Vector<const uint8_t> source = | 866 Vector<const uint8_t> source = |
870 ConstructSource(STATIC_CHAR_VECTOR("var a = [];"), | 867 ConstructSource(STATIC_CHAR_VECTOR("var a = [];"), |
871 STATIC_CHAR_VECTOR("a.push(function() {return 7});"), | 868 STATIC_CHAR_VECTOR("a.push(function() {return 7});"), |
872 STATIC_CHAR_VECTOR("\0"), 10000); | 869 STATIC_CHAR_VECTOR("\0"), 10000); |
873 | 870 |
874 v8::StartupData data = v8::V8::CreateSnapshotDataBlob( | 871 v8::StartupData data = v8::V8::CreateSnapshotDataBlob( |
875 reinterpret_cast<const char*>(source.start())); | 872 reinterpret_cast<const char*>(source.start())); |
(...skipping 1070 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1946 | 1943 |
1947 RelocIterator rit3(copy->code(), | 1944 RelocIterator rit3(copy->code(), |
1948 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT)); | 1945 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT)); |
1949 CHECK(rit3.rinfo()->target_object()->IsHeapNumber()); | 1946 CHECK(rit3.rinfo()->target_object()->IsHeapNumber()); |
1950 CHECK_EQ(0.3, HeapNumber::cast(rit3.rinfo()->target_object())->value()); | 1947 CHECK_EQ(0.3, HeapNumber::cast(rit3.rinfo()->target_object())->value()); |
1951 | 1948 |
1952 delete script_data; | 1949 delete script_data; |
1953 } | 1950 } |
1954 | 1951 |
1955 TEST(SnapshotCreatorMultipleContexts) { | 1952 TEST(SnapshotCreatorMultipleContexts) { |
1956 DisableTurbofan(); | 1953 DisableAlwaysOpt(); |
1957 v8::StartupData blob; | 1954 v8::StartupData blob; |
1958 { | 1955 { |
1959 v8::SnapshotCreator creator; | 1956 v8::SnapshotCreator creator; |
1960 v8::Isolate* isolate = creator.GetIsolate(); | 1957 v8::Isolate* isolate = creator.GetIsolate(); |
1961 { | 1958 { |
1962 v8::HandleScope handle_scope(isolate); | 1959 v8::HandleScope handle_scope(isolate); |
1963 v8::Local<v8::Context> context = v8::Context::New(isolate); | 1960 v8::Local<v8::Context> context = v8::Context::New(isolate); |
1964 v8::Context::Scope context_scope(context); | 1961 v8::Context::Scope context_scope(context); |
1965 CompileRun("var f = function() { return 1; }"); | 1962 CompileRun("var f = function() { return 1; }"); |
1966 CHECK_EQ(0, creator.AddContext(context)); | 1963 CHECK_EQ(0, creator.AddContext(context)); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2023 args.GetReturnValue().Set(v8_num(1337)); | 2020 args.GetReturnValue().Set(v8_num(1337)); |
2024 } | 2021 } |
2025 | 2022 |
2026 intptr_t original_external_references[] = { | 2023 intptr_t original_external_references[] = { |
2027 reinterpret_cast<intptr_t>(SerializedCallback), 0}; | 2024 reinterpret_cast<intptr_t>(SerializedCallback), 0}; |
2028 | 2025 |
2029 intptr_t replaced_external_references[] = { | 2026 intptr_t replaced_external_references[] = { |
2030 reinterpret_cast<intptr_t>(SerializedCallbackReplacement), 0}; | 2027 reinterpret_cast<intptr_t>(SerializedCallbackReplacement), 0}; |
2031 | 2028 |
2032 TEST(SnapshotCreatorExternalReferences) { | 2029 TEST(SnapshotCreatorExternalReferences) { |
2033 DisableTurbofan(); | 2030 DisableAlwaysOpt(); |
2034 v8::StartupData blob; | 2031 v8::StartupData blob; |
2035 { | 2032 { |
2036 v8::SnapshotCreator creator(original_external_references); | 2033 v8::SnapshotCreator creator(original_external_references); |
2037 v8::Isolate* isolate = creator.GetIsolate(); | 2034 v8::Isolate* isolate = creator.GetIsolate(); |
2038 { | 2035 { |
2039 v8::HandleScope handle_scope(isolate); | 2036 v8::HandleScope handle_scope(isolate); |
2040 v8::Local<v8::Context> context = v8::Context::New(isolate); | 2037 v8::Local<v8::Context> context = v8::Context::New(isolate); |
2041 v8::Context::Scope context_scope(context); | 2038 v8::Context::Scope context_scope(context); |
2042 v8::Local<v8::FunctionTemplate> callback = | 2039 v8::Local<v8::FunctionTemplate> callback = |
2043 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2040 v8::FunctionTemplate::New(isolate, SerializedCallback); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2083 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); | 2080 v8::Context::FromSnapshot(isolate, 0).ToLocalChecked(); |
2084 v8::Context::Scope context_scope(context); | 2081 v8::Context::Scope context_scope(context); |
2085 ExpectInt32("f()", 1337); | 2082 ExpectInt32("f()", 1337); |
2086 } | 2083 } |
2087 isolate->Dispose(); | 2084 isolate->Dispose(); |
2088 } | 2085 } |
2089 delete[] blob.data; | 2086 delete[] blob.data; |
2090 } | 2087 } |
2091 | 2088 |
2092 TEST(SnapshotCreatorUnknownExternalReferences) { | 2089 TEST(SnapshotCreatorUnknownExternalReferences) { |
2093 DisableTurbofan(); | 2090 DisableAlwaysOpt(); |
2094 v8::SnapshotCreator creator; | 2091 v8::SnapshotCreator creator; |
2095 v8::Isolate* isolate = creator.GetIsolate(); | 2092 v8::Isolate* isolate = creator.GetIsolate(); |
2096 { | 2093 { |
2097 v8::HandleScope handle_scope(isolate); | 2094 v8::HandleScope handle_scope(isolate); |
2098 v8::Local<v8::Context> context = v8::Context::New(isolate); | 2095 v8::Local<v8::Context> context = v8::Context::New(isolate); |
2099 v8::Context::Scope context_scope(context); | 2096 v8::Context::Scope context_scope(context); |
2100 | 2097 |
2101 v8::Local<v8::FunctionTemplate> callback = | 2098 v8::Local<v8::FunctionTemplate> callback = |
2102 v8::FunctionTemplate::New(isolate, SerializedCallback); | 2099 v8::FunctionTemplate::New(isolate, SerializedCallback); |
2103 v8::Local<v8::Value> function = | 2100 v8::Local<v8::Value> function = |
(...skipping 25 matching lines...) Expand all Loading... |
2129 } | 2126 } |
2130 | 2127 |
2131 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, | 2128 void DeserializeInternalFields(v8::Local<v8::Object> holder, int index, |
2132 v8::StartupData payload) { | 2129 v8::StartupData payload) { |
2133 InternalFieldData* data = new InternalFieldData{0}; | 2130 InternalFieldData* data = new InternalFieldData{0}; |
2134 memcpy(data, payload.data, payload.raw_size); | 2131 memcpy(data, payload.data, payload.raw_size); |
2135 holder->SetAlignedPointerInInternalField(index, data); | 2132 holder->SetAlignedPointerInInternalField(index, data); |
2136 } | 2133 } |
2137 | 2134 |
2138 TEST(SnapshotCreatorTemplates) { | 2135 TEST(SnapshotCreatorTemplates) { |
2139 DisableTurbofan(); | 2136 DisableAlwaysOpt(); |
2140 v8::StartupData blob; | 2137 v8::StartupData blob; |
2141 | 2138 |
2142 { | 2139 { |
2143 InternalFieldData* a1 = new InternalFieldData{11}; | 2140 InternalFieldData* a1 = new InternalFieldData{11}; |
2144 InternalFieldData* b0 = new InternalFieldData{20}; | 2141 InternalFieldData* b0 = new InternalFieldData{20}; |
2145 InternalFieldData* c0 = new InternalFieldData{30}; | 2142 InternalFieldData* c0 = new InternalFieldData{30}; |
2146 InternalFieldData* c1 = new InternalFieldData{31}; | 2143 InternalFieldData* c1 = new InternalFieldData{31}; |
2147 | 2144 |
2148 v8::SnapshotCreator creator(original_external_references); | 2145 v8::SnapshotCreator creator(original_external_references); |
2149 v8::Isolate* isolate = creator.GetIsolate(); | 2146 v8::Isolate* isolate = creator.GetIsolate(); |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2287 } | 2284 } |
2288 delete[] blob.data; | 2285 delete[] blob.data; |
2289 } | 2286 } |
2290 | 2287 |
2291 TEST(SerializationMemoryStats) { | 2288 TEST(SerializationMemoryStats) { |
2292 FLAG_profile_deserialization = true; | 2289 FLAG_profile_deserialization = true; |
2293 FLAG_always_opt = false; | 2290 FLAG_always_opt = false; |
2294 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 2291 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
2295 delete[] blob.data; | 2292 delete[] blob.data; |
2296 } | 2293 } |
OLD | NEW |