1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2006-2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The common functionality when building with or without snapshots.
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "v8.h"
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "api.h"
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "serialize.h"
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block#include "snapshot.h"
35d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block#include "platform.h"
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Snapshot::Deserialize(const byte* content, int len) {
41d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  SnapshotByteSource source(content, len);
42d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  Deserializer deserializer(&source);
43d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block  return V8::Initialize(&deserializer);
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockbool Snapshot::Initialize(const char* snapshot_file) {
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (snapshot_file) {
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    int len;
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    byte* str = ReadBytes(snapshot_file, &len);
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (!str) return false;
52d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    Deserialize(str, len);
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    DeleteArray(str);
54d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return true;
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } else if (size_ > 0) {
56257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    Deserialize(raw_data_, raw_size_);
57d0582a6c46733687d045e4188a1bcd0123c758a1Steve Block    return true;
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return false;
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
623100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
633100271588b61cbc1dc472a3f2f105d2eed8497fAndrei PopescuHandle<Context> Snapshot::NewContextFromSnapshot() {
643100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  if (context_size_ == 0) {
653100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu    return Handle<Context>();
663100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  }
6744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HEAP->ReserveSpace(new_space_used_,
683100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     pointer_space_used_,
693100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     data_space_used_,
703100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     code_space_used_,
713100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     map_space_used_,
723100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     cell_space_used_,
733100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu                     large_space_used_);
74257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  SnapshotByteSource source(context_raw_data_,
75257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                            context_raw_size_);
763100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Deserializer deserializer(&source);
773100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  Object* root;
783100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  deserializer.DeserializePartial(&root);
793100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  CHECK(root->IsContext());
803100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu  return Handle<Context>(Context::cast(root));
813100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu}
823100271588b61cbc1dc472a3f2f105d2eed8497fAndrei Popescu
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} }  // namespace v8::internal
84