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 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 v8::HandleScope scope(v8_isolate); | 190 v8::HandleScope scope(v8_isolate); |
191 #ifdef VERIFY_HEAP | 191 #ifdef VERIFY_HEAP |
192 isolate->heap()->Verify(); | 192 isolate->heap()->Verify(); |
193 #endif | 193 #endif |
194 CHECK(isolate->global_object()->IsJSObject()); | 194 CHECK(isolate->global_object()->IsJSObject()); |
195 CHECK(isolate->native_context()->IsContext()); | 195 CHECK(isolate->native_context()->IsContext()); |
196 CHECK(isolate->heap()->string_table()->IsStringTable()); | 196 CHECK(isolate->heap()->string_table()->IsStringTable()); |
197 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); | 197 isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty")); |
198 } | 198 } |
199 | 199 |
200 | 200 UNINITIALIZED_TEST(Deserialize) { |
201 UNINITIALIZED_DEPENDENT_TEST(Deserialize, Serialize) { | |
202 // The serialize-deserialize tests only work if the VM is built without | 201 // The serialize-deserialize tests only work if the VM is built without |
203 // serialization. That doesn't matter. We don't need to be able to | 202 // serialization. That doesn't matter. We don't need to be able to |
204 // serialize a snapshot in a VM that is booted from a snapshot. | 203 // serialize a snapshot in a VM that is booted from a snapshot. |
205 DisableTurbofan(); | 204 DisableTurbofan(); |
206 if (DefaultSnapshotAvailable()) return; | 205 if (DefaultSnapshotAvailable()) return; |
207 v8::Isolate* isolate = Deserialize(); | 206 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 207 Serialize(isolate); |
| 208 isolate = Deserialize(); |
208 { | 209 { |
209 v8::HandleScope handle_scope(isolate); | 210 v8::HandleScope handle_scope(isolate); |
210 v8::Isolate::Scope isolate_scope(isolate); | 211 v8::Isolate::Scope isolate_scope(isolate); |
211 | 212 |
212 v8::Local<v8::Context> env = v8::Context::New(isolate); | 213 v8::Local<v8::Context> env = v8::Context::New(isolate); |
213 env->Enter(); | 214 env->Enter(); |
214 | 215 |
215 SanityCheck(isolate); | 216 SanityCheck(isolate); |
216 } | 217 } |
217 isolate->Dispose(); | 218 isolate->Dispose(); |
218 } | 219 } |
219 | 220 |
220 | 221 UNINITIALIZED_TEST(DeserializeFromSecondSerialization) { |
221 UNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerialization, | |
222 SerializeTwice) { | |
223 DisableTurbofan(); | 222 DisableTurbofan(); |
224 if (DefaultSnapshotAvailable()) return; | 223 if (DefaultSnapshotAvailable()) return; |
225 v8::Isolate* isolate = Deserialize(); | 224 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 225 Serialize(isolate); |
| 226 Serialize(isolate); |
| 227 isolate = Deserialize(); |
226 { | 228 { |
227 v8::Isolate::Scope isolate_scope(isolate); | 229 v8::Isolate::Scope isolate_scope(isolate); |
228 v8::HandleScope handle_scope(isolate); | 230 v8::HandleScope handle_scope(isolate); |
229 | 231 |
230 v8::Local<v8::Context> env = v8::Context::New(isolate); | 232 v8::Local<v8::Context> env = v8::Context::New(isolate); |
231 env->Enter(); | 233 env->Enter(); |
232 | 234 |
233 SanityCheck(isolate); | 235 SanityCheck(isolate); |
234 } | 236 } |
235 isolate->Dispose(); | 237 isolate->Dispose(); |
236 } | 238 } |
237 | 239 |
238 | 240 UNINITIALIZED_TEST(DeserializeAndRunScript2) { |
239 UNINITIALIZED_DEPENDENT_TEST(DeserializeAndRunScript2, Serialize) { | |
240 DisableTurbofan(); | 241 DisableTurbofan(); |
241 if (DefaultSnapshotAvailable()) return; | 242 if (DefaultSnapshotAvailable()) return; |
242 v8::Isolate* isolate = Deserialize(); | 243 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 244 Serialize(isolate); |
| 245 isolate = Deserialize(); |
243 { | 246 { |
244 v8::Isolate::Scope isolate_scope(isolate); | 247 v8::Isolate::Scope isolate_scope(isolate); |
245 v8::HandleScope handle_scope(isolate); | 248 v8::HandleScope handle_scope(isolate); |
246 | 249 |
247 | 250 |
248 v8::Local<v8::Context> env = v8::Context::New(isolate); | 251 v8::Local<v8::Context> env = v8::Context::New(isolate); |
249 env->Enter(); | 252 env->Enter(); |
250 | 253 |
251 const char* c_source = "\"1234\".length"; | 254 const char* c_source = "\"1234\".length"; |
252 v8::Local<v8::Script> script = v8_compile(c_source); | 255 v8::Local<v8::Script> script = v8_compile(c_source); |
253 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) | 256 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
254 .ToLocalChecked() | 257 .ToLocalChecked() |
255 ->Int32Value(isolate->GetCurrentContext()); | 258 ->Int32Value(isolate->GetCurrentContext()); |
256 CHECK_EQ(4, result.FromJust()); | 259 CHECK_EQ(4, result.FromJust()); |
257 } | 260 } |
258 isolate->Dispose(); | 261 isolate->Dispose(); |
259 } | 262 } |
260 | 263 |
261 | 264 UNINITIALIZED_TEST(DeserializeFromSecondSerializationAndRunScript2) { |
262 UNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, | |
263 SerializeTwice) { | |
264 DisableTurbofan(); | 265 DisableTurbofan(); |
265 if (DefaultSnapshotAvailable()) return; | 266 if (DefaultSnapshotAvailable()) return; |
266 v8::Isolate* isolate = Deserialize(); | 267 v8::Isolate* isolate = TestIsolate::NewInitialized(true); |
| 268 Serialize(isolate); |
| 269 Serialize(isolate); |
| 270 isolate = Deserialize(); |
267 { | 271 { |
268 v8::Isolate::Scope isolate_scope(isolate); | 272 v8::Isolate::Scope isolate_scope(isolate); |
269 v8::HandleScope handle_scope(isolate); | 273 v8::HandleScope handle_scope(isolate); |
270 | 274 |
271 v8::Local<v8::Context> env = v8::Context::New(isolate); | 275 v8::Local<v8::Context> env = v8::Context::New(isolate); |
272 env->Enter(); | 276 env->Enter(); |
273 | 277 |
274 const char* c_source = "\"1234\".length"; | 278 const char* c_source = "\"1234\".length"; |
275 v8::Local<v8::Script> script = v8_compile(c_source); | 279 v8::Local<v8::Script> script = v8_compile(c_source); |
276 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) | 280 v8::Maybe<int32_t> result = script->Run(isolate->GetCurrentContext()) |
277 .ToLocalChecked() | 281 .ToLocalChecked() |
278 ->Int32Value(isolate->GetCurrentContext()); | 282 ->Int32Value(isolate->GetCurrentContext()); |
279 CHECK_EQ(4, result.FromJust()); | 283 CHECK_EQ(4, result.FromJust()); |
280 } | 284 } |
281 isolate->Dispose(); | 285 isolate->Dispose(); |
282 } | 286 } |
283 | 287 |
284 | 288 static void PartiallySerialize() { |
285 UNINITIALIZED_TEST(PartialSerialization) { | |
286 DisableTurbofan(); | |
287 if (DefaultSnapshotAvailable()) return; | |
288 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); | 289 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); |
289 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 290 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
290 v8_isolate->Enter(); | 291 v8_isolate->Enter(); |
291 { | 292 { |
292 Heap* heap = isolate->heap(); | 293 Heap* heap = isolate->heap(); |
293 | 294 |
294 v8::Persistent<v8::Context> env; | 295 v8::Persistent<v8::Context> env; |
295 { | 296 { |
296 HandleScope scope(isolate); | 297 HandleScope scope(isolate); |
297 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); | 298 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 | 346 |
346 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); | 347 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); |
347 WritePayload(startup_snapshot.RawData(), startup_name.start()); | 348 WritePayload(startup_snapshot.RawData(), startup_name.start()); |
348 | 349 |
349 startup_name.Dispose(); | 350 startup_name.Dispose(); |
350 } | 351 } |
351 v8_isolate->Exit(); | 352 v8_isolate->Exit(); |
352 v8_isolate->Dispose(); | 353 v8_isolate->Dispose(); |
353 } | 354 } |
354 | 355 |
355 | 356 UNINITIALIZED_TEST(PartialSerialization) { |
356 UNINITIALIZED_DEPENDENT_TEST(PartialDeserialization, PartialSerialization) { | |
357 DisableTurbofan(); | 357 DisableTurbofan(); |
358 if (DefaultSnapshotAvailable()) return; | 358 if (DefaultSnapshotAvailable()) return; |
| 359 PartiallySerialize(); |
| 360 } |
| 361 |
| 362 UNINITIALIZED_TEST(PartialDeserialization) { |
| 363 DisableTurbofan(); |
| 364 if (DefaultSnapshotAvailable()) return; |
| 365 PartiallySerialize(); |
359 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 366 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
360 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 367 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
361 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 368 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
362 | 369 |
363 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); | 370 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); |
364 CHECK(v8_isolate); | 371 CHECK(v8_isolate); |
365 startup_name.Dispose(); | 372 startup_name.Dispose(); |
366 { | 373 { |
367 v8::Isolate::Scope isolate_scope(v8_isolate); | 374 v8::Isolate::Scope isolate_scope(v8_isolate); |
368 | 375 |
(...skipping 24 matching lines...) Expand all Loading... |
393 .ToHandleChecked(); | 400 .ToHandleChecked(); |
394 CHECK(root2->IsString()); | 401 CHECK(root2->IsString()); |
395 CHECK(root.is_identical_to(root2)); | 402 CHECK(root.is_identical_to(root2)); |
396 } | 403 } |
397 | 404 |
398 DeleteArray(snapshot); | 405 DeleteArray(snapshot); |
399 } | 406 } |
400 v8_isolate->Dispose(); | 407 v8_isolate->Dispose(); |
401 } | 408 } |
402 | 409 |
403 | 410 static void SerializeContext() { |
404 UNINITIALIZED_TEST(ContextSerialization) { | |
405 DisableTurbofan(); | |
406 if (DefaultSnapshotAvailable()) return; | |
407 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); | 411 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); |
408 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 412 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
409 Heap* heap = isolate->heap(); | 413 Heap* heap = isolate->heap(); |
410 { | 414 { |
411 v8::Isolate::Scope isolate_scope(v8_isolate); | 415 v8::Isolate::Scope isolate_scope(v8_isolate); |
412 | 416 |
413 v8::Persistent<v8::Context> env; | 417 v8::Persistent<v8::Context> env; |
414 { | 418 { |
415 HandleScope scope(isolate); | 419 HandleScope scope(isolate); |
416 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); | 420 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 SnapshotData partial_snapshot(partial_serializer); | 462 SnapshotData partial_snapshot(partial_serializer); |
459 | 463 |
460 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); | 464 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); |
461 WritePayload(startup_snapshot.RawData(), startup_name.start()); | 465 WritePayload(startup_snapshot.RawData(), startup_name.start()); |
462 | 466 |
463 startup_name.Dispose(); | 467 startup_name.Dispose(); |
464 } | 468 } |
465 v8_isolate->Dispose(); | 469 v8_isolate->Dispose(); |
466 } | 470 } |
467 | 471 |
468 | 472 UNINITIALIZED_TEST(ContextSerialization) { |
469 UNINITIALIZED_DEPENDENT_TEST(ContextDeserialization, ContextSerialization) { | |
470 DisableTurbofan(); | 473 DisableTurbofan(); |
471 if (DefaultSnapshotAvailable()) return; | 474 if (DefaultSnapshotAvailable()) return; |
| 475 SerializeContext(); |
| 476 } |
| 477 |
| 478 UNINITIALIZED_TEST(ContextDeserialization) { |
| 479 DisableTurbofan(); |
| 480 if (DefaultSnapshotAvailable()) return; |
| 481 SerializeContext(); |
472 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 482 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
473 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 483 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
474 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 484 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
475 | 485 |
476 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); | 486 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); |
477 CHECK(v8_isolate); | 487 CHECK(v8_isolate); |
478 startup_name.Dispose(); | 488 startup_name.Dispose(); |
479 { | 489 { |
480 v8::Isolate::Scope isolate_scope(v8_isolate); | 490 v8::Isolate::Scope isolate_scope(v8_isolate); |
481 | 491 |
(...skipping 23 matching lines...) Expand all Loading... |
505 root2 = deserializer.DeserializePartial(isolate, global_proxy) | 515 root2 = deserializer.DeserializePartial(isolate, global_proxy) |
506 .ToHandleChecked(); | 516 .ToHandleChecked(); |
507 CHECK(root2->IsContext()); | 517 CHECK(root2->IsContext()); |
508 CHECK(!root.is_identical_to(root2)); | 518 CHECK(!root.is_identical_to(root2)); |
509 } | 519 } |
510 DeleteArray(snapshot); | 520 DeleteArray(snapshot); |
511 } | 521 } |
512 v8_isolate->Dispose(); | 522 v8_isolate->Dispose(); |
513 } | 523 } |
514 | 524 |
515 | 525 static void SerializeCustomContext() { |
516 UNINITIALIZED_TEST(CustomContextSerialization) { | |
517 DisableTurbofan(); | |
518 if (DefaultSnapshotAvailable()) return; | |
519 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); | 526 v8::Isolate* v8_isolate = TestIsolate::NewInitialized(true); |
520 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); | 527 Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate); |
521 { | 528 { |
522 v8::Isolate::Scope isolate_scope(v8_isolate); | 529 v8::Isolate::Scope isolate_scope(v8_isolate); |
523 | 530 |
524 v8::Persistent<v8::Context> env; | 531 v8::Persistent<v8::Context> env; |
525 { | 532 { |
526 HandleScope scope(isolate); | 533 HandleScope scope(isolate); |
527 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); | 534 env.Reset(v8_isolate, v8::Context::New(v8_isolate)); |
528 } | 535 } |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
589 SnapshotData partial_snapshot(partial_serializer); | 596 SnapshotData partial_snapshot(partial_serializer); |
590 | 597 |
591 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); | 598 WritePayload(partial_snapshot.RawData(), FLAG_testing_serialization_file); |
592 WritePayload(startup_snapshot.RawData(), startup_name.start()); | 599 WritePayload(startup_snapshot.RawData(), startup_name.start()); |
593 | 600 |
594 startup_name.Dispose(); | 601 startup_name.Dispose(); |
595 } | 602 } |
596 v8_isolate->Dispose(); | 603 v8_isolate->Dispose(); |
597 } | 604 } |
598 | 605 |
| 606 UNINITIALIZED_TEST(CustomContextSerialization) { |
| 607 DisableTurbofan(); |
| 608 if (DefaultSnapshotAvailable()) return; |
| 609 SerializeCustomContext(); |
| 610 } |
599 | 611 |
600 UNINITIALIZED_DEPENDENT_TEST(CustomContextDeserialization, | 612 UNINITIALIZED_TEST(CustomContextDeserialization) { |
601 CustomContextSerialization) { | |
602 DisableTurbofan(); | 613 DisableTurbofan(); |
603 FLAG_crankshaft = false; | 614 FLAG_crankshaft = false; |
604 if (DefaultSnapshotAvailable()) return; | 615 if (DefaultSnapshotAvailable()) return; |
| 616 SerializeCustomContext(); |
605 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; | 617 int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; |
606 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); | 618 Vector<char> startup_name = Vector<char>::New(file_name_length + 1); |
607 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); | 619 SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); |
608 | 620 |
609 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); | 621 v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start()); |
610 CHECK(v8_isolate); | 622 CHECK(v8_isolate); |
611 startup_name.Dispose(); | 623 startup_name.Dispose(); |
612 { | 624 { |
613 v8::Isolate::Scope isolate_scope(v8_isolate); | 625 v8::Isolate::Scope isolate_scope(v8_isolate); |
614 | 626 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
862 TEST(TestThatAlwaysSucceeds) { | 874 TEST(TestThatAlwaysSucceeds) { |
863 } | 875 } |
864 | 876 |
865 | 877 |
866 TEST(TestThatAlwaysFails) { | 878 TEST(TestThatAlwaysFails) { |
867 bool ArtificialFailure = false; | 879 bool ArtificialFailure = false; |
868 CHECK(ArtificialFailure); | 880 CHECK(ArtificialFailure); |
869 } | 881 } |
870 | 882 |
871 | 883 |
872 DEPENDENT_TEST(DependentTestThatAlwaysFails, TestThatAlwaysSucceeds) { | |
873 bool ArtificialFailure2 = false; | |
874 CHECK(ArtificialFailure2); | |
875 } | |
876 | |
877 | |
878 int CountBuiltins() { | 884 int CountBuiltins() { |
879 // Check that we have not deserialized any additional builtin. | 885 // Check that we have not deserialized any additional builtin. |
880 HeapIterator iterator(CcTest::heap()); | 886 HeapIterator iterator(CcTest::heap()); |
881 DisallowHeapAllocation no_allocation; | 887 DisallowHeapAllocation no_allocation; |
882 int counter = 0; | 888 int counter = 0; |
883 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { | 889 for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) { |
884 if (obj->IsCode() && Code::cast(obj)->kind() == Code::BUILTIN) counter++; | 890 if (obj->IsCode() && Code::cast(obj)->kind() == Code::BUILTIN) counter++; |
885 } | 891 } |
886 return counter; | 892 return counter; |
887 } | 893 } |
(...skipping 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1768 delete script_data; | 1774 delete script_data; |
1769 } | 1775 } |
1770 | 1776 |
1771 | 1777 |
1772 TEST(SerializationMemoryStats) { | 1778 TEST(SerializationMemoryStats) { |
1773 FLAG_profile_deserialization = true; | 1779 FLAG_profile_deserialization = true; |
1774 FLAG_always_opt = false; | 1780 FLAG_always_opt = false; |
1775 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); | 1781 v8::StartupData blob = v8::V8::CreateSnapshotDataBlob(); |
1776 delete[] blob.data; | 1782 delete[] blob.data; |
1777 } | 1783 } |
OLD | NEW |