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 30 matching lines...) Expand all Loading... |
41 i::List<char>* data_; | 41 i::List<char>* data_; |
42 }; | 42 }; |
43 | 43 |
44 | 44 |
45 class SnapshotWriter { | 45 class SnapshotWriter { |
46 public: | 46 public: |
47 explicit SnapshotWriter(const char* snapshot_file) | 47 explicit SnapshotWriter(const char* snapshot_file) |
48 : fp_(GetFileDescriptorOrDie(snapshot_file)) | 48 : fp_(GetFileDescriptorOrDie(snapshot_file)) |
49 , raw_file_(NULL) | 49 , raw_file_(NULL) |
50 , raw_context_file_(NULL) | 50 , raw_context_file_(NULL) |
51 , startup_blob_file_(NULL) | 51 , compressor_(NULL) |
52 , compressor_(NULL) { | 52 , omit_(false) { |
53 } | 53 } |
54 | 54 |
55 ~SnapshotWriter() { | 55 ~SnapshotWriter() { |
56 fclose(fp_); | 56 fclose(fp_); |
57 if (raw_file_) fclose(raw_file_); | 57 if (raw_file_) fclose(raw_file_); |
58 if (raw_context_file_) fclose(raw_context_file_); | 58 if (raw_context_file_) fclose(raw_context_file_); |
59 if (startup_blob_file_) fclose(startup_blob_file_); | |
60 } | 59 } |
61 | 60 |
62 void SetCompressor(Compressor* compressor) { | 61 void SetCompressor(Compressor* compressor) { |
63 compressor_ = compressor; | 62 compressor_ = compressor; |
64 } | 63 } |
65 | 64 |
| 65 void SetOmit(bool omit) { |
| 66 omit_ = omit; |
| 67 } |
| 68 |
66 void SetRawFiles(const char* raw_file, const char* raw_context_file) { | 69 void SetRawFiles(const char* raw_file, const char* raw_context_file) { |
67 raw_file_ = GetFileDescriptorOrDie(raw_file); | 70 raw_file_ = GetFileDescriptorOrDie(raw_file); |
68 raw_context_file_ = GetFileDescriptorOrDie(raw_context_file); | 71 raw_context_file_ = GetFileDescriptorOrDie(raw_context_file); |
69 } | 72 } |
70 | 73 |
71 void SetStartupBlobFile(const char* startup_blob_file) { | |
72 if (startup_blob_file != NULL) | |
73 startup_blob_file_ = GetFileDescriptorOrDie(startup_blob_file); | |
74 } | |
75 | |
76 void WriteSnapshot(const i::List<char>& snapshot_data, | 74 void WriteSnapshot(const i::List<char>& snapshot_data, |
77 const i::Serializer& serializer, | 75 const i::Serializer& serializer, |
78 const i::List<char>& context_snapshot_data, | 76 const i::List<char>& context_snapshot_data, |
79 const i::Serializer& context_serializer) const { | 77 const i::Serializer& context_serializer) const { |
80 WriteSnapshotFile(snapshot_data, serializer, | |
81 context_snapshot_data, context_serializer); | |
82 MaybeWriteStartupBlob(snapshot_data, serializer, | |
83 context_snapshot_data, context_serializer); | |
84 } | |
85 | |
86 private: | |
87 void MaybeWriteStartupBlob(const i::List<char>& snapshot_data, | |
88 const i::Serializer& serializer, | |
89 const i::List<char>& context_snapshot_data, | |
90 const i::Serializer& context_serializer) const { | |
91 if (!startup_blob_file_) | |
92 return; | |
93 | |
94 i::List<char> startup_blob; | |
95 ListSnapshotSink sink(&startup_blob); | |
96 | |
97 int spaces[] = { | |
98 i::NEW_SPACE, i::OLD_POINTER_SPACE, i::OLD_DATA_SPACE, i::CODE_SPACE, | |
99 i::MAP_SPACE, i::CELL_SPACE, i::PROPERTY_CELL_SPACE | |
100 }; | |
101 | |
102 i::byte* snapshot_bytes = reinterpret_cast<i::byte*>(snapshot_data.begin()); | |
103 sink.PutBlob(snapshot_bytes, snapshot_data.length(), "snapshot"); | |
104 for (size_t i = 0; i < ARRAY_SIZE(spaces); ++i) | |
105 sink.PutInt(serializer.CurrentAllocationAddress(spaces[i]), "spaces"); | |
106 | |
107 i::byte* context_bytes = | |
108 reinterpret_cast<i::byte*>(context_snapshot_data.begin()); | |
109 sink.PutBlob(context_bytes, context_snapshot_data.length(), "context"); | |
110 for (size_t i = 0; i < ARRAY_SIZE(spaces); ++i) | |
111 sink.PutInt(context_serializer.CurrentAllocationAddress(spaces[i]), | |
112 "spaces"); | |
113 | |
114 size_t written = fwrite(startup_blob.begin(), 1, startup_blob.length(), | |
115 startup_blob_file_); | |
116 if (written != (size_t)startup_blob.length()) { | |
117 i::PrintF("Writing snapshot file failed.. Aborting.\n"); | |
118 exit(1); | |
119 } | |
120 } | |
121 | |
122 void WriteSnapshotFile(const i::List<char>& snapshot_data, | |
123 const i::Serializer& serializer, | |
124 const i::List<char>& context_snapshot_data, | |
125 const i::Serializer& context_serializer) const { | |
126 WriteFilePrefix(); | 78 WriteFilePrefix(); |
127 WriteData("", snapshot_data, raw_file_); | 79 WriteData("", snapshot_data, raw_file_); |
128 WriteData("context_", context_snapshot_data, raw_context_file_); | 80 WriteData("context_", context_snapshot_data, raw_context_file_); |
129 WriteMeta("context_", context_serializer); | 81 WriteMeta("context_", context_serializer); |
130 WriteMeta("", serializer); | 82 WriteMeta("", serializer); |
131 WriteFileSuffix(); | 83 WriteFileSuffix(); |
132 } | 84 } |
133 | 85 |
| 86 private: |
134 void WriteFilePrefix() const { | 87 void WriteFilePrefix() const { |
135 fprintf(fp_, "// Autogenerated snapshot file. Do not edit.\n\n"); | 88 fprintf(fp_, "// Autogenerated snapshot file. Do not edit.\n\n"); |
136 fprintf(fp_, "#include \"src/v8.h\"\n"); | 89 fprintf(fp_, "#include \"src/v8.h\"\n"); |
137 fprintf(fp_, "#include \"src/platform.h\"\n\n"); | 90 fprintf(fp_, "#include \"src/platform.h\"\n\n"); |
138 fprintf(fp_, "#include \"src/snapshot.h\"\n\n"); | 91 fprintf(fp_, "#include \"src/snapshot.h\"\n\n"); |
139 fprintf(fp_, "namespace v8 {\n"); | 92 fprintf(fp_, "namespace v8 {\n"); |
140 fprintf(fp_, "namespace internal {\n\n"); | 93 fprintf(fp_, "namespace internal {\n\n"); |
141 } | 94 } |
142 | 95 |
143 void WriteFileSuffix() const { | 96 void WriteFileSuffix() const { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 if (written != (size_t)data->length()) { | 130 if (written != (size_t)data->length()) { |
178 i::PrintF("Writing raw file failed.. Aborting.\n"); | 131 i::PrintF("Writing raw file failed.. Aborting.\n"); |
179 exit(1); | 132 exit(1); |
180 } | 133 } |
181 } | 134 } |
182 | 135 |
183 void WriteData(const char* prefix, | 136 void WriteData(const char* prefix, |
184 const i::List<char>& source_data, | 137 const i::List<char>& source_data, |
185 const i::List<char>* data_to_be_written) const { | 138 const i::List<char>* data_to_be_written) const { |
186 fprintf(fp_, "const byte Snapshot::%sdata_[] = {\n", prefix); | 139 fprintf(fp_, "const byte Snapshot::%sdata_[] = {\n", prefix); |
187 WriteSnapshotData(data_to_be_written); | 140 if (!omit_) |
| 141 WriteSnapshotData(data_to_be_written); |
188 fprintf(fp_, "};\n"); | 142 fprintf(fp_, "};\n"); |
189 fprintf(fp_, "const int Snapshot::%ssize_ = %d;\n", prefix, | 143 fprintf(fp_, "const int Snapshot::%ssize_ = %d;\n", prefix, |
190 data_to_be_written->length()); | 144 data_to_be_written->length()); |
191 | 145 |
192 if (data_to_be_written == &source_data) { | 146 if (data_to_be_written == &source_data && !omit_) { |
193 fprintf(fp_, "const byte* Snapshot::%sraw_data_ = Snapshot::%sdata_;\n", | 147 fprintf(fp_, "const byte* Snapshot::%sraw_data_ = Snapshot::%sdata_;\n", |
194 prefix, prefix); | 148 prefix, prefix); |
195 fprintf(fp_, "const int Snapshot::%sraw_size_ = Snapshot::%ssize_;\n", | 149 fprintf(fp_, "const int Snapshot::%sraw_size_ = Snapshot::%ssize_;\n", |
196 prefix, prefix); | 150 prefix, prefix); |
197 } else { | 151 } else { |
198 fprintf(fp_, "const byte* Snapshot::%sraw_data_ = NULL;\n", prefix); | 152 fprintf(fp_, "const byte* Snapshot::%sraw_data_ = NULL;\n", prefix); |
199 fprintf(fp_, "const int Snapshot::%sraw_size_ = %d;\n", | 153 fprintf(fp_, "const int Snapshot::%sraw_size_ = %d;\n", |
200 prefix, source_data.length()); | 154 prefix, source_data.length()); |
201 } | 155 } |
202 fprintf(fp_, "\n"); | 156 fprintf(fp_, "\n"); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 if (fp == NULL) { | 189 if (fp == NULL) { |
236 i::PrintF("Unable to open file \"%s\" for writing.\n", filename); | 190 i::PrintF("Unable to open file \"%s\" for writing.\n", filename); |
237 exit(1); | 191 exit(1); |
238 } | 192 } |
239 return fp; | 193 return fp; |
240 } | 194 } |
241 | 195 |
242 FILE* fp_; | 196 FILE* fp_; |
243 FILE* raw_file_; | 197 FILE* raw_file_; |
244 FILE* raw_context_file_; | 198 FILE* raw_context_file_; |
245 FILE* startup_blob_file_; | |
246 Compressor* compressor_; | 199 Compressor* compressor_; |
| 200 bool omit_; |
247 }; | 201 }; |
248 | 202 |
249 | 203 |
250 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 204 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
251 class BZip2Compressor : public Compressor { | 205 class BZip2Compressor : public Compressor { |
252 public: | 206 public: |
253 BZip2Compressor() : output_(NULL) {} | 207 BZip2Compressor() : output_(NULL) {} |
254 virtual ~BZip2Compressor() { | 208 virtual ~BZip2Compressor() { |
255 delete output_; | 209 delete output_; |
256 } | 210 } |
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 ser.SerializeStrongReferences(); | 374 ser.SerializeStrongReferences(); |
421 | 375 |
422 i::List<char> context_data; | 376 i::List<char> context_data; |
423 ListSnapshotSink contex_sink(&context_data); | 377 ListSnapshotSink contex_sink(&context_data); |
424 i::PartialSerializer context_ser(internal_isolate, &ser, &contex_sink); | 378 i::PartialSerializer context_ser(internal_isolate, &ser, &contex_sink); |
425 context_ser.Serialize(&raw_context); | 379 context_ser.Serialize(&raw_context); |
426 ser.SerializeWeakReferences(); | 380 ser.SerializeWeakReferences(); |
427 | 381 |
428 { | 382 { |
429 SnapshotWriter writer(argv[1]); | 383 SnapshotWriter writer(argv[1]); |
| 384 writer.SetOmit(i::FLAG_omit); |
430 if (i::FLAG_raw_file && i::FLAG_raw_context_file) | 385 if (i::FLAG_raw_file && i::FLAG_raw_context_file) |
431 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); | 386 writer.SetRawFiles(i::FLAG_raw_file, i::FLAG_raw_context_file); |
432 if (i::FLAG_startup_blob) | |
433 writer.SetStartupBlobFile(i::FLAG_startup_blob); | |
434 #ifdef COMPRESS_STARTUP_DATA_BZ2 | 387 #ifdef COMPRESS_STARTUP_DATA_BZ2 |
435 BZip2Compressor bzip2; | 388 BZip2Compressor bzip2; |
436 writer.SetCompressor(&bzip2); | 389 writer.SetCompressor(&bzip2); |
437 #endif | 390 #endif |
438 writer.WriteSnapshot(snapshot_data, ser, context_data, context_ser); | 391 writer.WriteSnapshot(snapshot_data, ser, context_data, context_ser); |
439 } | 392 } |
440 } | 393 } |
441 | 394 |
442 isolate->Dispose(); | 395 isolate->Dispose(); |
443 V8::Dispose(); | 396 V8::Dispose(); |
444 return 0; | 397 return 0; |
445 } | 398 } |
OLD | NEW |