OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/api.h" | 5 #include "src/api.h" |
6 | 6 |
7 #include <string.h> // For memcpy, strlen. | 7 #include <string.h> // For memcpy, strlen. |
8 #ifdef V8_USE_ADDRESS_SANITIZER | 8 #ifdef V8_USE_ADDRESS_SANITIZER |
9 #include <sanitizer/asan_interface.h> | 9 #include <sanitizer/asan_interface.h> |
10 #endif // V8_USE_ADDRESS_SANITIZER | 10 #endif // V8_USE_ADDRESS_SANITIZER |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 | 189 |
190 static inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { | 190 static inline bool IsExecutionTerminatingCheck(i::Isolate* isolate) { |
191 if (isolate->has_scheduled_exception()) { | 191 if (isolate->has_scheduled_exception()) { |
192 return isolate->scheduled_exception() == | 192 return isolate->scheduled_exception() == |
193 isolate->heap()->termination_exception(); | 193 isolate->heap()->termination_exception(); |
194 } | 194 } |
195 return false; | 195 return false; |
196 } | 196 } |
197 | 197 |
198 | 198 |
199 StartupDataDecompressor::StartupDataDecompressor() | |
200 : raw_data(i::NewArray<char*>(V8::GetCompressedStartupDataCount())) { | |
201 for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) { | |
202 raw_data[i] = NULL; | |
203 } | |
204 } | |
205 | |
206 | |
207 StartupDataDecompressor::~StartupDataDecompressor() { | |
208 for (int i = 0; i < V8::GetCompressedStartupDataCount(); ++i) { | |
209 i::DeleteArray(raw_data[i]); | |
210 } | |
211 i::DeleteArray(raw_data); | |
212 } | |
213 | |
214 | |
215 int StartupDataDecompressor::Decompress() { | |
216 int compressed_data_count = V8::GetCompressedStartupDataCount(); | |
217 StartupData* compressed_data = | |
218 i::NewArray<StartupData>(compressed_data_count); | |
219 V8::GetCompressedStartupData(compressed_data); | |
220 for (int i = 0; i < compressed_data_count; ++i) { | |
221 char* decompressed = raw_data[i] = | |
222 i::NewArray<char>(compressed_data[i].raw_size); | |
223 if (compressed_data[i].compressed_size != 0) { | |
224 int result = DecompressData(decompressed, | |
225 &compressed_data[i].raw_size, | |
226 compressed_data[i].data, | |
227 compressed_data[i].compressed_size); | |
228 if (result != 0) return result; | |
229 } else { | |
230 DCHECK_EQ(0, compressed_data[i].raw_size); | |
231 } | |
232 compressed_data[i].data = decompressed; | |
233 } | |
234 V8::SetDecompressedStartupData(compressed_data); | |
235 i::DeleteArray(compressed_data); | |
236 return 0; | |
237 } | |
238 | |
239 | |
240 StartupData::CompressionAlgorithm V8::GetCompressedStartupDataAlgorithm() { | |
241 #ifdef COMPRESS_STARTUP_DATA_BZ2 | |
242 return StartupData::kBZip2; | |
243 #else | |
244 return StartupData::kUncompressed; | |
245 #endif | |
246 } | |
247 | |
248 | |
249 enum CompressedStartupDataItems { | |
250 kSnapshot = 0, | |
251 kSnapshotContext, | |
252 kLibraries, | |
253 kExperimentalLibraries, | |
254 kCompressedStartupDataCount | |
255 }; | |
256 | |
257 | |
258 int V8::GetCompressedStartupDataCount() { | |
259 #ifdef COMPRESS_STARTUP_DATA_BZ2 | |
260 return kCompressedStartupDataCount; | |
261 #else | |
262 return 0; | |
263 #endif | |
264 } | |
265 | |
266 | |
267 void V8::GetCompressedStartupData(StartupData* compressed_data) { | |
268 #ifdef COMPRESS_STARTUP_DATA_BZ2 | |
269 compressed_data[kSnapshot].data = | |
270 reinterpret_cast<const char*>(i::Snapshot::data()); | |
271 compressed_data[kSnapshot].compressed_size = i::Snapshot::size(); | |
272 compressed_data[kSnapshot].raw_size = i::Snapshot::raw_size(); | |
273 | |
274 compressed_data[kSnapshotContext].data = | |
275 reinterpret_cast<const char*>(i::Snapshot::context_data()); | |
276 compressed_data[kSnapshotContext].compressed_size = | |
277 i::Snapshot::context_size(); | |
278 compressed_data[kSnapshotContext].raw_size = i::Snapshot::context_raw_size(); | |
279 | |
280 i::Vector<const i::byte> libraries_source = i::Natives::GetScriptsSource(); | |
281 compressed_data[kLibraries].data = | |
282 reinterpret_cast<const char*>(libraries_source.start()); | |
283 compressed_data[kLibraries].compressed_size = libraries_source.length(); | |
284 compressed_data[kLibraries].raw_size = i::Natives::GetRawScriptsSize(); | |
285 | |
286 i::Vector<const i::byte> exp_libraries_source = | |
287 i::ExperimentalNatives::GetScriptsSource(); | |
288 compressed_data[kExperimentalLibraries].data = | |
289 reinterpret_cast<const char*>(exp_libraries_source.start()); | |
290 compressed_data[kExperimentalLibraries].compressed_size = | |
291 exp_libraries_source.length(); | |
292 compressed_data[kExperimentalLibraries].raw_size = | |
293 i::ExperimentalNatives::GetRawScriptsSize(); | |
294 #endif | |
295 } | |
296 | |
297 | |
298 void V8::SetDecompressedStartupData(StartupData* decompressed_data) { | |
299 #ifdef COMPRESS_STARTUP_DATA_BZ2 | |
300 DCHECK_EQ(i::Snapshot::raw_size(), decompressed_data[kSnapshot].raw_size); | |
301 i::Snapshot::set_raw_data( | |
302 reinterpret_cast<const i::byte*>(decompressed_data[kSnapshot].data)); | |
303 | |
304 DCHECK_EQ(i::Snapshot::context_raw_size(), | |
305 decompressed_data[kSnapshotContext].raw_size); | |
306 i::Snapshot::set_context_raw_data( | |
307 reinterpret_cast<const i::byte*>( | |
308 decompressed_data[kSnapshotContext].data)); | |
309 | |
310 DCHECK_EQ(i::Natives::GetRawScriptsSize(), | |
311 decompressed_data[kLibraries].raw_size); | |
312 i::Vector<const char> libraries_source( | |
313 decompressed_data[kLibraries].data, | |
314 decompressed_data[kLibraries].raw_size); | |
315 i::Natives::SetRawScriptsSource(libraries_source); | |
316 | |
317 DCHECK_EQ(i::ExperimentalNatives::GetRawScriptsSize(), | |
318 decompressed_data[kExperimentalLibraries].raw_size); | |
319 i::Vector<const char> exp_libraries_source( | |
320 decompressed_data[kExperimentalLibraries].data, | |
321 decompressed_data[kExperimentalLibraries].raw_size); | |
322 i::ExperimentalNatives::SetRawScriptsSource(exp_libraries_source); | |
323 #endif | |
324 } | |
325 | |
326 | |
327 void V8::SetNativesDataBlob(StartupData* natives_blob) { | 199 void V8::SetNativesDataBlob(StartupData* natives_blob) { |
328 #ifdef V8_USE_EXTERNAL_STARTUP_DATA | 200 #ifdef V8_USE_EXTERNAL_STARTUP_DATA |
329 i::SetNativesFromFile(natives_blob); | 201 i::SetNativesFromFile(natives_blob); |
330 #else | 202 #else |
331 CHECK(false); | 203 CHECK(false); |
332 #endif | 204 #endif |
333 } | 205 } |
334 | 206 |
335 | 207 |
336 void V8::SetSnapshotDataBlob(StartupData* snapshot_blob) { | 208 void V8::SetSnapshotDataBlob(StartupData* snapshot_blob) { |
(...skipping 7449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7786 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); | 7658 Isolate* isolate = reinterpret_cast<Isolate*>(info.GetIsolate()); |
7787 Address callback_address = | 7659 Address callback_address = |
7788 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); | 7660 reinterpret_cast<Address>(reinterpret_cast<intptr_t>(callback)); |
7789 VMState<EXTERNAL> state(isolate); | 7661 VMState<EXTERNAL> state(isolate); |
7790 ExternalCallbackScope call_scope(isolate, callback_address); | 7662 ExternalCallbackScope call_scope(isolate, callback_address); |
7791 callback(info); | 7663 callback(info); |
7792 } | 7664 } |
7793 | 7665 |
7794 | 7666 |
7795 } } // namespace v8::internal | 7667 } } // namespace v8::internal |
OLD | NEW |