| Index: test/cctest/test-serialize.cc
|
| ===================================================================
|
| --- test/cctest/test-serialize.cc (revision 3696)
|
| +++ test/cctest/test-serialize.cc (working copy)
|
| @@ -39,6 +39,8 @@
|
| #include "cctest.h"
|
| #include "spaces.h"
|
| #include "objects.h"
|
| +#include "natives.h"
|
| +#include "bootstrapper.h"
|
|
|
| using namespace v8::internal;
|
|
|
| @@ -169,6 +171,75 @@
|
| }
|
|
|
|
|
| +class FileByteSink : public SnapshotByteSink {
|
| + public:
|
| + explicit FileByteSink(const char* snapshot_file) {
|
| + fp_ = OS::FOpen(snapshot_file, "wb");
|
| + file_name_ = snapshot_file;
|
| + if (fp_ == NULL) {
|
| + PrintF("Unable to write to snapshot file \"%s\"\n", snapshot_file);
|
| + exit(1);
|
| + }
|
| + }
|
| + virtual ~FileByteSink() {
|
| + if (fp_ != NULL) {
|
| + fclose(fp_);
|
| + }
|
| + }
|
| + virtual void Put(int byte, const char* description) {
|
| + if (fp_ != NULL) {
|
| + fputc(byte, fp_);
|
| + }
|
| + }
|
| + virtual int Position() {
|
| + return ftell(fp_);
|
| + }
|
| + void WriteSpaceUsed(
|
| + int new_space_used,
|
| + int pointer_space_used,
|
| + int data_space_used,
|
| + int code_space_used,
|
| + int map_space_used,
|
| + int cell_space_used,
|
| + int large_space_used);
|
| +
|
| + private:
|
| + FILE* fp_;
|
| + const char* file_name_;
|
| +};
|
| +
|
| +
|
| +void FileByteSink::WriteSpaceUsed(
|
| + int new_space_used,
|
| + int pointer_space_used,
|
| + int data_space_used,
|
| + int code_space_used,
|
| + int map_space_used,
|
| + int cell_space_used,
|
| + int large_space_used) {
|
| + int file_name_length = strlen(file_name_) + 10;
|
| + Vector<char> name = Vector<char>::New(file_name_length + 1);
|
| + OS::SNPrintF(name, "%s.size", file_name_);
|
| + FILE* fp = OS::FOpen(name.start(), "w");
|
| + fprintf(fp, "new %d\n", new_space_used);
|
| + fprintf(fp, "pointer %d\n", pointer_space_used);
|
| + fprintf(fp, "data %d\n", data_space_used);
|
| + fprintf(fp, "code %d\n", code_space_used);
|
| + fprintf(fp, "map %d\n", map_space_used);
|
| + fprintf(fp, "cell %d\n", cell_space_used);
|
| + fprintf(fp, "large %d\n", large_space_used);
|
| + fclose(fp);
|
| +}
|
| +
|
| +
|
| +static bool WriteToFile(const char* snapshot_file) {
|
| + FileByteSink file(snapshot_file);
|
| + StartupSerializer ser(&file);
|
| + ser.Serialize();
|
| + return true;
|
| +}
|
| +
|
| +
|
| static void Serialize() {
|
| // We have to create one context. One reason for this is so that the builtins
|
| // can be loaded from v8natives.js and their addresses can be processed. This
|
| @@ -176,7 +247,7 @@
|
| // that would confuse the serialization/deserialization process.
|
| v8::Persistent<v8::Context> env = v8::Context::New();
|
| env.Dispose();
|
| - Snapshot::WriteToFile(FLAG_testing_serialization_file);
|
| + WriteToFile(FLAG_testing_serialization_file);
|
| }
|
|
|
|
|
| @@ -273,95 +344,63 @@
|
| }
|
|
|
|
|
| -class FileByteSink : public SnapshotByteSink {
|
| - public:
|
| - explicit FileByteSink(const char* snapshot_file) {
|
| - fp_ = OS::FOpen(snapshot_file, "wb");
|
| - file_name_ = snapshot_file;
|
| - if (fp_ == NULL) {
|
| - PrintF("Unable to write to snapshot file \"%s\"\n", snapshot_file);
|
| - exit(1);
|
| +TEST(PartialSerialization) {
|
| + Serializer::Enable();
|
| + v8::V8::Initialize();
|
| +
|
| + v8::Persistent<v8::Context> env = v8::Context::New();
|
| + ASSERT(!env.IsEmpty());
|
| + env->Enter();
|
| + // Make sure all builtin scripts are cached.
|
| + { HandleScope scope;
|
| + for (int i = 0; i < Natives::GetBuiltinsCount(); i++) {
|
| + Bootstrapper::NativesSourceLookup(i);
|
| }
|
| }
|
| - virtual ~FileByteSink() {
|
| - if (fp_ != NULL) {
|
| - fclose(fp_);
|
| - }
|
| + Heap::CollectAllGarbage(true);
|
| + Heap::CollectAllGarbage(true);
|
| +
|
| + Object* raw_foo;
|
| + {
|
| + v8::HandleScope handle_scope;
|
| + v8::Local<v8::String> foo = v8::String::New("foo");
|
| + ASSERT(!foo.IsEmpty());
|
| + raw_foo = *(v8::Utils::OpenHandle(*foo));
|
| }
|
| - virtual void Put(int byte, const char* description) {
|
| - if (fp_ != NULL) {
|
| - fputc(byte, fp_);
|
| - }
|
| - }
|
| - virtual int Position() {
|
| - return ftell(fp_);
|
| - }
|
| - void WriteSpaceUsed(
|
| - int new_space_used,
|
| - int pointer_space_used,
|
| - int data_space_used,
|
| - int code_space_used,
|
| - int map_space_used,
|
| - int cell_space_used,
|
| - int large_space_used);
|
|
|
| - private:
|
| - FILE* fp_;
|
| - const char* file_name_;
|
| -};
|
| + int file_name_length = strlen(FLAG_testing_serialization_file) + 10;
|
| + Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
|
| + OS::SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
|
|
|
| + env->Exit();
|
| + env.Dispose();
|
|
|
| -void FileByteSink::WriteSpaceUsed(
|
| - int new_space_used,
|
| - int pointer_space_used,
|
| - int data_space_used,
|
| - int code_space_used,
|
| - int map_space_used,
|
| - int cell_space_used,
|
| - int large_space_used) {
|
| - int file_name_length = strlen(file_name_) + 10;
|
| - Vector<char> name = Vector<char>::New(file_name_length + 1);
|
| - OS::SNPrintF(name, "%s.size", file_name_);
|
| - FILE* fp = OS::FOpen(name.start(), "w");
|
| - fprintf(fp, "new %d\n", new_space_used);
|
| - fprintf(fp, "pointer %d\n", pointer_space_used);
|
| - fprintf(fp, "data %d\n", data_space_used);
|
| - fprintf(fp, "code %d\n", code_space_used);
|
| - fprintf(fp, "map %d\n", map_space_used);
|
| - fprintf(fp, "cell %d\n", cell_space_used);
|
| - fprintf(fp, "large %d\n", large_space_used);
|
| - fclose(fp);
|
| + FileByteSink startup_sink(startup_name.start());
|
| + StartupSerializer startup_serializer(&startup_sink);
|
| + startup_serializer.SerializeStrongReferences();
|
| +
|
| + FileByteSink partial_sink(FLAG_testing_serialization_file);
|
| + PartialSerializer p_ser(&startup_serializer, &partial_sink);
|
| + p_ser.Serialize(&raw_foo);
|
| + startup_serializer.SerializeWeakReferences();
|
| + partial_sink.WriteSpaceUsed(p_ser.CurrentAllocationAddress(NEW_SPACE),
|
| + p_ser.CurrentAllocationAddress(OLD_POINTER_SPACE),
|
| + p_ser.CurrentAllocationAddress(OLD_DATA_SPACE),
|
| + p_ser.CurrentAllocationAddress(CODE_SPACE),
|
| + p_ser.CurrentAllocationAddress(MAP_SPACE),
|
| + p_ser.CurrentAllocationAddress(CELL_SPACE),
|
| + p_ser.CurrentAllocationAddress(LO_SPACE));
|
| }
|
|
|
|
|
| -TEST(PartialSerialization) {
|
| - Serializer::Enable();
|
| - v8::V8::Initialize();
|
| - v8::Persistent<v8::Context> env = v8::Context::New();
|
| - env->Enter();
|
| +DEPENDENT_TEST(PartialDeserialization, PartialSerialization) {
|
| + int file_name_length = strlen(FLAG_testing_serialization_file) + 10;
|
| + Vector<char> startup_name = Vector<char>::New(file_name_length + 1);
|
| + OS::SNPrintF(startup_name, "%s.startup", FLAG_testing_serialization_file);
|
|
|
| - v8::HandleScope handle_scope;
|
| - v8::Local<v8::String> foo = v8::String::New("foo");
|
| + CHECK(Snapshot::Initialize(startup_name.start()));
|
|
|
| - FileByteSink file(FLAG_testing_serialization_file);
|
| - Serializer ser(&file);
|
| - i::Handle<i::String> internal_foo = v8::Utils::OpenHandle(*foo);
|
| - Object* raw_foo = *internal_foo;
|
| - ser.SerializePartial(&raw_foo);
|
| - file.WriteSpaceUsed(ser.CurrentAllocationAddress(NEW_SPACE),
|
| - ser.CurrentAllocationAddress(OLD_POINTER_SPACE),
|
| - ser.CurrentAllocationAddress(OLD_DATA_SPACE),
|
| - ser.CurrentAllocationAddress(CODE_SPACE),
|
| - ser.CurrentAllocationAddress(MAP_SPACE),
|
| - ser.CurrentAllocationAddress(CELL_SPACE),
|
| - ser.CurrentAllocationAddress(LO_SPACE));
|
| -}
|
| -
|
| -
|
| -DEPENDENT_TEST(PartialDeserialization, PartialSerialization) {
|
| - v8::V8::Initialize();
|
| const char* file_name = FLAG_testing_serialization_file;
|
| - int file_name_length = strlen(file_name) + 10;
|
| Vector<char> name = Vector<char>::New(file_name_length + 1);
|
| OS::SNPrintF(name, "%s.size", file_name);
|
| FILE* fp = OS::FOpen(name.start(), "r");
|
| @@ -392,11 +431,25 @@
|
| large_size);
|
| int snapshot_size = 0;
|
| byte* snapshot = ReadBytes(file_name, &snapshot_size);
|
| - SnapshotByteSource source(snapshot, snapshot_size);
|
| - Deserializer deserializer(&source);
|
| +
|
| Object* root;
|
| - deserializer.DeserializePartial(&root);
|
| - CHECK(root->IsString());
|
| + {
|
| + SnapshotByteSource source(snapshot, snapshot_size);
|
| + Deserializer deserializer(&source);
|
| + deserializer.DeserializePartial(&root);
|
| + CHECK(root->IsString());
|
| + }
|
| + v8::HandleScope handle_scope;
|
| + Handle<Object>root_handle(root);
|
| +
|
| + Object* root2;
|
| + {
|
| + SnapshotByteSource source(snapshot, snapshot_size);
|
| + Deserializer deserializer(&source);
|
| + deserializer.DeserializePartial(&root2);
|
| + CHECK(root2->IsString());
|
| + CHECK(*root_handle == root2);
|
| + }
|
| }
|
|
|
|
|
|
|