1b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Copyright 2007-2010 the V8 project authors. All rights reserved. 29a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Redistribution and use in source and binary forms, with or without 39a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// modification, are permitted provided that the following conditions are 49a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// met: 59a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 69a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions of source code must retain the above copyright 79a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// notice, this list of conditions and the following disclaimer. 89a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Redistributions in binary form must reproduce the above 99a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// copyright notice, this list of conditions and the following 109a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// disclaimer in the documentation and/or other materials provided 119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// with the distribution. 129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// * Neither the name of Google Inc. nor the names of its 139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// contributors may be used to endorse or promote products derived 149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// from this software without specific prior written permission. 159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// 169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 289a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#include <signal.h> 299a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include <sys/stat.h> 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bootstrapper.h" 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h" 36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/ic-inl.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/natives.h" 38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects.h" 39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h" 40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopeinfo.h" 41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h" 42196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/snapshot.h" 43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/spaces.h" 44196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 469a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comusing namespace v8::internal; 479a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 485ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic const unsigned kCounters = 256; 495ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic int local_counters[kCounters]; 505ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic const char* local_counter_names[kCounters]; 515ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 525ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org 535ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.orgstatic unsigned CounterHash(const char* s) { 545ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org unsigned hash = 0; 555ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org while (*++s) { 565ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org hash |= hash << 5; 575ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org hash += *s; 585ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 595ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return hash; 605ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org} 619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Callback receiver to track counters in test. 64a74f0daeb278665869b4b6a3bc2739e88fed93b1ager@chromium.orgstatic int* counter_function(const char* name) { 655ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org unsigned hash = CounterHash(name) % kCounters; 665ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org unsigned original_hash = hash; 675ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org USE(original_hash); 685ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org while (true) { 695ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org if (local_counter_names[hash] == name) { 705ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return &local_counters[hash]; 715ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 725ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org if (local_counter_names[hash] == 0) { 735ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org local_counter_names[hash] = name; 745ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return &local_counters[hash]; 755ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 765ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org if (strcmp(local_counter_names[hash], name) == 0) { 775ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org return &local_counters[hash]; 785ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org } 795ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org hash = (hash + 1) % kCounters; 805ec4892aef9cca42940d7d92302abf674365f6b7ager@chromium.org ASSERT(hash != original_hash); // Hash table has been filled up. 819a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com } 829a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtemplate <class T> 869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Address AddressOf(T id) { 87528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org return ExternalReference(id, CcTest::i_isolate()).address(); 889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtemplate <class T> 929a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic uint32_t Encode(const ExternalReferenceEncoder& encoder, T id) { 939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return encoder.Encode(AddressOf(id)); 949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 979a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic int make_code(TypeCode type, int id) { 989a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com return static_cast<uint32_t>(type) << kReferenceTypeShift | id; 999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ExternalReferenceEncoder) { 103528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 104ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stats_table()->SetCounterFunction(counter_function); 1057c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org v8::V8::Initialize(); 1067c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1073d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ExternalReferenceEncoder encoder(isolate); 1087979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org CHECK_EQ(make_code(BUILTIN, Builtins::kArrayCode), 1097979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org Encode(encoder, Builtins::kArrayCode)); 1103a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org CHECK_EQ(make_code(v8::internal::RUNTIME_FUNCTION, Runtime::kAbort), 1119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com Encode(encoder, Runtime::kAbort)); 1121510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference total_compile_size = 1131510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference(isolate->counters()->total_compile_size()); 1141510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(make_code(STATS_COUNTER, Counters::k_total_compile_size), 1151510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org encoder.Encode(total_compile_size.address())); 116c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org ExternalReference stack_limit_address = 117ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalReference::address_of_stack_limit(isolate); 118ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org CHECK_EQ(make_code(UNCLASSIFIED, 4), 119c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org encoder.Encode(stack_limit_address.address())); 120c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org ExternalReference real_stack_limit_address = 121ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalReference::address_of_real_stack_limit(isolate); 122c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org CHECK_EQ(make_code(UNCLASSIFIED, 5), 123c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org encoder.Encode(real_stack_limit_address.address())); 124c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com CHECK_EQ(make_code(UNCLASSIFIED, 16), 125ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org encoder.Encode(ExternalReference::debug_break(isolate).address())); 1262c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org CHECK_EQ(make_code(UNCLASSIFIED, 10), 127ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org encoder.Encode( 128ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org ExternalReference::new_space_start(isolate).address())); 129ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org CHECK_EQ(make_code(UNCLASSIFIED, 3), 130394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com encoder.Encode( 131394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com ExternalReference::roots_array_start(isolate).address())); 132003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org CHECK_EQ(make_code(UNCLASSIFIED, 52), 133003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org encoder.Encode(ExternalReference::cpu_features().address())); 1349a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1359a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1369a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ExternalReferenceDecoder) { 138528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 139ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org isolate->stats_table()->SetCounterFunction(counter_function); 1407c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org v8::V8::Initialize(); 1417c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org 1423d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org ExternalReferenceDecoder decoder(isolate); 1437979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org CHECK_EQ(AddressOf(Builtins::kArrayCode), 1447979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org decoder.Decode(make_code(BUILTIN, Builtins::kArrayCode))); 1459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com CHECK_EQ(AddressOf(Runtime::kAbort), 1463a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org decoder.Decode(make_code(v8::internal::RUNTIME_FUNCTION, 1473a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org Runtime::kAbort))); 1481510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference total_compile_size = 1491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org ExternalReference(isolate->counters()->total_compile_size()); 1501510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org CHECK_EQ(total_compile_size.address(), 1519a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com decoder.Decode( 1529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com make_code(STATS_COUNTER, 1531510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org Counters::k_total_compile_size))); 154ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_EQ(ExternalReference::address_of_stack_limit(isolate).address(), 155ab99eea3d9d0cc20698ebb39bf0fb80e3e66bffcager@chromium.org decoder.Decode(make_code(UNCLASSIFIED, 4))); 156ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_EQ(ExternalReference::address_of_real_stack_limit(isolate).address(), 157c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org decoder.Decode(make_code(UNCLASSIFIED, 5))); 158ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_EQ(ExternalReference::debug_break(isolate).address(), 159c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com decoder.Decode(make_code(UNCLASSIFIED, 16))); 160ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org CHECK_EQ(ExternalReference::new_space_start(isolate).address(), 1612c186ca6690a1cb19ec7584e71f167234587c87cwhesse@chromium.org decoder.Decode(make_code(UNCLASSIFIED, 10))); 1629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 1639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 1649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 165b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgclass FileByteSink : public SnapshotByteSink { 166b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org public: 167b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org explicit FileByteSink(const char* snapshot_file) { 168b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fp_ = OS::FOpen(snapshot_file, "wb"); 169b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org file_name_ = snapshot_file; 170b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (fp_ == NULL) { 171b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org PrintF("Unable to write to snapshot file \"%s\"\n", snapshot_file); 172b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org exit(1); 173b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 174b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 175b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org virtual ~FileByteSink() { 176b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (fp_ != NULL) { 177b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fclose(fp_); 178b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 179b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 180b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org virtual void Put(int byte, const char* description) { 181b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (fp_ != NULL) { 182b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fputc(byte, fp_); 183b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 184b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 185b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org virtual int Position() { 186b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return ftell(fp_); 187b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 188b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org void WriteSpaceUsed( 189b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int new_space_used, 190b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int pointer_space_used, 191b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int data_space_used, 192b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int code_space_used, 193b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int map_space_used, 19441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org int cell_space_used, 19541728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org int property_cell_space_used); 196b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 197b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org private: 198b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org FILE* fp_; 199b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org const char* file_name_; 200b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}; 201b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 202b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 203b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid FileByteSink::WriteSpaceUsed( 204b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int new_space_used, 205b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int pointer_space_used, 206b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int data_space_used, 207b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int code_space_used, 208b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int map_space_used, 20941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org int cell_space_used, 21041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org int property_cell_space_used) { 211b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org int file_name_length = StrLength(file_name_) + 10; 212b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Vector<char> name = Vector<char>::New(file_name_length + 1); 21370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(name, "%s.size", file_name_); 214b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org FILE* fp = OS::FOpen(name.start(), "w"); 215e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org name.Dispose(); 216b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "new %d\n", new_space_used); 217b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "pointer %d\n", pointer_space_used); 218b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "data %d\n", data_space_used); 219b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "code %d\n", code_space_used); 220b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "map %d\n", map_space_used); 221b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fprintf(fp, "cell %d\n", cell_space_used); 22241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org fprintf(fp, "property cell %d\n", property_cell_space_used); 223b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org fclose(fp); 224b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 225b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 226b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2273d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic bool WriteToFile(Isolate* isolate, const char* snapshot_file) { 228b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org FileByteSink file(snapshot_file); 2293d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org StartupSerializer ser(isolate, &file); 230b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org ser.Serialize(); 23156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 23256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org file.WriteSpaceUsed( 23356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ser.CurrentAllocationAddress(NEW_SPACE), 23456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ser.CurrentAllocationAddress(OLD_POINTER_SPACE), 23556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ser.CurrentAllocationAddress(OLD_DATA_SPACE), 23656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ser.CurrentAllocationAddress(CODE_SPACE), 23756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ser.CurrentAllocationAddress(MAP_SPACE), 23841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ser.CurrentAllocationAddress(CELL_SPACE), 23941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE)); 24056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 241b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org return true; 242b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 243b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 244b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 2459a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void Serialize() { 2463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // We have to create one context. One reason for this is so that the builtins 2473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // can be loaded from v8natives.js and their addresses can be processed. This 2483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // will clear the pending fixups array, which would otherwise contain GC roots 2493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org // that would confuse the serialization/deserialization process. 250528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 25157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org { 25257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 25357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Context::New(isolate); 25457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 255528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org 256528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* internal_isolate = CcTest::i_isolate(); 257528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org internal_isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "serialize"); 258528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org WriteToFile(internal_isolate, FLAG_testing_serialization_file); 2599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2623811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// Test that the whole heap can be serialized. 263c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgTEST(Serialize) { 2645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 265fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CcTest::i_isolate()->enable_serializer(); 2665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org v8::V8::Initialize(); 2675a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Serialize(); 2685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 2693811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 2703811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 2713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 272ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Test that heap serialization is non-destructive. 273ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgTEST(SerializeTwice) { 2745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 275fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CcTest::i_isolate()->enable_serializer(); 2765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org v8::V8::Initialize(); 2775a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Serialize(); 2785a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Serialize(); 2795a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 280ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org} 281ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 282ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 2839a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//---------------------------------------------------------------------------- 2849a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Tests that the heap can be deserialized. 2859a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2869a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void Deserialize() { 287e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK(Snapshot::Initialize(FLAG_testing_serialization_file)); 2889a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 2899a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2909a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 2919a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic void SanityCheck() { 292528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 293528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::HandleScope scope(CcTest::isolate()); 294c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP 295528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CcTest::heap()->Verify(); 2969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif 297d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org CHECK(isolate->global_object()->IsJSObject()); 298d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org CHECK(isolate->native_context()->IsContext()); 299528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org CHECK(CcTest::heap()->string_table()->IsStringTable()); 300a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org isolate->factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR("Empty")); 3019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com} 3029a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 3039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 304245aa859d34fd516161c48ef4c69d38d9b889284iposva@chromium.orgDEPENDENT_TEST(Deserialize, Serialize) { 3055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // The serialize-deserialize tests only work if the VM is built without 3065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // serialization. That doesn't matter. We don't need to be able to 3075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // serialize a snapshot in a VM that is booted from a snapshot. 3085a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 309528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 31057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 3115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserialize(); 3129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 31357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Context> env = v8::Context::New(isolate); 3145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org env->Enter(); 315ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 3165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SanityCheck(); 3175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 318ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org} 319ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 320ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 321ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgDEPENDENT_TEST(DeserializeFromSecondSerialization, SerializeTwice) { 3225a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 323528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 32457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 3255d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserialize(); 326ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 32757ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Context> env = v8::Context::New(isolate); 3285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org env->Enter(); 3293811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3305d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SanityCheck(); 3315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 3323811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 3333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 335c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgDEPENDENT_TEST(DeserializeAndRunScript2, Serialize) { 3365a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 337528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 33857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 3395d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserialize(); 3409a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com 34157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Context> env = v8::Context::New(isolate); 3425d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org env->Enter(); 3433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org const char* c_source = "\"1234\".length"; 345f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); 3465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Local<v8::Script> script = v8::Script::Compile(source); 3475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK_EQ(4, script->Run()->Int32Value()); 3485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 3493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 3503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 3513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 352ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.orgDEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2, 353ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org SerializeTwice) { 3545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 355528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org v8::Isolate* isolate = CcTest::isolate(); 35657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::HandleScope scope(isolate); 3575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserialize(); 358ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 35957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Local<v8::Context> env = v8::Context::New(isolate); 3605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org env->Enter(); 361ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 3625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org const char* c_source = "\"1234\".length"; 363f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source); 3645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org v8::Local<v8::Script> script = v8::Script::Compile(source); 3655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK_EQ(4, script->Run()->Int32Value()); 3665d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 367ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org} 368ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 369ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org 370b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgTEST(PartialSerialization) { 3715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 372528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 373fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CcTest::i_isolate()->enable_serializer(); 3743d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::V8::Initialize(); 375c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 376c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Heap* heap = isolate->heap(); 377b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 37857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Persistent<v8::Context> env; 37957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org { 38057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org HandleScope scope(isolate); 381c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org env.Reset(v8_isolate, v8::Context::New(v8_isolate)); 38257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 3835a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org ASSERT(!env.IsEmpty()); 384c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 385c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope handle_scope(v8_isolate); 386c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(v8_isolate, env)->Enter(); 387c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 3885a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Make sure all builtin scripts are cached. 389c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org { HandleScope scope(isolate); 3905a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { 391c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org isolate->bootstrapper()->NativesSourceLookup(i); 3925a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 3930c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org } 394c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org heap->CollectAllGarbage(Heap::kNoGCFlags); 395c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org heap->CollectAllGarbage(Heap::kNoGCFlags); 396b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 3975a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Object* raw_foo; 3985a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org { 399c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope handle_scope(v8_isolate); 400f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org v8::Local<v8::String> foo = v8::String::NewFromUtf8(v8_isolate, "foo"); 4015a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org ASSERT(!foo.IsEmpty()); 4025a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org raw_foo = *(v8::Utils::OpenHandle(*foo)); 4035a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 4040c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 4055a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; 4065a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Vector<char> startup_name = Vector<char>::New(file_name_length + 1); 40770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); 4080c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 409c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 410c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope handle_scope(v8_isolate); 411c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); 412c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 413f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env.Reset(); 4140c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 4155a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org FileByteSink startup_sink(startup_name.start()); 4163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org StartupSerializer startup_serializer(isolate, &startup_sink); 4175a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org startup_serializer.SerializeStrongReferences(); 4185a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 4195a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org FileByteSink partial_sink(FLAG_testing_serialization_file); 4203d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PartialSerializer p_ser(isolate, &startup_serializer, &partial_sink); 4215a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.Serialize(&raw_foo); 4225a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org startup_serializer.SerializeWeakReferences(); 42356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 4245a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org partial_sink.WriteSpaceUsed( 4255a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(NEW_SPACE), 4265a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(OLD_POINTER_SPACE), 4275a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(OLD_DATA_SPACE), 4285a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(CODE_SPACE), 4295a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(MAP_SPACE), 43041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org p_ser.CurrentAllocationAddress(CELL_SPACE), 43141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org p_ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE)); 43256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 43356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_sink.WriteSpaceUsed( 43456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(NEW_SPACE), 43556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(OLD_POINTER_SPACE), 43656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(OLD_DATA_SPACE), 43756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(CODE_SPACE), 43856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(MAP_SPACE), 43941728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org startup_serializer.CurrentAllocationAddress(CELL_SPACE), 44041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org startup_serializer.CurrentAllocationAddress(PROPERTY_CELL_SPACE)); 44156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_name.Dispose(); 4425a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 443b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org} 4440c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 4450c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 446e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.orgstatic void ReserveSpaceForSnapshot(Deserializer* deserializer, 447e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org const char* file_name) { 448e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org int file_name_length = StrLength(file_name) + 10; 449e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org Vector<char> name = Vector<char>::New(file_name_length + 1); 45070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(name, "%s.size", file_name); 451e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org FILE* fp = OS::FOpen(name.start(), "r"); 452e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org name.Dispose(); 453e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org int new_size, pointer_size, data_size, code_size, map_size, cell_size, 454e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org property_cell_size; 455e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#ifdef _MSC_VER 456e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org // Avoid warning about unsafe fscanf from MSVC. 457e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org // Please note that this is only fine if %c and %s are not being used. 458e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#define fscanf fscanf_s 459e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#endif 460e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "new %d\n", &new_size)); 461e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size)); 462e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size)); 463e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size)); 464e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size)); 465e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size)); 466e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK_EQ(1, fscanf(fp, "property cell %d\n", &property_cell_size)); 467e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#ifdef _MSC_VER 468e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#undef fscanf 469e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org#endif 470e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org fclose(fp); 471e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(NEW_SPACE, new_size); 472e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(OLD_POINTER_SPACE, pointer_size); 473e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(OLD_DATA_SPACE, data_size); 474e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(CODE_SPACE, code_size); 475e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(MAP_SPACE, map_size); 476e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(CELL_SPACE, cell_size); 477e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org deserializer->set_reservation(PROPERTY_CELL_SPACE, property_cell_size); 478e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org} 479e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org 480e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org 4815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgDEPENDENT_TEST(PartialDeserialization, PartialSerialization) { 482e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org if (!Snapshot::IsEnabled()) { 4835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; 4845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Vector<char> startup_name = Vector<char>::New(file_name_length + 1); 48570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); 4865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 487e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK(Snapshot::Initialize(startup_name.start())); 488e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org startup_name.Dispose(); 4895d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 4905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org const char* file_name = FLAG_testing_serialization_file; 4915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 4925d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int snapshot_size = 0; 4935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org byte* snapshot = ReadBytes(file_name, &snapshot_size); 4945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 495528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 4965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Object* root; 4975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org { 4985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SnapshotByteSource source(snapshot, snapshot_size); 4995d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserializer deserializer(&source); 50056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ReserveSpaceForSnapshot(&deserializer, file_name); 5013d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org deserializer.DeserializePartial(isolate, &root); 5025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(root->IsString()); 5035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 5043d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org HandleScope handle_scope(isolate); 5053d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Handle<Object> root_handle(root, isolate); 506d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org 5075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5085d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Object* root2; 5095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org { 5105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SnapshotByteSource source(snapshot, snapshot_size); 5115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserializer deserializer(&source); 51256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ReserveSpaceForSnapshot(&deserializer, file_name); 5133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org deserializer.DeserializePartial(isolate, &root2); 5145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(root2->IsString()); 5155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(*root_handle == root2); 5165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 517b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 5185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 519b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org 5205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgTEST(ContextSerialization) { 5225a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 523528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 524fb547e07aef43e02715c5d6c1530e84bb3cbba02machenbach@chromium.org CcTest::i_isolate()->enable_serializer(); 5253d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org v8::V8::Initialize(); 526c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate); 527c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org Heap* heap = isolate->heap(); 5285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 52957ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org v8::Persistent<v8::Context> env; 53057ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org { 53157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org HandleScope scope(isolate); 532c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org env.Reset(v8_isolate, v8::Context::New(v8_isolate)); 53357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org } 5345a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org ASSERT(!env.IsEmpty()); 535c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 536c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope handle_scope(v8_isolate); 537c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(v8_isolate, env)->Enter(); 538c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 5395a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // Make sure all builtin scripts are cached. 540c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org { HandleScope scope(isolate); 5415a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org for (int i = 0; i < Natives::GetBuiltinsCount(); i++) { 542c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org isolate->bootstrapper()->NativesSourceLookup(i); 5435a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 5445d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 5455a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // If we don't do this then we end up with a stray root pointing at the 5465a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org // context even after we have disposed of env. 547c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org heap->CollectAllGarbage(Heap::kNoGCFlags); 5485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5495a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; 5505a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org Vector<char> startup_name = Vector<char>::New(file_name_length + 1); 55170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); 5525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 553c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org { 554c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::HandleScope handle_scope(v8_isolate); 555c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org v8::Local<v8::Context>::New(v8_isolate, env)->Exit(); 556c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org } 5575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 558f95d4b920abb640ab0986d138ad559a7d3b91d04danno@chromium.org i::Object* raw_context = *v8::Utils::OpenPersistent(env); 5595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 560f9841897146bc10dbb3c45f0632bb79254602c75machenbach@chromium.org env.Reset(); 5615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5625a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org FileByteSink startup_sink(startup_name.start()); 5633d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org StartupSerializer startup_serializer(isolate, &startup_sink); 5645a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org startup_serializer.SerializeStrongReferences(); 5655a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org 5665a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org FileByteSink partial_sink(FLAG_testing_serialization_file); 5673d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org PartialSerializer p_ser(isolate, &startup_serializer, &partial_sink); 5685a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.Serialize(&raw_context); 5695a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org startup_serializer.SerializeWeakReferences(); 57056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 5715a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org partial_sink.WriteSpaceUsed( 5725a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(NEW_SPACE), 5735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(OLD_POINTER_SPACE), 5745a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(OLD_DATA_SPACE), 5755a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(CODE_SPACE), 5765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org p_ser.CurrentAllocationAddress(MAP_SPACE), 57741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org p_ser.CurrentAllocationAddress(CELL_SPACE), 57841728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org p_ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE)); 57956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org 58056c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_sink.WriteSpaceUsed( 58156c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(NEW_SPACE), 58256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(OLD_POINTER_SPACE), 58356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(OLD_DATA_SPACE), 58456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(CODE_SPACE), 58556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_serializer.CurrentAllocationAddress(MAP_SPACE), 58641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org startup_serializer.CurrentAllocationAddress(CELL_SPACE), 58741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org startup_serializer.CurrentAllocationAddress(PROPERTY_CELL_SPACE)); 58856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org startup_name.Dispose(); 5895a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org } 5905d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 5915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5925d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 5935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.orgDEPENDENT_TEST(ContextDeserialization, ContextSerialization) { 5945a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org if (!Snapshot::HaveASnapshotToStartFrom()) { 5955d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int file_name_length = StrLength(FLAG_testing_serialization_file) + 10; 5965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Vector<char> startup_name = Vector<char>::New(file_name_length + 1); 59770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file); 5985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 599e3a73ec34d490a0b0ba87b96127ffb276edd4394machenbach@chromium.org CHECK(Snapshot::Initialize(startup_name.start())); 600e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org startup_name.Dispose(); 6015d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org const char* file_name = FLAG_testing_serialization_file; 6035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6045d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org int snapshot_size = 0; 6055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org byte* snapshot = ReadBytes(file_name, &snapshot_size); 6065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 607528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org Isolate* isolate = CcTest::i_isolate(); 6085d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Object* root; 6095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org { 6105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SnapshotByteSource source(snapshot, snapshot_size); 6115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserializer deserializer(&source); 61256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ReserveSpaceForSnapshot(&deserializer, file_name); 6133d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org deserializer.DeserializePartial(isolate, &root); 6145d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(root->IsContext()); 6155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 6163d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org HandleScope handle_scope(isolate); 6173d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org Handle<Object> root_handle(root, isolate); 618d4e9e2260ea982962098fd5ccae7593549f7686elrn@chromium.org 6195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 6205d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Object* root2; 6215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org { 6225d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org SnapshotByteSource source(snapshot, snapshot_size); 6235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Deserializer deserializer(&source); 62456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org ReserveSpaceForSnapshot(&deserializer, file_name); 6253d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org deserializer.DeserializePartial(isolate, &root2); 6265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(root2->IsContext()); 6275d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org CHECK(*root_handle != root2); 6285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 629b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 6300c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org} 6310c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 6320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org 6333811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgTEST(TestThatAlwaysSucceeds) { 6343811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 6353811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 6363811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 6373811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgTEST(TestThatAlwaysFails) { 6383811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org bool ArtificialFailure = false; 6393811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org CHECK(ArtificialFailure); 6403811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 6413811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 6423811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org 6433811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgDEPENDENT_TEST(DependentTestThatAlwaysFails, TestThatAlwaysSucceeds) { 6443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org bool ArtificialFailure2 = false; 6453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org CHECK(ArtificialFailure2); 6463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org} 647