| Index: src/serialize.h
|
| ===================================================================
|
| --- src/serialize.h (revision 3302)
|
| +++ src/serialize.h (working copy)
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2006-2008 the V8 project authors. All rights reserved.
|
| +// Copyright 2006-2009 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -108,260 +108,6 @@
|
| };
|
|
|
|
|
| -// A Serializer recursively visits objects to construct a serialized
|
| -// representation of the Heap stored in a string. Serialization is
|
| -// destructive. We use a similar mechanism to the GC to ensure that
|
| -// each object is visited once, namely, we modify the map pointer of
|
| -// each visited object to contain the relative address in the
|
| -// appropriate space where that object will be allocated when the heap
|
| -// is deserialized.
|
| -
|
| -
|
| -// Helper classes defined in serialize.cc.
|
| -class RelativeAddress;
|
| -class SimulatedHeapSpace;
|
| -class SnapshotWriter;
|
| -class ReferenceUpdater;
|
| -
|
| -
|
| -class Serializer: public ObjectVisitor {
|
| - public:
|
| - Serializer();
|
| -
|
| - virtual ~Serializer();
|
| -
|
| - // Serialize the current state of the heap. This operation destroys the
|
| - // heap contents and the contents of the roots into the heap.
|
| - void Serialize();
|
| -
|
| - // Returns the serialized buffer. Ownership is transferred to the
|
| - // caller. Only the destructor and getters may be called after this call.
|
| - void Finalize(byte** str, int* len);
|
| -
|
| - int roots() { return roots_; }
|
| - int objects() { return objects_; }
|
| -
|
| -#ifdef DEBUG
|
| - // insert "tag" into the serialized stream
|
| - virtual void Synchronize(const char* tag);
|
| -#endif
|
| -
|
| - static bool enabled() { return serialization_enabled_; }
|
| -
|
| - static void Enable() {
|
| - if (!serialization_enabled_) {
|
| - ASSERT(!too_late_to_enable_now_);
|
| - }
|
| - serialization_enabled_ = true;
|
| - }
|
| -
|
| - static void Disable() { serialization_enabled_ = false; }
|
| - // Call this when you have made use of the fact that there is no serialization
|
| - // going on.
|
| - static void TooLateToEnableNow() { too_late_to_enable_now_ = true; }
|
| -
|
| - private:
|
| - friend class ReferenceUpdater;
|
| -
|
| - virtual void VisitPointers(Object** start, Object** end);
|
| - virtual void VisitCodeTarget(RelocInfo* rinfo);
|
| - bool IsVisited(HeapObject* obj);
|
| -
|
| - Address GetSavedAddress(HeapObject* obj);
|
| -
|
| - void SaveAddress(HeapObject* obj, Address addr);
|
| -
|
| - void PutEncodedAddress(Address addr);
|
| - // Write the global flags into the file.
|
| - void PutFlags();
|
| - // Write global information into the header of the file.
|
| - void PutHeader();
|
| - // Write the contents of the log into the file.
|
| - void PutLog();
|
| - // Serialize 'obj', and return its encoded RelativeAddress.
|
| - Address PutObject(HeapObject* obj);
|
| - // Write a stack of handles to the file bottom first.
|
| - void PutGlobalHandleStack(const List<Handle<Object> >& stack);
|
| - // Write the context stack into the file.
|
| - void PutContextStack();
|
| -
|
| - // Return the encoded RelativeAddress where this object will be
|
| - // allocated on deserialization. On the first visit of 'o',
|
| - // serialize its contents. On return, *serialized will be true iff
|
| - // 'o' has just been serialized.
|
| - Address Encode(Object* o, bool* serialized);
|
| -
|
| - // Simulate the allocation of 'obj', returning the address where it will
|
| - // be allocated on deserialization
|
| - RelativeAddress Allocate(HeapObject* obj);
|
| -
|
| - void InitializeAllocators();
|
| -
|
| - SnapshotWriter* writer_;
|
| - bool root_; // serializing a root?
|
| - int roots_; // number of roots visited
|
| - int objects_; // number of objects serialized
|
| -
|
| - static bool serialization_enabled_;
|
| - // Did we already make use of the fact that serialization was not enabled?
|
| - static bool too_late_to_enable_now_;
|
| -
|
| - int flags_end_; // The position right after the flags.
|
| -
|
| - // An array of per-space SimulatedHeapSpaces used as memory allocators.
|
| - SimulatedHeapSpace* allocator_[LAST_SPACE+1];
|
| - // A list of global handles at serialization time.
|
| - List<Object**> global_handles_;
|
| -
|
| - ExternalReferenceEncoder* reference_encoder_;
|
| -
|
| - HashMap saved_addresses_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Serializer);
|
| -};
|
| -
|
| -// Helper class to read the bytes of the serialized heap.
|
| -
|
| -class SnapshotReader {
|
| - public:
|
| - SnapshotReader(const byte* str, int len): str_(str), end_(str + len) {}
|
| -
|
| - void ExpectC(char expected) {
|
| - int c = GetC();
|
| - USE(c);
|
| - ASSERT(c == expected);
|
| - }
|
| -
|
| - int GetC() {
|
| - if (str_ >= end_) return EOF;
|
| - return *str_++;
|
| - }
|
| -
|
| - int GetInt() {
|
| - int result;
|
| - GetBytes(reinterpret_cast<Address>(&result), sizeof(result));
|
| - return result;
|
| - }
|
| -
|
| - Address GetAddress() {
|
| - Address result;
|
| - GetBytes(reinterpret_cast<Address>(&result), sizeof(result));
|
| - return result;
|
| - }
|
| -
|
| - void GetBytes(Address a, int size) {
|
| - ASSERT(str_ + size <= end_);
|
| - memcpy(a, str_, size);
|
| - str_ += size;
|
| - }
|
| -
|
| - char* GetString() {
|
| - ExpectC('[');
|
| - int size = GetInt();
|
| - ExpectC(']');
|
| - char* s = NewArray<char>(size + 1);
|
| - GetBytes(reinterpret_cast<Address>(s), size);
|
| - s[size] = 0;
|
| - return s;
|
| - }
|
| -
|
| - private:
|
| - const byte* str_;
|
| - const byte* end_;
|
| -};
|
| -
|
| -
|
| -// A Deserializer reads a snapshot and reconstructs the Object graph it defines.
|
| -
|
| -
|
| -// TODO(erikcorry): Get rid of this superclass when we are using the new
|
| -// snapshot code exclusively.
|
| -class GenericDeserializer: public ObjectVisitor {
|
| - public:
|
| - virtual void GetLog() = 0;
|
| - virtual void Deserialize() = 0;
|
| -};
|
| -
|
| -
|
| -// TODO(erikcorry): Get rid of this class.
|
| -class Deserializer: public GenericDeserializer {
|
| - public:
|
| - // Create a deserializer. The snapshot is held in str and has size len.
|
| - Deserializer(const byte* str, int len);
|
| -
|
| - virtual ~Deserializer();
|
| -
|
| - // Read the flags from the header of the file, and set those that
|
| - // should be inherited from the snapshot.
|
| - void GetFlags();
|
| -
|
| - // Read saved profiling information from the file and log it if required.
|
| - void GetLog();
|
| -
|
| - // Deserialize the snapshot into an empty heap.
|
| - void Deserialize();
|
| -
|
| - int roots() { return roots_; }
|
| - int objects() { return objects_; }
|
| -
|
| -#ifdef DEBUG
|
| - // Check for the presence of "tag" in the serialized stream
|
| - virtual void Synchronize(const char* tag);
|
| -#endif
|
| -
|
| - private:
|
| - virtual void VisitPointers(Object** start, Object** end);
|
| - virtual void VisitCodeTarget(RelocInfo* rinfo);
|
| - virtual void VisitExternalReferences(Address* start, Address* end);
|
| - virtual void VisitRuntimeEntry(RelocInfo* rinfo);
|
| -
|
| - Address GetEncodedAddress();
|
| -
|
| - // Read other global information (except flags) from the header of the file.
|
| - void GetHeader();
|
| - // Read a stack of handles from the file bottom first.
|
| - void GetGlobalHandleStack(List<Handle<Object> >* stack);
|
| - // Read the context stack from the file.
|
| - void GetContextStack();
|
| -
|
| - Object* GetObject();
|
| -
|
| - // Get the encoded address. In debug mode we make sure
|
| - // it matches the given expectations.
|
| - void ExpectEncodedAddress(Address expected);
|
| -
|
| - // Given an encoded address (the result of
|
| - // RelativeAddress::Encode), return the object to which it points,
|
| - // which will be either an Smi or a HeapObject in the current heap.
|
| - Object* Resolve(Address encoded_address);
|
| -
|
| - SnapshotReader reader_;
|
| - bool root_; // Deserializing a root?
|
| - int roots_; // number of roots visited
|
| - int objects_; // number of objects serialized
|
| -
|
| - bool has_log_; // The file has log information.
|
| -
|
| - // Resolve caches the following:
|
| - List<Page*> map_pages_; // All pages in the map space.
|
| - List<Page*> cell_pages_; // All pages in the cell space.
|
| - List<Page*> old_pointer_pages_; // All pages in the old pointer space.
|
| - List<Page*> old_data_pages_; // All pages in the old data space.
|
| - List<Page*> code_pages_; // All pages in the code space.
|
| - List<Object*> large_objects_; // All known large objects.
|
| - // A list of global handles at deserialization time.
|
| - List<Object**> global_handles_;
|
| -
|
| - ExternalReferenceDecoder* reference_decoder_;
|
| -
|
| -#ifdef DEBUG
|
| - bool expect_debug_information_;
|
| -#endif
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(Deserializer);
|
| -};
|
| -
|
| -
|
| class SnapshotByteSource {
|
| public:
|
| SnapshotByteSource(const byte* array, int length)
|
| @@ -407,6 +153,7 @@
|
| int position_;
|
| };
|
|
|
| +
|
| // It is very common to have a reference to the object at word 10 in space 2,
|
| // the object at word 5 in space 2 and the object at word 28 in space 4. This
|
| // only works for objects in the first page of a space.
|
| @@ -436,10 +183,9 @@
|
| f(14, 32) \
|
| f(15, 36)
|
|
|
| -// The SerDes class is a common superclass for Serializer2 and Deserializer2
|
| +// The SerDes class is a common superclass for Serializer and Deserializer
|
| // which is used to store common constants and methods used by both.
|
| -// TODO(erikcorry): This should inherit from ObjectVisitor.
|
| -class SerDes: public GenericDeserializer {
|
| +class SerDes: public ObjectVisitor {
|
| protected:
|
| enum DataType {
|
| RAW_DATA_SERIALIZATION = 0,
|
| @@ -483,16 +229,15 @@
|
|
|
|
|
| // A Deserializer reads a snapshot and reconstructs the Object graph it defines.
|
| -class Deserializer2: public SerDes {
|
| +class Deserializer: public SerDes {
|
| public:
|
| // Create a deserializer from a snapshot byte source.
|
| - explicit Deserializer2(SnapshotByteSource* source);
|
| + explicit Deserializer(SnapshotByteSource* source);
|
|
|
| - virtual ~Deserializer2() { }
|
| + virtual ~Deserializer() { }
|
|
|
| // Deserialize the snapshot into an empty heap.
|
| void Deserialize();
|
| - void GetLog() { } // TODO(erikcorry): Get rid of this.
|
| #ifdef DEBUG
|
| virtual void Synchronize(const char* tag);
|
| #endif
|
| @@ -530,7 +275,7 @@
|
| // START_NEW_PAGE_SERIALIZATION tag.
|
| Address last_object_address_;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(Deserializer2);
|
| + DISALLOW_COPY_AND_ASSIGN(Deserializer);
|
| };
|
|
|
|
|
| @@ -545,15 +290,26 @@
|
| };
|
|
|
|
|
| -class Serializer2 : public SerDes {
|
| +class Serializer : public SerDes {
|
| public:
|
| - explicit Serializer2(SnapshotByteSink* sink);
|
| + explicit Serializer(SnapshotByteSink* sink);
|
| // Serialize the current state of the heap. This operation destroys the
|
| // heap contents.
|
| void Serialize();
|
| void VisitPointers(Object** start, Object** end);
|
| - void GetLog() { } // TODO(erikcorry): Get rid of this.
|
| - void Deserialize() { } // TODO(erikcorry): Get rid of this.
|
| +
|
| + static void Enable() {
|
| + if (!serialization_enabled_) {
|
| + ASSERT(!too_late_to_enable_now_);
|
| + }
|
| + serialization_enabled_ = true;
|
| + }
|
| +
|
| + static void Disable() { serialization_enabled_ = false; }
|
| + // Call this when you have made use of the fact that there is no serialization
|
| + // going on.
|
| + static void TooLateToEnableNow() { too_late_to_enable_now_ = true; }
|
| + static bool enabled() { return serialization_enabled_; }
|
| #ifdef DEBUG
|
| virtual void Synchronize(const char* tag);
|
| #endif
|
| @@ -565,7 +321,7 @@
|
| };
|
| class ObjectSerializer : public ObjectVisitor {
|
| public:
|
| - ObjectSerializer(Serializer2* serializer,
|
| + ObjectSerializer(Serializer* serializer,
|
| Object* o,
|
| SnapshotByteSink* sink,
|
| ReferenceRepresentation representation)
|
| @@ -591,7 +347,7 @@
|
| private:
|
| void OutputRawData(Address up_to);
|
|
|
| - Serializer2* serializer_;
|
| + Serializer* serializer_;
|
| HeapObject* object_;
|
| SnapshotByteSink* sink_;
|
| ReferenceRepresentation reference_representation_;
|
| @@ -626,11 +382,14 @@
|
| SnapshotByteSink* sink_;
|
| int current_root_index_;
|
| ExternalReferenceEncoder* external_reference_encoder_;
|
| + static bool serialization_enabled_;
|
| + // Did we already make use of the fact that serialization was not enabled?
|
| + static bool too_late_to_enable_now_;
|
|
|
| friend class ObjectSerializer;
|
| - friend class Deserializer2;
|
| + friend class Deserializer;
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(Serializer2);
|
| + DISALLOW_COPY_AND_ASSIGN(Serializer);
|
| };
|
|
|
| } } // namespace v8::internal
|
|
|