OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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_SNAPSHOT_SERIALIZER_COMMON_H_ | 5 #ifndef V8_SNAPSHOT_SERIALIZER_COMMON_H_ |
6 #define V8_SNAPSHOT_SERIALIZER_COMMON_H_ | 6 #define V8_SNAPSHOT_SERIALIZER_COMMON_H_ |
7 | 7 |
8 #include "src/address-map.h" | 8 #include "src/address-map.h" |
9 #include "src/external-reference-table.h" | 9 #include "src/external-reference-table.h" |
10 #include "src/globals.h" | 10 #include "src/globals.h" |
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
238 | 238 |
239 SerializedData(byte* data, int size) | 239 SerializedData(byte* data, int size) |
240 : data_(data), size_(size), owns_data_(false) {} | 240 : data_(data), size_(size), owns_data_(false) {} |
241 SerializedData() : data_(NULL), size_(0), owns_data_(false) {} | 241 SerializedData() : data_(NULL), size_(0), owns_data_(false) {} |
242 | 242 |
243 ~SerializedData() { | 243 ~SerializedData() { |
244 if (owns_data_) DeleteArray<byte>(data_); | 244 if (owns_data_) DeleteArray<byte>(data_); |
245 } | 245 } |
246 | 246 |
247 uint32_t GetMagicNumber() const { return GetHeaderValue(kMagicNumberOffset); } | 247 uint32_t GetMagicNumber() const { return GetHeaderValue(kMagicNumberOffset); } |
| 248 uint32_t GetExtraReferences() const { |
| 249 return GetHeaderValue(kExtraExternalReferencesOffset); |
| 250 } |
248 | 251 |
249 class ChunkSizeBits : public BitField<uint32_t, 0, 31> {}; | 252 class ChunkSizeBits : public BitField<uint32_t, 0, 31> {}; |
250 class IsLastChunkBits : public BitField<bool, 31, 1> {}; | 253 class IsLastChunkBits : public BitField<bool, 31, 1> {}; |
251 | 254 |
252 static uint32_t ComputeMagicNumber(ExternalReferenceTable* table) { | 255 static uint32_t ComputeMagicNumber(ExternalReferenceTable* table) { |
253 uint32_t external_refs = table->size(); | 256 uint32_t external_refs = table->size() - table->num_api_references(); |
254 return 0xC0DE0000 ^ external_refs; | 257 return 0xC0DE0000 ^ external_refs; |
255 } | 258 } |
| 259 static uint32_t GetExtraReferences(ExternalReferenceTable* table) { |
| 260 return table->num_api_references(); |
| 261 } |
| 262 |
| 263 static const int kMagicNumberOffset = 0; |
| 264 static const int kExtraExternalReferencesOffset = |
| 265 kMagicNumberOffset + kInt32Size; |
| 266 static const int kVersionHashOffset = |
| 267 kExtraExternalReferencesOffset + kInt32Size; |
256 | 268 |
257 protected: | 269 protected: |
258 void SetHeaderValue(int offset, uint32_t value) { | 270 void SetHeaderValue(int offset, uint32_t value) { |
259 uint32_t* address = reinterpret_cast<uint32_t*>(data_ + offset); | 271 uint32_t* address = reinterpret_cast<uint32_t*>(data_ + offset); |
260 memcpy(reinterpret_cast<uint32_t*>(address), &value, sizeof(value)); | 272 memcpy(reinterpret_cast<uint32_t*>(address), &value, sizeof(value)); |
261 } | 273 } |
262 | 274 |
263 uint32_t GetHeaderValue(int offset) const { | 275 uint32_t GetHeaderValue(int offset) const { |
264 uint32_t value; | 276 uint32_t value; |
265 memcpy(&value, reinterpret_cast<int*>(data_ + offset), sizeof(value)); | 277 memcpy(&value, reinterpret_cast<int*>(data_ + offset), sizeof(value)); |
266 return value; | 278 return value; |
267 } | 279 } |
268 | 280 |
269 void AllocateData(int size); | 281 void AllocateData(int size); |
270 | 282 |
271 static uint32_t ComputeMagicNumber(Isolate* isolate) { | 283 static uint32_t ComputeMagicNumber(Isolate* isolate) { |
272 return ComputeMagicNumber(ExternalReferenceTable::instance(isolate)); | 284 return ComputeMagicNumber(ExternalReferenceTable::instance(isolate)); |
273 } | 285 } |
| 286 static uint32_t GetExtraReferences(Isolate* isolate) { |
| 287 return GetExtraReferences(ExternalReferenceTable::instance(isolate)); |
| 288 } |
274 | 289 |
275 void SetMagicNumber(Isolate* isolate) { | 290 void SetMagicNumber(Isolate* isolate) { |
276 SetHeaderValue(kMagicNumberOffset, ComputeMagicNumber(isolate)); | 291 SetHeaderValue(kMagicNumberOffset, ComputeMagicNumber(isolate)); |
| 292 SetHeaderValue(kExtraExternalReferencesOffset, GetExtraReferences(isolate)); |
277 } | 293 } |
278 | 294 |
279 static const int kMagicNumberOffset = 0; | |
280 | |
281 byte* data_; | 295 byte* data_; |
282 int size_; | 296 int size_; |
283 bool owns_data_; | 297 bool owns_data_; |
284 }; | 298 }; |
285 | 299 |
286 } // namespace internal | 300 } // namespace internal |
287 } // namespace v8 | 301 } // namespace v8 |
288 | 302 |
289 #endif // V8_SNAPSHOT_SERIALIZER_COMMON_H_ | 303 #endif // V8_SNAPSHOT_SERIALIZER_COMMON_H_ |
OLD | NEW |