| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_SERIALIZE_H_ | 5 #ifndef V8_SERIALIZE_H_ |
| 6 #define V8_SERIALIZE_H_ | 6 #define V8_SERIALIZE_H_ |
| 7 | 7 |
| 8 #include "src/hashmap.h" | 8 #include "src/hashmap.h" |
| 9 #include "src/isolate.h" | |
| 10 #include "src/snapshot-source-sink.h" | |
| 11 #include "src/heap-profiler.h" | |
| 12 | 9 |
| 13 namespace v8 { | 10 namespace v8 { |
| 14 namespace internal { | 11 namespace internal { |
| 15 | 12 |
| 16 // A TypeCode is used to distinguish different kinds of external reference. | 13 // A TypeCode is used to distinguish different kinds of external reference. |
| 17 // It is a single bit to make testing for types easy. | 14 // It is a single bit to make testing for types easy. |
| 18 enum TypeCode { | 15 enum TypeCode { |
| 19 UNCLASSIFIED, // One-of-a-kind references. | 16 UNCLASSIFIED, // One-of-a-kind references. |
| 20 BUILTIN, | 17 BUILTIN, |
| 21 RUNTIME_FUNCTION, | 18 RUNTIME_FUNCTION, |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 } | 125 } |
| 129 | 126 |
| 130 void Put(uint32_t key, Address value) { | 127 void Put(uint32_t key, Address value) { |
| 131 *Lookup(key) = value; | 128 *Lookup(key) = value; |
| 132 } | 129 } |
| 133 | 130 |
| 134 Isolate* isolate_; | 131 Isolate* isolate_; |
| 135 }; | 132 }; |
| 136 | 133 |
| 137 | 134 |
| 135 class SnapshotByteSource { |
| 136 public: |
| 137 SnapshotByteSource(const byte* array, int length) |
| 138 : data_(array), length_(length), position_(0) { } |
| 139 |
| 140 bool HasMore() { return position_ < length_; } |
| 141 |
| 142 int Get() { |
| 143 ASSERT(position_ < length_); |
| 144 return data_[position_++]; |
| 145 } |
| 146 |
| 147 int32_t GetUnalignedInt() { |
| 148 #if defined(V8_HOST_CAN_READ_UNALIGNED) && __BYTE_ORDER == __LITTLE_ENDIAN |
| 149 int32_t answer; |
| 150 ASSERT(position_ + sizeof(answer) <= length_ + 0u); |
| 151 answer = *reinterpret_cast<const int32_t*>(data_ + position_); |
| 152 #else |
| 153 int32_t answer = data_[position_]; |
| 154 answer |= data_[position_ + 1] << 8; |
| 155 answer |= data_[position_ + 2] << 16; |
| 156 answer |= data_[position_ + 3] << 24; |
| 157 #endif |
| 158 return answer; |
| 159 } |
| 160 |
| 161 void Advance(int by) { position_ += by; } |
| 162 |
| 163 inline void CopyRaw(byte* to, int number_of_bytes); |
| 164 |
| 165 inline int GetInt(); |
| 166 |
| 167 bool AtEOF(); |
| 168 |
| 169 int position() { return position_; } |
| 170 |
| 171 private: |
| 172 const byte* data_; |
| 173 int length_; |
| 174 int position_; |
| 175 }; |
| 176 |
| 177 |
| 138 // The Serializer/Deserializer class is a common superclass for Serializer and | 178 // The Serializer/Deserializer class is a common superclass for Serializer and |
| 139 // Deserializer which is used to store common constants and methods used by | 179 // Deserializer which is used to store common constants and methods used by |
| 140 // both. | 180 // both. |
| 141 class SerializerDeserializer: public ObjectVisitor { | 181 class SerializerDeserializer: public ObjectVisitor { |
| 142 public: | 182 public: |
| 143 static void Iterate(Isolate* isolate, ObjectVisitor* visitor); | 183 static void Iterate(Isolate* isolate, ObjectVisitor* visitor); |
| 144 | 184 |
| 145 static int nop() { return kNop; } | 185 static int nop() { return kNop; } |
| 146 | 186 |
| 147 protected: | 187 protected: |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 } | 261 } |
| 222 | 262 |
| 223 static const int kNumberOfSpaces = LO_SPACE; | 263 static const int kNumberOfSpaces = LO_SPACE; |
| 224 static const int kAnyOldSpace = -1; | 264 static const int kAnyOldSpace = -1; |
| 225 | 265 |
| 226 // A bitmask for getting the space out of an instruction. | 266 // A bitmask for getting the space out of an instruction. |
| 227 static const int kSpaceMask = 7; | 267 static const int kSpaceMask = 7; |
| 228 }; | 268 }; |
| 229 | 269 |
| 230 | 270 |
| 271 int SnapshotByteSource::GetInt() { |
| 272 // This way of variable-length encoding integers does not suffer from branch |
| 273 // mispredictions. |
| 274 uint32_t answer = GetUnalignedInt(); |
| 275 int bytes = answer & 3; |
| 276 Advance(bytes); |
| 277 uint32_t mask = 0xffffffffu; |
| 278 mask >>= 32 - (bytes << 3); |
| 279 answer &= mask; |
| 280 answer >>= 2; |
| 281 return answer; |
| 282 } |
| 283 |
| 284 |
| 285 void SnapshotByteSource::CopyRaw(byte* to, int number_of_bytes) { |
| 286 MemCopy(to, data_ + position_, number_of_bytes); |
| 287 position_ += number_of_bytes; |
| 288 } |
| 289 |
| 290 |
| 231 // A Deserializer reads a snapshot and reconstructs the Object graph it defines. | 291 // A Deserializer reads a snapshot and reconstructs the Object graph it defines. |
| 232 class Deserializer: public SerializerDeserializer { | 292 class Deserializer: public SerializerDeserializer { |
| 233 public: | 293 public: |
| 234 // Create a deserializer from a snapshot byte source. | 294 // Create a deserializer from a snapshot byte source. |
| 235 explicit Deserializer(SnapshotByteSource* source); | 295 explicit Deserializer(SnapshotByteSource* source); |
| 236 | 296 |
| 237 virtual ~Deserializer(); | 297 virtual ~Deserializer(); |
| 238 | 298 |
| 239 // Deserialize the snapshot into an empty heap. | 299 // Deserialize the snapshot into an empty heap. |
| 240 void Deserialize(Isolate* isolate); | 300 void Deserialize(Isolate* isolate); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 301 | 361 |
| 302 int reservations_[LAST_SPACE + 1]; | 362 int reservations_[LAST_SPACE + 1]; |
| 303 static const intptr_t kUninitializedReservation = -1; | 363 static const intptr_t kUninitializedReservation = -1; |
| 304 | 364 |
| 305 ExternalReferenceDecoder* external_reference_decoder_; | 365 ExternalReferenceDecoder* external_reference_decoder_; |
| 306 | 366 |
| 307 DISALLOW_COPY_AND_ASSIGN(Deserializer); | 367 DISALLOW_COPY_AND_ASSIGN(Deserializer); |
| 308 }; | 368 }; |
| 309 | 369 |
| 310 | 370 |
| 371 class SnapshotByteSink { |
| 372 public: |
| 373 virtual ~SnapshotByteSink() { } |
| 374 virtual void Put(int byte, const char* description) = 0; |
| 375 virtual void PutSection(int byte, const char* description) { |
| 376 Put(byte, description); |
| 377 } |
| 378 void PutInt(uintptr_t integer, const char* description); |
| 379 virtual int Position() = 0; |
| 380 }; |
| 381 |
| 382 |
| 311 // Mapping objects to their location after deserialization. | 383 // Mapping objects to their location after deserialization. |
| 312 // This is used during building, but not at runtime by V8. | 384 // This is used during building, but not at runtime by V8. |
| 313 class SerializationAddressMapper { | 385 class SerializationAddressMapper { |
| 314 public: | 386 public: |
| 315 SerializationAddressMapper() | 387 SerializationAddressMapper() |
| 316 : no_allocation_(), | 388 : no_allocation_(), |
| 317 serialization_map_(new HashMap(HashMap::PointersMatch)) { } | 389 serialization_map_(new HashMap(HashMap::PointersMatch)) { } |
| 318 | 390 |
| 319 ~SerializationAddressMapper() { | 391 ~SerializationAddressMapper() { |
| 320 delete serialization_map_; | 392 delete serialization_map_; |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 557 private: | 629 private: |
| 558 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { | 630 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { |
| 559 return false; | 631 return false; |
| 560 } | 632 } |
| 561 }; | 633 }; |
| 562 | 634 |
| 563 | 635 |
| 564 } } // namespace v8::internal | 636 } } // namespace v8::internal |
| 565 | 637 |
| 566 #endif // V8_SERIALIZE_H_ | 638 #endif // V8_SERIALIZE_H_ |
| OLD | NEW |