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