blob: dc7f655abc24ffafc2d9b5a6f718ba8939519f9c [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
Ben Murdochb8a8cc12014-11-26 15:28:44 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
Steve Blocka7e24c12009-10-30 11:49:00 +00004
5// The common functionality when building with or without snapshots.
6
Ben Murdochb8a8cc12014-11-26 15:28:44 +00007#include "src/v8.h"
Steve Blocka7e24c12009-10-30 11:49:00 +00008
Ben Murdochb8a8cc12014-11-26 15:28:44 +00009#include "src/api.h"
10#include "src/base/platform/platform.h"
11#include "src/serialize.h"
12#include "src/snapshot.h"
Steve Blocka7e24c12009-10-30 11:49:00 +000013
14namespace v8 {
15namespace internal {
16
Emily Bernierd0a1eb72015-03-24 16:35:39 -040017bool Snapshot::HaveASnapshotToStartFrom() {
18 return SnapshotBlob().data != NULL;
Steve Blocka7e24c12009-10-30 11:49:00 +000019}
20
21
Ben Murdochb8a8cc12014-11-26 15:28:44 +000022bool Snapshot::Initialize(Isolate* isolate) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040023 if (!HaveASnapshotToStartFrom()) return false;
24 base::ElapsedTimer timer;
25 if (FLAG_profile_deserialization) timer.Start();
26
27 const v8::StartupData blob = SnapshotBlob();
28 SnapshotData snapshot_data(ExtractStartupData(&blob));
29 Deserializer deserializer(&snapshot_data);
30 bool success = isolate->Init(&deserializer);
31 if (FLAG_profile_deserialization) {
32 double ms = timer.Elapsed().InMillisecondsF();
33 PrintF("[Snapshot loading and deserialization took %0.3f ms]\n", ms);
Steve Blocka7e24c12009-10-30 11:49:00 +000034 }
Emily Bernierd0a1eb72015-03-24 16:35:39 -040035 return success;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000036}
37
38
39Handle<Context> Snapshot::NewContextFromSnapshot(Isolate* isolate) {
Emily Bernierd0a1eb72015-03-24 16:35:39 -040040 if (!HaveASnapshotToStartFrom()) return Handle<Context>();
41
42 const v8::StartupData blob = SnapshotBlob();
43 SnapshotData snapshot_data(ExtractContextData(&blob));
44 Deserializer deserializer(&snapshot_data);
Andrei Popescu31002712010-02-23 13:46:05 +000045 Object* root;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000046 deserializer.DeserializePartial(isolate, &root);
Andrei Popescu31002712010-02-23 13:46:05 +000047 CHECK(root->IsContext());
48 return Handle<Context>(Context::cast(root));
49}
50
Ben Murdochb8a8cc12014-11-26 15:28:44 +000051
Emily Bernierd0a1eb72015-03-24 16:35:39 -040052v8::StartupData Snapshot::CreateSnapshotBlob(
53 const Vector<const byte> startup_data,
54 const Vector<const byte> context_data) {
55 int startup_length = startup_data.length();
56 int context_length = context_data.length();
57 int context_offset = kIntSize + startup_length;
58 int length = context_offset + context_length;
59 char* data = new char[length];
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060
Emily Bernierd0a1eb72015-03-24 16:35:39 -040061 memcpy(data, &startup_length, kIntSize);
62 memcpy(data + kIntSize, startup_data.begin(), startup_length);
63 memcpy(data + context_offset, context_data.begin(), context_length);
64 v8::StartupData result = {data, length};
65 return result;
66}
67
68
69Vector<const byte> Snapshot::ExtractStartupData(const v8::StartupData* data) {
70 DCHECK_LT(kIntSize, data->raw_size);
71 int startup_length;
72 memcpy(&startup_length, data->data, kIntSize);
73 DCHECK_LT(startup_length, data->raw_size);
74 const byte* startup_data =
75 reinterpret_cast<const byte*>(data->data + kIntSize);
76 return Vector<const byte>(startup_data, startup_length);
77}
78
79
80Vector<const byte> Snapshot::ExtractContextData(const v8::StartupData* data) {
81 DCHECK_LT(kIntSize, data->raw_size);
82 int startup_length;
83 memcpy(&startup_length, data->data, kIntSize);
84 int context_offset = kIntSize + startup_length;
85 const byte* context_data =
86 reinterpret_cast<const byte*>(data->data + context_offset);
87 DCHECK_LT(context_offset, data->raw_size);
88 int context_length = data->raw_size - context_offset;
89 return Vector<const byte>(context_data, context_length);
90}
Steve Blocka7e24c12009-10-30 11:49:00 +000091} } // namespace v8::internal