| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <errno.h> | 5 #include <errno.h> |
| 6 #include <stdio.h> | 6 #include <stdio.h> |
| 7 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 7 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 8 #include <bzlib.h> | 8 #include <bzlib.h> |
| 9 #endif | 9 #endif |
| 10 #include <signal.h> | 10 #include <signal.h> |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 | 26 |
| 27 class Compressor { | 27 class Compressor { |
| 28 public: | 28 public: |
| 29 virtual ~Compressor() {} | 29 virtual ~Compressor() {} |
| 30 virtual bool Compress(i::Vector<char> input) = 0; | 30 virtual bool Compress(i::Vector<char> input) = 0; |
| 31 virtual i::Vector<char>* output() = 0; | 31 virtual i::Vector<char>* output() = 0; |
| 32 }; | 32 }; |
| 33 | 33 |
| 34 | 34 |
| 35 class ListSnapshotSink : public i::SnapshotByteSink { | |
| 36 public: | |
| 37 explicit ListSnapshotSink(i::List<char>* data) : data_(data) { } | |
| 38 virtual ~ListSnapshotSink() {} | |
| 39 virtual void Put(int byte, const char* description) { data_->Add(byte); } | |
| 40 virtual int Position() { return data_->length(); } | |
| 41 private: | |
| 42 i::List<char>* data_; | |
| 43 }; | |
| 44 | |
| 45 | |
| 46 class SnapshotWriter { | 35 class SnapshotWriter { |
| 47 public: | 36 public: |
| 48 explicit SnapshotWriter(const char* snapshot_file) | 37 explicit SnapshotWriter(const char* snapshot_file) |
| 49 : fp_(GetFileDescriptorOrDie(snapshot_file)) | 38 : fp_(GetFileDescriptorOrDie(snapshot_file)) |
| 50 , raw_file_(NULL) | 39 , raw_file_(NULL) |
| 51 , raw_context_file_(NULL) | 40 , raw_context_file_(NULL) |
| 52 , startup_blob_file_(NULL) | 41 , startup_blob_file_(NULL) |
| 53 , compressor_(NULL) { | 42 , compressor_(NULL) { |
| 54 } | 43 } |
| 55 | 44 |
| (...skipping 30 matching lines...) Expand all Loading... |
| 86 | 75 |
| 87 private: | 76 private: |
| 88 void MaybeWriteStartupBlob(const i::List<char>& snapshot_data, | 77 void MaybeWriteStartupBlob(const i::List<char>& snapshot_data, |
| 89 const i::Serializer& serializer, | 78 const i::Serializer& serializer, |
| 90 const i::List<char>& context_snapshot_data, | 79 const i::List<char>& context_snapshot_data, |
| 91 const i::Serializer& context_serializer) const { | 80 const i::Serializer& context_serializer) const { |
| 92 if (!startup_blob_file_) | 81 if (!startup_blob_file_) |
| 93 return; | 82 return; |
| 94 | 83 |
| 95 i::List<char> startup_blob; | 84 i::List<char> startup_blob; |
| 96 ListSnapshotSink sink(&startup_blob); | 85 i::ListSnapshotSink sink(&startup_blob); |
| 97 | 86 |
| 98 int spaces[] = { | 87 int spaces[] = { |
| 99 i::NEW_SPACE, i::OLD_POINTER_SPACE, i::OLD_DATA_SPACE, i::CODE_SPACE, | 88 i::NEW_SPACE, i::OLD_POINTER_SPACE, i::OLD_DATA_SPACE, i::CODE_SPACE, |
| 100 i::MAP_SPACE, i::CELL_SPACE, i::PROPERTY_CELL_SPACE | 89 i::MAP_SPACE, i::CELL_SPACE, i::PROPERTY_CELL_SPACE |
| 101 }; | 90 }; |
| 102 | 91 |
| 103 i::byte* snapshot_bytes = reinterpret_cast<i::byte*>(snapshot_data.begin()); | 92 i::byte* snapshot_bytes = reinterpret_cast<i::byte*>(snapshot_data.begin()); |
| 104 sink.PutBlob(snapshot_bytes, snapshot_data.length(), "snapshot"); | 93 sink.PutBlob(snapshot_bytes, snapshot_data.length(), "snapshot"); |
| 105 for (size_t i = 0; i < ARRAY_SIZE(spaces); ++i) | 94 for (size_t i = 0; i < ARRAY_SIZE(spaces); ++i) |
| 106 sink.PutInt(serializer.CurrentAllocationAddress(spaces[i]), "spaces"); | 95 sink.PutInt(serializer.CurrentAllocationAddress(spaces[i]), "spaces"); |
| (...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 410 // If we don't do this then we end up with a stray root pointing at the | 399 // If we don't do this then we end up with a stray root pointing at the |
| 411 // context even after we have disposed of the context. | 400 // context even after we have disposed of the context. |
| 412 internal_isolate->heap()->CollectAllGarbage( | 401 internal_isolate->heap()->CollectAllGarbage( |
| 413 i::Heap::kNoGCFlags, "mksnapshot"); | 402 i::Heap::kNoGCFlags, "mksnapshot"); |
| 414 i::Object* raw_context = *v8::Utils::OpenPersistent(context); | 403 i::Object* raw_context = *v8::Utils::OpenPersistent(context); |
| 415 context.Reset(); | 404 context.Reset(); |
| 416 | 405 |
| 417 // This results in a somewhat smaller snapshot, probably because it gets | 406 // This results in a somewhat smaller snapshot, probably because it gets |
| 418 // rid of some things that are cached between garbage collections. | 407 // rid of some things that are cached between garbage collections. |
| 419 i::List<char> snapshot_data; | 408 i::List<char> snapshot_data; |
| 420 ListSnapshotSink snapshot_sink(&snapshot_data); | 409 i::ListSnapshotSink snapshot_sink(&snapshot_data); |
| 421 i::StartupSerializer ser(internal_isolate, &snapshot_sink); | 410 i::StartupSerializer ser(internal_isolate, &snapshot_sink); |
| 422 ser.SerializeStrongReferences(); | 411 ser.SerializeStrongReferences(); |
| 423 | 412 |
| 424 i::List<char> context_data; | 413 i::List<char> context_data; |
| 425 ListSnapshotSink contex_sink(&context_data); | 414 i::ListSnapshotSink contex_sink(&context_data); |
| 426 i::PartialSerializer context_ser(internal_isolate, &ser, &contex_sink); | 415 i::PartialSerializer context_ser(internal_isolate, &ser, &contex_sink); |
| 427 context_ser.Serialize(&raw_context); | 416 context_ser.Serialize(&raw_context); |
| 428 ser.SerializeWeakReferences(); | 417 ser.SerializeWeakReferences(); |
| 429 | 418 |
| 430 { | 419 { |
| 431 SnapshotWriter writer(argv[1]); | 420 SnapshotWriter writer(argv[1]); |
| 432 if (i::FLAG_raw_file && i::FLAG_raw_context_file) | 421 if (i::FLAG_raw_file && i::FLAG_raw_context_file) |
| 433 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); | 422 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); |
| 434 if (i::FLAG_startup_blob) | 423 if (i::FLAG_startup_blob) |
| 435 writer.SetStartupBlobFile(i::FLAG_startup_blob); | 424 writer.SetStartupBlobFile(i::FLAG_startup_blob); |
| 436 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 425 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
| 437 BZip2Compressor bzip2; | 426 BZip2Compressor bzip2; |
| 438 writer.SetCompressor(&bzip2); | 427 writer.SetCompressor(&bzip2); |
| 439 #endif | 428 #endif |
| 440 writer.WriteSnapshot(snapshot_data, ser, context_data, context_ser); | 429 writer.WriteSnapshot(snapshot_data, ser, context_data, context_ser); |
| 441 } | 430 } |
| 442 } | 431 } |
| 443 | 432 |
| 444 isolate->Dispose(); | 433 isolate->Dispose(); |
| 445 V8::Dispose(); | 434 V8::Dispose(); |
| 446 V8::ShutdownPlatform(); | 435 V8::ShutdownPlatform(); |
| 447 delete platform; | 436 delete platform; |
| 448 return 0; | 437 return 0; |
| 449 } | 438 } |
| OLD | NEW |