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"
354c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org#include "src/compilation-cache.h"
36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/debug.h"
373e3d253bd8018d7627422bf55a5c7bb7e7d6ad7emachenbach@chromium.org#include "src/heap/spaces.h"
38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/natives.h"
39196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/objects.h"
40196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/runtime.h"
41196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/scopeinfo.h"
42196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/serialize.h"
43196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/snapshot.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
489a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
499a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtemplate <class T>
509a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic Address AddressOf(T id) {
51528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  return ExternalReference(id, CcTest::i_isolate()).address();
529a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
539a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
549a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
559a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comtemplate <class T>
569a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic uint32_t Encode(const ExternalReferenceEncoder& encoder, T id) {
579a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return encoder.Encode(AddressOf(id));
589a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
599a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comstatic int make_code(TypeCode type, int id) {
629a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  return static_cast<uint32_t>(type) << kReferenceTypeShift | id;
639a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
649a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
659a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
669a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ExternalReferenceEncoder) {
67528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
687c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  v8::V8::Initialize();
697c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
703d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  ExternalReferenceEncoder encoder(isolate);
717979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  CHECK_EQ(make_code(BUILTIN, Builtins::kArrayCode),
727979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org           Encode(encoder, Builtins::kArrayCode));
733a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org  CHECK_EQ(make_code(v8::internal::RUNTIME_FUNCTION, Runtime::kAbort),
749a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com           Encode(encoder, Runtime::kAbort));
75c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ExternalReference stack_limit_address =
76ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      ExternalReference::address_of_stack_limit(isolate);
779d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(make_code(UNCLASSIFIED, 2),
78c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org           encoder.Encode(stack_limit_address.address()));
79c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org  ExternalReference real_stack_limit_address =
80ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org      ExternalReference::address_of_real_stack_limit(isolate);
819d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(make_code(UNCLASSIFIED, 3),
82c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org           encoder.Encode(real_stack_limit_address.address()));
839d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(make_code(UNCLASSIFIED, 8),
84ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org           encoder.Encode(ExternalReference::debug_break(isolate).address()));
859d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(
869d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      make_code(UNCLASSIFIED, 4),
879d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      encoder.Encode(ExternalReference::new_space_start(isolate).address()));
889d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(
899d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      make_code(UNCLASSIFIED, 1),
909d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org      encoder.Encode(ExternalReference::roots_array_start(isolate).address()));
919d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org  CHECK_EQ(make_code(UNCLASSIFIED, 34),
92003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org           encoder.Encode(ExternalReference::cpu_features().address()));
939a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
949a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
959a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
969a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.comTEST(ExternalReferenceDecoder) {
97528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
987c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org  v8::V8::Initialize();
997c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.org
1003d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  ExternalReferenceDecoder decoder(isolate);
1017979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org  CHECK_EQ(AddressOf(Builtins::kArrayCode),
1027979bbb1df2eaff193e85d44c8da1ffa1525b7fcfschneider@chromium.org           decoder.Decode(make_code(BUILTIN, Builtins::kArrayCode)));
1039a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com  CHECK_EQ(AddressOf(Runtime::kAbort),
1043a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org           decoder.Decode(make_code(v8::internal::RUNTIME_FUNCTION,
1053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org                                    Runtime::kAbort)));
106ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK_EQ(ExternalReference::address_of_stack_limit(isolate).address(),
1079d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org           decoder.Decode(make_code(UNCLASSIFIED, 2)));
108ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK_EQ(ExternalReference::address_of_real_stack_limit(isolate).address(),
1099d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org           decoder.Decode(make_code(UNCLASSIFIED, 3)));
110ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK_EQ(ExternalReference::debug_break(isolate).address(),
1119d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org           decoder.Decode(make_code(UNCLASSIFIED, 8)));
112ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org  CHECK_EQ(ExternalReference::new_space_start(isolate).address(),
1139d72b8dd94263d9f500f18255d67f0c7b8c3527amachenbach@chromium.org           decoder.Decode(make_code(UNCLASSIFIED, 4)));
1149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
1159a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
1169a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
117b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgclass FileByteSink : public SnapshotByteSink {
118b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org public:
119b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  explicit FileByteSink(const char* snapshot_file) {
1205de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    fp_ = v8::base::OS::FOpen(snapshot_file, "wb");
121b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    file_name_ = snapshot_file;
122b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    if (fp_ == NULL) {
123b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      PrintF("Unable to write to snapshot file \"%s\"\n", snapshot_file);
124b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      exit(1);
125b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    }
126b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
127b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  virtual ~FileByteSink() {
128b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    if (fp_ != NULL) {
129b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      fclose(fp_);
130b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    }
131b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
13270d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org  virtual void Put(byte b, const char* description) {
133b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    if (fp_ != NULL) {
13470d29e1ad7a6f1c163f625252ca32ecc522cb155machenbach@chromium.org      fputc(b, fp_);
135b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    }
136b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
137b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  virtual int Position() {
138b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org    return ftell(fp_);
139b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
140b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  void WriteSpaceUsed(
141b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int new_space_used,
142b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int pointer_space_used,
143b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int data_space_used,
144b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int code_space_used,
145b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int map_space_used,
14641728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      int cell_space_used,
14741728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      int property_cell_space_used);
148b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
149b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org private:
150b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  FILE* fp_;
151b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  const char* file_name_;
152b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org};
153b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
154b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
155b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.orgvoid FileByteSink::WriteSpaceUsed(
156b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int new_space_used,
157b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int pointer_space_used,
158b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int data_space_used,
159b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int code_space_used,
160b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org      int map_space_used,
16141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      int cell_space_used,
16241728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      int property_cell_space_used) {
163b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  int file_name_length = StrLength(file_name_) + 10;
164b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  Vector<char> name = Vector<char>::New(file_name_length + 1);
16570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org  SNPrintF(name, "%s.size", file_name_);
1665de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  FILE* fp = v8::base::OS::FOpen(name.start(), "w");
167e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org  name.Dispose();
168b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "new %d\n", new_space_used);
169b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "pointer %d\n", pointer_space_used);
170b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "data %d\n", data_space_used);
171b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "code %d\n", code_space_used);
172b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "map %d\n", map_space_used);
173b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fprintf(fp, "cell %d\n", cell_space_used);
17441728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org  fprintf(fp, "property cell %d\n", property_cell_space_used);
175b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  fclose(fp);
176b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
177b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
178b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
1793d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.orgstatic bool WriteToFile(Isolate* isolate, const char* snapshot_file) {
180b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  FileByteSink file(snapshot_file);
1813d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org  StartupSerializer ser(isolate, &file);
182b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  ser.Serialize();
18356c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
18456c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org  file.WriteSpaceUsed(
18556c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      ser.CurrentAllocationAddress(NEW_SPACE),
18656c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      ser.CurrentAllocationAddress(OLD_POINTER_SPACE),
18756c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      ser.CurrentAllocationAddress(OLD_DATA_SPACE),
18856c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      ser.CurrentAllocationAddress(CODE_SPACE),
18956c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org      ser.CurrentAllocationAddress(MAP_SPACE),
19041728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      ser.CurrentAllocationAddress(CELL_SPACE),
19141728483f231e098a8dd85f109b5a30e6ccc3c39danno@chromium.org      ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE));
19256c14afabc547f0a8ab2e24d789c00030f8df892ulan@chromium.org
193b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  return true;
194b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
195b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
196b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
197a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic void Serialize(v8::Isolate* isolate) {
1983811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // We have to create one context.  One reason for this is so that the builtins
1993811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // can be loaded from v8natives.js and their addresses can be processed.  This
2003811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // will clear the pending fixups array, which would otherwise contain GC roots
2013811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  // that would confuse the serialization/deserialization process.
202a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate::Scope isolate_scope(isolate);
20357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  {
20457ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::HandleScope scope(isolate);
20557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org    v8::Context::New(isolate);
20657ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  }
207528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
208a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Isolate* internal_isolate = reinterpret_cast<Isolate*>(isolate);
209528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  internal_isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "serialize");
210528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  WriteToFile(internal_isolate, FLAG_testing_serialization_file);
2119a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
2129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
2143811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org// Test that the whole heap can be serialized.
215a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(Serialize) {
2165a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
217a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::CreateParams params;
218a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    params.enable_serializer = true;
219a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = v8::Isolate::New(params);
220a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Serialize(isolate);
2215a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
2223811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
2233811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
2243811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
225ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org// Test that heap serialization is non-destructive.
226a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(SerializeTwice) {
2275a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
228a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::CreateParams params;
229a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    params.enable_serializer = true;
230a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = v8::Isolate::New(params);
231a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Serialize(isolate);
232a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Serialize(isolate);
2335a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
234ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org}
235ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
236ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
2379a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com//----------------------------------------------------------------------------
2389a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Tests that the heap can be deserialized.
2399a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
240975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
241975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgstatic void ReserveSpaceForSnapshot(Deserializer* deserializer,
242975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org                                    const char* file_name) {
243975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  int file_name_length = StrLength(file_name) + 10;
244975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  Vector<char> name = Vector<char>::New(file_name_length + 1);
245975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  SNPrintF(name, "%s.size", file_name);
2465de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org  FILE* fp = v8::base::OS::FOpen(name.start(), "r");
247975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  name.Dispose();
248975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  int new_size, pointer_size, data_size, code_size, map_size, cell_size,
249975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org      property_cell_size;
250975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef _MSC_VER
251975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // Avoid warning about unsafe fscanf from MSVC.
252975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // Please note that this is only fine if %c and %s are not being used.
253975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#define fscanf fscanf_s
254975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif
255975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "new %d\n", &new_size));
256975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "pointer %d\n", &pointer_size));
257975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "data %d\n", &data_size));
258975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "code %d\n", &code_size));
259975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "map %d\n", &map_size));
260975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "cell %d\n", &cell_size));
261975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  CHECK_EQ(1, fscanf(fp, "property cell %d\n", &property_cell_size));
262975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#ifdef _MSC_VER
263975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#undef fscanf
264975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#endif
265975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  fclose(fp);
266975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(NEW_SPACE, new_size);
267975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(OLD_POINTER_SPACE, pointer_size);
268975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(OLD_DATA_SPACE, data_size);
269975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(CODE_SPACE, code_size);
270975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(MAP_SPACE, map_size);
271975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(CELL_SPACE, cell_size);
272975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  deserializer->set_reservation(PROPERTY_CELL_SPACE, property_cell_size);
273975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org}
274975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
275975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
276a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgv8::Isolate* InitializeFromFile(const char* snapshot_file) {
277975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  int len;
278975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  byte* str = ReadBytes(snapshot_file, &len);
279a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  if (!str) return NULL;
280a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* v8_isolate = NULL;
281975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  {
282975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org    SnapshotByteSource source(str, len);
283975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org    Deserializer deserializer(&source);
284975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org    ReserveSpaceForSnapshot(&deserializer, snapshot_file);
285a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Isolate* isolate = Isolate::NewForTesting();
286a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
287a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::Scope isolate_scope(v8_isolate);
288a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    isolate->Init(&deserializer);
289975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  }
290975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  DeleteArray(str);
291a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return v8_isolate;
292975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org}
293975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
294975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
295a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic v8::Isolate* Deserialize() {
296a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* isolate = InitializeFromFile(FLAG_testing_serialization_file);
297a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CHECK(isolate);
298a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  return isolate;
2999a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3009a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3019a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
302a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgstatic void SanityCheck(v8::Isolate* v8_isolate) {
303a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate);
304a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::HandleScope scope(v8_isolate);
305c859c4f83f6ec3e010213dbbe447cc1f927d01c5svenpanne@chromium.org#ifdef VERIFY_HEAP
306a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  isolate->heap()->Verify();
3079a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com#endif
308d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  CHECK(isolate->global_object()->IsJSObject());
309d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  CHECK(isolate->native_context()->IsContext());
310a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  CHECK(isolate->heap()->string_table()->IsStringTable());
3112c81ceb7f1e1ccf5f304be0646f4c1375941a7f2machenbach@chromium.org  isolate->factory()->InternalizeOneByteString(STATIC_CHAR_VECTOR("Empty"));
3129a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com}
3139a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
3149a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
315a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(Deserialize, Serialize) {
3165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  // The serialize-deserialize tests only work if the VM is built without
3175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  // serialization.  That doesn't matter.  We don't need to be able to
3185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  // serialize a snapshot in a VM that is booted from a snapshot.
3195a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
320a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = Deserialize();
321a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    {
322a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::HandleScope handle_scope(isolate);
323a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(isolate);
3249a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
325a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Context> env = v8::Context::New(isolate);
326a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env->Enter();
327ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
328a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      SanityCheck(isolate);
329a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
330a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    isolate->Dispose();
3315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  }
332ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org}
333ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
334ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
335a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerialization,
336a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                             SerializeTwice) {
3375a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
338a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = Deserialize();
339a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    {
340a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(isolate);
341a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::HandleScope handle_scope(isolate);
342ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
343a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Context> env = v8::Context::New(isolate);
344a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env->Enter();
3453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
346a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      SanityCheck(isolate);
347a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
348a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    isolate->Dispose();
3495d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  }
3503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
3513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
353a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(DeserializeAndRunScript2, Serialize) {
3545a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
355a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = Deserialize();
356a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    {
357a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(isolate);
358a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::HandleScope handle_scope(isolate);
359a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
3609a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com
361a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Context> env = v8::Context::New(isolate);
362a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env->Enter();
3633811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
364a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      const char* c_source = "\"1234\".length";
365a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source);
366a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Script> script = v8::Script::Compile(source);
367a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CHECK_EQ(4, script->Run()->Int32Value());
368a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
369a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    isolate->Dispose();
3705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  }
3713811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
3723811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
3733811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
374a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(DeserializeFromSecondSerializationAndRunScript2,
375a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org                             SerializeTwice) {
3765a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
377a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* isolate = Deserialize();
378a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    {
379a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(isolate);
380a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::HandleScope handle_scope(isolate);
381ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
382a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Context> env = v8::Context::New(isolate);
383a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env->Enter();
384ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
385a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      const char* c_source = "\"1234\".length";
386a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::String> source = v8::String::NewFromUtf8(isolate, c_source);
387a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Local<v8::Script> script = v8::Script::Compile(source);
388a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      CHECK_EQ(4, script->Run()->Int32Value());
389a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
390a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    isolate->Dispose();
3915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org  }
392ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org}
393ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
394ac6aa175ab59d65cfb7a88dbb621e1d7f1a80b8fsgjesse@chromium.org
395a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(PartialSerialization) {
3965a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
397a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::CreateParams params;
398a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    params.enable_serializer = true;
399a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* v8_isolate = v8::Isolate::New(params);
400a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate);
401a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Enter();
40298d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org    {
403a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Heap* heap = isolate->heap();
4040c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
405a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Persistent<v8::Context> env;
406a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
407a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        HandleScope scope(isolate);
408a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        env.Reset(v8_isolate, v8::Context::New(v8_isolate));
409a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
410a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      DCHECK(!env.IsEmpty());
411a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
412a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::HandleScope handle_scope(v8_isolate);
413a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::Local<v8::Context>::New(v8_isolate, env)->Enter();
414a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
415a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      // Make sure all builtin scripts are cached.
416a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
417a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        HandleScope scope(isolate);
418a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        for (int i = 0; i < Natives::GetBuiltinsCount(); i++) {
419a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          isolate->bootstrapper()->NativesSourceLookup(i);
420a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        }
421a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
422a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      heap->CollectAllGarbage(Heap::kNoGCFlags);
423a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      heap->CollectAllGarbage(Heap::kNoGCFlags);
424a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
425a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Object* raw_foo;
426a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
427a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::HandleScope handle_scope(v8_isolate);
428a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::Local<v8::String> foo = v8::String::NewFromUtf8(v8_isolate, "foo");
429a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        DCHECK(!foo.IsEmpty());
430a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        raw_foo = *(v8::Utils::OpenHandle(*foo));
431a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
4320c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
433a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      int file_name_length = StrLength(FLAG_testing_serialization_file) + 10;
434a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
435a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
43698d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
437a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
438a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::HandleScope handle_scope(v8_isolate);
439a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::Local<v8::Context>::New(v8_isolate, env)->Exit();
440a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
441a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env.Reset();
442a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
443a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      FileByteSink startup_sink(startup_name.start());
444a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      StartupSerializer startup_serializer(isolate, &startup_sink);
445a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_serializer.SerializeStrongReferences();
446a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
447a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      FileByteSink partial_sink(FLAG_testing_serialization_file);
448a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      PartialSerializer p_ser(isolate, &startup_serializer, &partial_sink);
449a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      p_ser.Serialize(&raw_foo);
450a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_serializer.SerializeWeakReferences();
451a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
452a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      partial_sink.WriteSpaceUsed(
453a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(NEW_SPACE),
454a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(OLD_POINTER_SPACE),
455a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(OLD_DATA_SPACE),
456a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(CODE_SPACE),
457a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(MAP_SPACE),
458a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(CELL_SPACE),
459a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE));
460a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
461a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_sink.WriteSpaceUsed(
462a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(NEW_SPACE),
463a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(OLD_POINTER_SPACE),
464a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(OLD_DATA_SPACE),
465a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(CODE_SPACE),
466a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(MAP_SPACE),
467a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(CELL_SPACE),
468a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(PROPERTY_CELL_SPACE));
469a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_name.Dispose();
470c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    }
471a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Exit();
472a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Dispose();
4735a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
474b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org}
4750c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
4760c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
477a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(PartialDeserialization, PartialSerialization) {
478975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
4795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    int file_name_length = StrLength(FLAG_testing_serialization_file) + 10;
4805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
48170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
4825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
483a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start());
484a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(v8_isolate);
485e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    startup_name.Dispose();
48698d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org    {
487a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(v8_isolate);
48898d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
489a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      const char* file_name = FLAG_testing_serialization_file;
49098d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
491a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      int snapshot_size = 0;
492a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      byte* snapshot = ReadBytes(file_name, &snapshot_size);
493a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
494a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate);
495a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Object* root;
496a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
497a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        SnapshotByteSource source(snapshot, snapshot_size);
498a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        Deserializer deserializer(&source);
499a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        ReserveSpaceForSnapshot(&deserializer, file_name);
500a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        deserializer.DeserializePartial(isolate, &root);
501a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(root->IsString());
502a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
503a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      HandleScope handle_scope(isolate);
504a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Handle<Object> root_handle(root, isolate);
505a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
506a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
507a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Object* root2;
508a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
509a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        SnapshotByteSource source(snapshot, snapshot_size);
510a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        Deserializer deserializer(&source);
511a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        ReserveSpaceForSnapshot(&deserializer, file_name);
512a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        deserializer.DeserializePartial(isolate, &root2);
513a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(root2->IsString());
514a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(*root_handle == root2);
515a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
5165d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    }
517a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Dispose();
518b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
5195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org}
520b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org
5215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
522a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_TEST(ContextSerialization) {
5235a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
524a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate::CreateParams params;
525a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    params.enable_serializer = true;
526a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* v8_isolate = v8::Isolate::New(params);
527a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate);
528c03a1924dcc113678c0ebe58aa7d3c855a657719yangguo@chromium.org    Heap* heap = isolate->heap();
52998d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org    {
530a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(v8_isolate);
531a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
532a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Persistent<v8::Context> env;
533a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
534a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        HandleScope scope(isolate);
535a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        env.Reset(v8_isolate, v8::Context::New(v8_isolate));
536cd697a038d173b960e8a1b3c8867fb2b19cd80bfmachenbach@chromium.org      }
537a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      DCHECK(!env.IsEmpty());
538a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
539a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::HandleScope handle_scope(v8_isolate);
540a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::Local<v8::Context>::New(v8_isolate, env)->Enter();
541a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
542a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      // Make sure all builtin scripts are cached.
543a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
544a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        HandleScope scope(isolate);
545a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        for (int i = 0; i < Natives::GetBuiltinsCount(); i++) {
546a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          isolate->bootstrapper()->NativesSourceLookup(i);
547a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        }
548a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
549a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      // If we don't do this then we end up with a stray root pointing at the
550a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      // context even after we have disposed of env.
551a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      heap->CollectAllGarbage(Heap::kNoGCFlags);
5525d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
553a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      int file_name_length = StrLength(FLAG_testing_serialization_file) + 10;
554a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
555a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
5565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
557a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
558a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::HandleScope handle_scope(v8_isolate);
559a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        v8::Local<v8::Context>::New(v8_isolate, env)->Exit();
560a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
56198d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
562a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      i::Object* raw_context = *v8::Utils::OpenPersistent(env);
563a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
564a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      env.Reset();
565a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
566a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      FileByteSink startup_sink(startup_name.start());
567a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      StartupSerializer startup_serializer(isolate, &startup_sink);
568a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_serializer.SerializeStrongReferences();
569a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
570a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      FileByteSink partial_sink(FLAG_testing_serialization_file);
571a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      PartialSerializer p_ser(isolate, &startup_serializer, &partial_sink);
572a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      p_ser.Serialize(&raw_context);
573a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_serializer.SerializeWeakReferences();
574a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
575a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      partial_sink.WriteSpaceUsed(
576a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(NEW_SPACE),
577a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(OLD_POINTER_SPACE),
578a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(OLD_DATA_SPACE),
579a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(CODE_SPACE),
580a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(MAP_SPACE),
581a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(CELL_SPACE),
582a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          p_ser.CurrentAllocationAddress(PROPERTY_CELL_SPACE));
583a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
584a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_sink.WriteSpaceUsed(
585a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(NEW_SPACE),
586a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(OLD_POINTER_SPACE),
587a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(OLD_DATA_SPACE),
588a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(CODE_SPACE),
589a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(MAP_SPACE),
590a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(CELL_SPACE),
591a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org          startup_serializer.CurrentAllocationAddress(PROPERTY_CELL_SPACE));
592a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      startup_name.Dispose();
593a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    }
594a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Dispose();
5955a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  }
5965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org}
5975d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
5985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
599a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.orgUNINITIALIZED_DEPENDENT_TEST(ContextDeserialization, ContextSerialization) {
6005a11aaf63fdb7843c9b116fdb84ee35b0a980ea6yangguo@chromium.org  if (!Snapshot::HaveASnapshotToStartFrom()) {
6015d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    int file_name_length = StrLength(FLAG_testing_serialization_file) + 10;
6025d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
60370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org    SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
6045d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org
605a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8::Isolate* v8_isolate = InitializeFromFile(startup_name.start());
606a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    CHECK(v8_isolate);
607e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org    startup_name.Dispose();
60898d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org    {
609a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      v8::Isolate::Scope isolate_scope(v8_isolate);
61098d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
611a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      const char* file_name = FLAG_testing_serialization_file;
61298d807af7db2de0653f82ec1f9639782d5ae5195jochen@chromium.org
613a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      int snapshot_size = 0;
614a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      byte* snapshot = ReadBytes(file_name, &snapshot_size);
615a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
616a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Isolate* isolate = reinterpret_cast<Isolate*>(v8_isolate);
617a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Object* root;
618a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
619a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        SnapshotByteSource source(snapshot, snapshot_size);
620a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        Deserializer deserializer(&source);
621a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        ReserveSpaceForSnapshot(&deserializer, file_name);
622a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        deserializer.DeserializePartial(isolate, &root);
623a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(root->IsContext());
624a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
625a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      HandleScope handle_scope(isolate);
626a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Handle<Object> root_handle(root, isolate);
627a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
628a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org
629a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      Object* root2;
630a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      {
631a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        SnapshotByteSource source(snapshot, snapshot_size);
632a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        Deserializer deserializer(&source);
633a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        ReserveSpaceForSnapshot(&deserializer, file_name);
634a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        deserializer.DeserializePartial(isolate, &root2);
635a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(root2->IsContext());
636a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org        CHECK(*root_handle != root2);
637a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org      }
6385d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org    }
639a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org    v8_isolate->Dispose();
640b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org  }
6410c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org}
6420c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
6430c20e676f8a0209982ff89e5a9c707771748a585fschneider@chromium.org
6443811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgTEST(TestThatAlwaysSucceeds) {
6453811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
6463811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6473811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6483811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgTEST(TestThatAlwaysFails) {
6493811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  bool ArtificialFailure = false;
6503811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  CHECK(ArtificialFailure);
6513811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
6523811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6533811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org
6543811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.orgDEPENDENT_TEST(DependentTestThatAlwaysFails, TestThatAlwaysSucceeds) {
6553811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  bool ArtificialFailure2 = false;
6563811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org  CHECK(ArtificialFailure2);
6573811b436bf328d2ace6fe79ce99aeda71f9f06d3ager@chromium.org}
6589bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6599bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6609bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.orgint CountBuiltins() {
6619bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  // Check that we have not deserialized any additional builtin.
6629bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  HeapIterator iterator(CcTest::heap());
6639bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  DisallowHeapAllocation no_allocation;
6649bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  int counter = 0;
6659bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  for (HeapObject* obj = iterator.next(); obj != NULL; obj = iterator.next()) {
6669bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org    if (obj->IsCode() && Code::cast(obj)->kind() == Code::BUILTIN) counter++;
6679bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  }
6689bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  return counter;
6699bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org}
6709bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6719bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
672d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgTEST(SerializeToplevelOnePlusOne) {
6739bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  FLAG_serialize_toplevel = true;
674d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  LocalContext context;
6754c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
6764c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  isolate->compilation_cache()->Disable();  // Disable same-isolate code cache.
6779bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6784c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
6799bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6804c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  const char* source = "1 + 1";
6819bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6824c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<String> orig_source = isolate->factory()
6834c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   ->NewStringFromUtf8(CStrVector(source))
6844c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   .ToHandleChecked();
6854c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<String> copy_source = isolate->factory()
6864c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   ->NewStringFromUtf8(CStrVector(source))
6874c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   .ToHandleChecked();
6884c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(!orig_source.is_identical_to(copy_source));
6894c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(orig_source->Equals(*copy_source));
6909bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6919bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  ScriptData* cache = NULL;
6929bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6934c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<SharedFunctionInfo> orig = Compiler::CompileScript(
6944c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      orig_source, Handle<String>(), 0, 0, false,
6954c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      Handle<Context>(isolate->native_context()), NULL, &cache,
6964c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      v8::ScriptCompiler::kProduceCodeCache, NOT_NATIVES_CODE);
6979bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
6989bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  int builtins_count = CountBuiltins();
6999bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
7004c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<SharedFunctionInfo> copy;
7014c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  {
7024c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    DisallowCompilation no_compile_expected(isolate);
7034c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    copy = Compiler::CompileScript(
7044c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        copy_source, Handle<String>(), 0, 0, false,
7054c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        Handle<Context>(isolate->native_context()), NULL, &cache,
7064c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        v8::ScriptCompiler::kConsumeCodeCache, NOT_NATIVES_CODE);
7074c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  }
7089bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
709d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK_NE(*orig, *copy);
7104c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(Script::cast(copy->script())->source() == *copy_source);
711d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
712d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<JSFunction> copy_fun =
7139bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org      isolate->factory()->NewFunctionFromSharedFunctionInfo(
714d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org          copy, isolate->native_context());
7159bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
716d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<Object> copy_result =
717d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      Execution::Call(isolate, copy_fun, global, 0, NULL).ToHandleChecked();
718d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK_EQ(2, Handle<Smi>::cast(copy_result)->value());
719d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
720d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK_EQ(builtins_count, CountBuiltins());
721d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
722d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  delete cache;
723d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org}
724d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
725d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
726d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.orgTEST(SerializeToplevelInternalizedString) {
727d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  FLAG_serialize_toplevel = true;
728d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  LocalContext context;
7294c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Isolate* isolate = CcTest::i_isolate();
7304c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  isolate->compilation_cache()->Disable();  // Disable same-isolate code cache.
7314c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org
732d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  v8::HandleScope scope(CcTest::isolate());
733d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
7344c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  const char* source = "'string1'";
7359bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
7364c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<String> orig_source = isolate->factory()
7374c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   ->NewStringFromUtf8(CStrVector(source))
7384c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   .ToHandleChecked();
7394c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<String> copy_source = isolate->factory()
7404c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   ->NewStringFromUtf8(CStrVector(source))
7414c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org                                   .ToHandleChecked();
7424c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(!orig_source.is_identical_to(copy_source));
7434c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(orig_source->Equals(*copy_source));
744d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
745d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<JSObject> global(isolate->context()->global_object());
746d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  ScriptData* cache = NULL;
747d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
7484c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<SharedFunctionInfo> orig = Compiler::CompileScript(
7494c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      orig_source, Handle<String>(), 0, 0, false,
7504c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      Handle<Context>(isolate->native_context()), NULL, &cache,
7514c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org      v8::ScriptCompiler::kProduceCodeCache, NOT_NATIVES_CODE);
752d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<JSFunction> orig_fun =
753d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      isolate->factory()->NewFunctionFromSharedFunctionInfo(
754d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org          orig, isolate->native_context());
755d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<Object> orig_result =
756d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      Execution::Call(isolate, orig_fun, global, 0, NULL).ToHandleChecked();
757d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK(orig_result->IsInternalizedString());
758d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
759d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  int builtins_count = CountBuiltins();
760d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
7614c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  Handle<SharedFunctionInfo> copy;
7624c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  {
7634c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    DisallowCompilation no_compile_expected(isolate);
7644c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org    copy = Compiler::CompileScript(
7654c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        copy_source, Handle<String>(), 0, 0, false,
7664c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        Handle<Context>(isolate->native_context()), NULL, &cache,
7674c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org        v8::ScriptCompiler::kConsumeCodeCache, NOT_NATIVES_CODE);
7684c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  }
769d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK_NE(*orig, *copy);
7704c3ce7c3fd2802da8f91c6516a9c9aea3cd93f1emachenbach@chromium.org  CHECK(Script::cast(copy->script())->source() == *copy_source);
771d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
772d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<JSFunction> copy_fun =
773d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      isolate->factory()->NewFunctionFromSharedFunctionInfo(
774d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org          copy, isolate->native_context());
775d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK_NE(*orig_fun, *copy_fun);
776d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<Object> copy_result =
777d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      Execution::Call(isolate, copy_fun, global, 0, NULL).ToHandleChecked();
778d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK(orig_result.is_identical_to(copy_result));
779d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  Handle<String> expected =
780d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org      isolate->factory()->NewStringFromAsciiChecked("string1");
781d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org
782d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org  CHECK(Handle<String>::cast(copy_result)->Equals(*expected));
7839bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  CHECK_EQ(builtins_count, CountBuiltins());
7849bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org
7859bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org  delete cache;
7869bf7aff6cc5ed8807b7b2abc11b6cf77b928ded1machenbach@chromium.org}
7877c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
7887c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
7897c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.orgTEST(SerializeToplevelIsolates) {
7907c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  FLAG_serialize_toplevel = true;
7917c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
7927c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  const char* source = "function f() { return 'abc'; }; f() + 'def'";
7937c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  v8::ScriptCompiler::CachedData* cache;
7947c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
795f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  v8::Isolate* isolate1 = v8::Isolate::New();
7967c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  {
797f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::Isolate::Scope iscope(isolate1);
798f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::HandleScope scope(isolate1);
799f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::Local<v8::Context> context = v8::Context::New(isolate1);
8007c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Context::Scope context_scope(context);
8017c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
8027c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::String> source_str = v8_str(source);
8037c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::ScriptOrigin origin(v8_str("test"));
8047c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::ScriptCompiler::Source source(source_str, origin);
8057c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::UnboundScript> script = v8::ScriptCompiler::CompileUnbound(
806f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org        isolate1, &source, v8::ScriptCompiler::kProduceCodeCache);
8077c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    const v8::ScriptCompiler::CachedData* data = source.GetCachedData();
8087c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    // Persist cached data.
8097c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    uint8_t* buffer = NewArray<uint8_t>(data->length);
8107c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    MemCopy(buffer, data->data, data->length);
8117c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    cache = new v8::ScriptCompiler::CachedData(
8127c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org        buffer, data->length, v8::ScriptCompiler::CachedData::BufferOwned);
8137c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
8147c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::Value> result = script->BindToCurrentContext()->Run();
8157c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    CHECK(result->ToString()->Equals(v8_str("abcdef")));
8167c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
817f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  isolate1->Dispose();
8187c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
819a2c0c1516848536a514b3178d2c040b7df0ceb5bmachenbach@chromium.org  v8::Isolate* isolate2 = v8::Isolate::New();
8207c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  {
821f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::Isolate::Scope iscope(isolate2);
822f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::HandleScope scope(isolate2);
823f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org    v8::Local<v8::Context> context = v8::Context::New(isolate2);
8247c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Context::Scope context_scope(context);
8257c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org
8267c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::String> source_str = v8_str(source);
8277c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::ScriptOrigin origin(v8_str("test"));
8287c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::ScriptCompiler::Source source(source_str, origin, cache);
8297c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::UnboundScript> script;
8307c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    {
831f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org      DisallowCompilation no_compile(reinterpret_cast<Isolate*>(isolate2));
8327c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org      script = v8::ScriptCompiler::CompileUnbound(
833f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org          isolate2, &source, v8::ScriptCompiler::kConsumeCodeCache);
8347c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    }
8357c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    v8::Local<v8::Value> result = script->BindToCurrentContext()->Run();
8367c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org    CHECK(result->ToString()->Equals(v8_str("abcdef")));
8377c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org  }
838f2af15a6b44ea6276bdd609ee122babe52842a42machenbach@chromium.org  isolate2->Dispose();
8397c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org}
840