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