Index: src/serialize.h |
diff --git a/src/serialize.h b/src/serialize.h |
index d58e8332ce4c09a7281e222842dab7d37f30a814..6398e1e73668aa8fb0182028dfcce7107bdf84aa 100644 |
--- a/src/serialize.h |
+++ b/src/serialize.h |
@@ -6,9 +6,6 @@ |
#define V8_SERIALIZE_H_ |
#include "src/hashmap.h" |
-#include "src/isolate.h" |
-#include "src/snapshot-source-sink.h" |
-#include "src/heap-profiler.h" |
namespace v8 { |
namespace internal { |
@@ -135,6 +132,49 @@ class ExternalReferenceDecoder { |
}; |
+class SnapshotByteSource { |
+ public: |
+ SnapshotByteSource(const byte* array, int length) |
+ : data_(array), length_(length), position_(0) { } |
+ |
+ bool HasMore() { return position_ < length_; } |
+ |
+ int Get() { |
+ ASSERT(position_ < length_); |
+ return data_[position_++]; |
+ } |
+ |
+ int32_t GetUnalignedInt() { |
+#if defined(V8_HOST_CAN_READ_UNALIGNED) && __BYTE_ORDER == __LITTLE_ENDIAN |
+ int32_t answer; |
+ ASSERT(position_ + sizeof(answer) <= length_ + 0u); |
+ answer = *reinterpret_cast<const int32_t*>(data_ + position_); |
+#else |
+ int32_t answer = data_[position_]; |
+ answer |= data_[position_ + 1] << 8; |
+ answer |= data_[position_ + 2] << 16; |
+ answer |= data_[position_ + 3] << 24; |
+#endif |
+ return answer; |
+ } |
+ |
+ void Advance(int by) { position_ += by; } |
+ |
+ inline void CopyRaw(byte* to, int number_of_bytes); |
+ |
+ inline int GetInt(); |
+ |
+ bool AtEOF(); |
+ |
+ int position() { return position_; } |
+ |
+ private: |
+ const byte* data_; |
+ int length_; |
+ int position_; |
+}; |
+ |
+ |
// The Serializer/Deserializer class is a common superclass for Serializer and |
// Deserializer which is used to store common constants and methods used by |
// both. |
@@ -228,6 +268,26 @@ class SerializerDeserializer: public ObjectVisitor { |
}; |
+int SnapshotByteSource::GetInt() { |
+ // This way of variable-length encoding integers does not suffer from branch |
+ // mispredictions. |
+ uint32_t answer = GetUnalignedInt(); |
+ int bytes = answer & 3; |
+ Advance(bytes); |
+ uint32_t mask = 0xffffffffu; |
+ mask >>= 32 - (bytes << 3); |
+ answer &= mask; |
+ answer >>= 2; |
+ return answer; |
+} |
+ |
+ |
+void SnapshotByteSource::CopyRaw(byte* to, int number_of_bytes) { |
+ MemCopy(to, data_ + position_, number_of_bytes); |
+ position_ += number_of_bytes; |
+} |
+ |
+ |
// A Deserializer reads a snapshot and reconstructs the Object graph it defines. |
class Deserializer: public SerializerDeserializer { |
public: |
@@ -308,6 +368,18 @@ class Deserializer: public SerializerDeserializer { |
}; |
+class SnapshotByteSink { |
+ public: |
+ virtual ~SnapshotByteSink() { } |
+ virtual void Put(int byte, const char* description) = 0; |
+ virtual void PutSection(int byte, const char* description) { |
+ Put(byte, description); |
+ } |
+ void PutInt(uintptr_t integer, const char* description); |
+ virtual int Position() = 0; |
+}; |
+ |
+ |
// Mapping objects to their location after deserialization. |
// This is used during building, but not at runtime by V8. |
class SerializationAddressMapper { |