blob: a8806f053fe13b2f796c9009eb05c48843217394 [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001// Copyright 2006-2008 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6// * Redistributions of source code must retain the above copyright
7// notice, this list of conditions and the following disclaimer.
8// * Redistributions in binary form must reproduce the above
9// copyright notice, this list of conditions and the following
10// disclaimer in the documentation and/or other materials provided
11// with the distribution.
12// * Neither the name of Google Inc. nor the names of its
13// contributors may be used to endorse or promote products derived
14// from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28// The common functionality when building with or without snapshots.
29
30#include "v8.h"
31
32#include "api.h"
33#include "serialize.h"
34#include "snapshot.h"
ager@chromium.org3811b432009-10-28 14:53:37 +000035#include "platform.h"
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000036
kasperl@chromium.org71affb52009-05-26 05:44:31 +000037namespace v8 {
38namespace internal {
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000039
ulan@chromium.org56c14af2012-09-20 12:51:09 +000040
41static void ReserveSpaceForSnapshot(Deserializer* deserializer,
42 const char* file_name) {
43 int file_name_length = StrLength(file_name) + 10;
44 Vector<char> name = Vector<char>::New(file_name_length + 1);
45 OS::SNPrintF(name, "%s.size", file_name);
46 FILE* fp = OS::FOpen(name.start(), "r");
47 CHECK_NE(NULL, fp);
48 int new_size, pointer_size, data_size, code_size, map_size, cell_size;
49#ifdef _MSC_VER
50 // Avoid warning about unsafe fscanf from MSVC.
51 // Please note that this is only fine if %c and %s are not being used.
52#define fscanf fscanf_s
53#endif
54 CHECK_EQ(1, fscanf(fp, "new %d\n", &new_size));
55 CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size));
56 CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size));
57 CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size));
58 CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size));
59 CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size));
60#ifdef _MSC_VER
61#undef fscanf
62#endif
63 fclose(fp);
64 deserializer->set_reservation(NEW_SPACE, new_size);
65 deserializer->set_reservation(OLD_POINTER_SPACE, pointer_size);
66 deserializer->set_reservation(OLD_DATA_SPACE, data_size);
67 deserializer->set_reservation(CODE_SPACE, code_size);
68 deserializer->set_reservation(MAP_SPACE, map_size);
69 deserializer->set_reservation(CELL_SPACE, cell_size);
70 name.Dispose();
71}
72
73
74void Snapshot::ReserveSpaceForLinkedInSnapshot(Deserializer* deserializer) {
75 deserializer->set_reservation(NEW_SPACE, new_space_used_);
76 deserializer->set_reservation(OLD_POINTER_SPACE, pointer_space_used_);
77 deserializer->set_reservation(OLD_DATA_SPACE, data_space_used_);
78 deserializer->set_reservation(CODE_SPACE, code_space_used_);
79 deserializer->set_reservation(MAP_SPACE, map_space_used_);
80 deserializer->set_reservation(CELL_SPACE, cell_space_used_);
ager@chromium.org3811b432009-10-28 14:53:37 +000081}
82
83
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000084bool Snapshot::Initialize(const char* snapshot_file) {
85 if (snapshot_file) {
86 int len;
ager@chromium.orgddb913d2009-01-27 10:01:48 +000087 byte* str = ReadBytes(snapshot_file, &len);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000088 if (!str) return false;
ulan@chromium.org56c14af2012-09-20 12:51:09 +000089 bool success;
90 {
91 SnapshotByteSource source(str, len);
92 Deserializer deserializer(&source);
93 ReserveSpaceForSnapshot(&deserializer, snapshot_file);
94 success = V8::Initialize(&deserializer);
95 }
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000096 DeleteArray(str);
ulan@chromium.org56c14af2012-09-20 12:51:09 +000097 return success;
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000098 } else if (size_ > 0) {
ulan@chromium.org56c14af2012-09-20 12:51:09 +000099 SnapshotByteSource source(raw_data_, raw_size_);
100 Deserializer deserializer(&source);
101 ReserveSpaceForLinkedInSnapshot(&deserializer);
102 return V8::Initialize(&deserializer);
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000103 }
104 return false;
105}
106
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000107
yangguo@chromium.org5a11aaf2012-06-20 11:29:00 +0000108bool Snapshot::HaveASnapshotToStartFrom() {
109 return size_ != 0;
110}
111
112
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000113Handle<Context> Snapshot::NewContextFromSnapshot() {
114 if (context_size_ == 0) {
115 return Handle<Context>();
116 }
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000117 SnapshotByteSource source(context_raw_data_,
118 context_raw_size_);
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000119 Deserializer deserializer(&source);
120 Object* root;
ulan@chromium.org56c14af2012-09-20 12:51:09 +0000121 deserializer.set_reservation(NEW_SPACE, context_new_space_used_);
122 deserializer.set_reservation(OLD_POINTER_SPACE, context_pointer_space_used_);
123 deserializer.set_reservation(OLD_DATA_SPACE, context_data_space_used_);
124 deserializer.set_reservation(CODE_SPACE, context_code_space_used_);
125 deserializer.set_reservation(MAP_SPACE, context_map_space_used_);
126 deserializer.set_reservation(CELL_SPACE, context_cell_space_used_);
kmillikin@chromium.org5d8f0e62010-03-24 08:21:20 +0000127 deserializer.DeserializePartial(&root);
128 CHECK(root->IsContext());
129 return Handle<Context>(Context::cast(root));
130}
131
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000132} } // namespace v8::internal