Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: src/serialize.h

Issue 6685088: Merge isolates to bleeding_edge. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/scopes.cc ('k') | src/serialize.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 HashMap encodings_; 72 HashMap encodings_;
73 static uint32_t Hash(Address key) { 73 static uint32_t Hash(Address key) {
74 return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >> 2); 74 return static_cast<uint32_t>(reinterpret_cast<uintptr_t>(key) >> 2);
75 } 75 }
76 76
77 int IndexOf(Address key) const; 77 int IndexOf(Address key) const;
78 78
79 static bool Match(void* key1, void* key2) { return key1 == key2; } 79 static bool Match(void* key1, void* key2) { return key1 == key2; }
80 80
81 void Put(Address key, int index); 81 void Put(Address key, int index);
82
83 Isolate* isolate_;
82 }; 84 };
83 85
84 86
85 class ExternalReferenceDecoder { 87 class ExternalReferenceDecoder {
86 public: 88 public:
87 ExternalReferenceDecoder(); 89 ExternalReferenceDecoder();
88 ~ExternalReferenceDecoder(); 90 ~ExternalReferenceDecoder();
89 91
90 Address Decode(uint32_t key) const { 92 Address Decode(uint32_t key) const {
91 if (key == 0) return NULL; 93 if (key == 0) return NULL;
92 return *Lookup(key); 94 return *Lookup(key);
93 } 95 }
94 96
95 private: 97 private:
96 Address** encodings_; 98 Address** encodings_;
97 99
98 Address* Lookup(uint32_t key) const { 100 Address* Lookup(uint32_t key) const {
99 int type = key >> kReferenceTypeShift; 101 int type = key >> kReferenceTypeShift;
100 ASSERT(kFirstTypeCode <= type && type < kTypeCodeCount); 102 ASSERT(kFirstTypeCode <= type && type < kTypeCodeCount);
101 int id = key & kReferenceIdMask; 103 int id = key & kReferenceIdMask;
102 return &encodings_[type][id]; 104 return &encodings_[type][id];
103 } 105 }
104 106
105 void Put(uint32_t key, Address value) { 107 void Put(uint32_t key, Address value) {
106 *Lookup(key) = value; 108 *Lookup(key) = value;
107 } 109 }
110
111 Isolate* isolate_;
108 }; 112 };
109 113
110 114
111 class SnapshotByteSource { 115 class SnapshotByteSource {
112 public: 116 public:
113 SnapshotByteSource(const byte* array, int length) 117 SnapshotByteSource(const byte* array, int length)
114 : data_(array), length_(length), position_(0) { } 118 : data_(array), length_(length), position_(0) { }
115 119
116 bool HasMore() { return position_ < length_; } 120 bool HasMore() { return position_ < length_; }
117 121
(...skipping 19 matching lines...) Expand all
137 }; 141 };
138 142
139 143
140 // It is very common to have a reference to objects at certain offsets in the 144 // It is very common to have a reference to objects at certain offsets in the
141 // heap. These offsets have been determined experimentally. We code 145 // heap. These offsets have been determined experimentally. We code
142 // references to such objects in a single byte that encodes the way the pointer 146 // references to such objects in a single byte that encodes the way the pointer
143 // is written (only plain pointers allowed), the space number and the offset. 147 // is written (only plain pointers allowed), the space number and the offset.
144 // This only works for objects in the first page of a space. Don't use this for 148 // This only works for objects in the first page of a space. Don't use this for
145 // things in newspace since it bypasses the write barrier. 149 // things in newspace since it bypasses the write barrier.
146 150
147 static const int k64 = (sizeof(uintptr_t) - 4) / 4; 151 RLYSTC const int k64 = (sizeof(uintptr_t) - 4) / 4;
148 152
149 #define COMMON_REFERENCE_PATTERNS(f) \ 153 #define COMMON_REFERENCE_PATTERNS(f) \
150 f(kNumberOfSpaces, 2, (11 - k64)) \ 154 f(kNumberOfSpaces, 2, (11 - k64)) \
151 f((kNumberOfSpaces + 1), 2, 0) \ 155 f((kNumberOfSpaces + 1), 2, 0) \
152 f((kNumberOfSpaces + 2), 2, (142 - 16 * k64)) \ 156 f((kNumberOfSpaces + 2), 2, (142 - 16 * k64)) \
153 f((kNumberOfSpaces + 3), 2, (74 - 15 * k64)) \ 157 f((kNumberOfSpaces + 3), 2, (74 - 15 * k64)) \
154 f((kNumberOfSpaces + 4), 2, 5) \ 158 f((kNumberOfSpaces + 4), 2, 5) \
155 f((kNumberOfSpaces + 5), 1, 135) \ 159 f((kNumberOfSpaces + 5), 1, 135) \
156 f((kNumberOfSpaces + 6), 2, (228 - 39 * k64)) 160 f((kNumberOfSpaces + 6), 2, (228 - 39 * k64))
157 161
(...skipping 12 matching lines...) Expand all
170 f(12, 24) \ 174 f(12, 24) \
171 f(13, 28) \ 175 f(13, 28) \
172 f(14, 32) \ 176 f(14, 32) \
173 f(15, 36) 177 f(15, 36)
174 178
175 // The Serializer/Deserializer class is a common superclass for Serializer and 179 // The Serializer/Deserializer class is a common superclass for Serializer and
176 // Deserializer which is used to store common constants and methods used by 180 // Deserializer which is used to store common constants and methods used by
177 // both. 181 // both.
178 class SerializerDeserializer: public ObjectVisitor { 182 class SerializerDeserializer: public ObjectVisitor {
179 public: 183 public:
180 static void Iterate(ObjectVisitor* visitor); 184 RLYSTC void Iterate(ObjectVisitor* visitor);
181 static void SetSnapshotCacheSize(int size); 185 RLYSTC void SetSnapshotCacheSize(int size);
182 186
183 protected: 187 protected:
184 // Where the pointed-to object can be found: 188 // Where the pointed-to object can be found:
185 enum Where { 189 enum Where {
186 kNewObject = 0, // Object is next in snapshot. 190 kNewObject = 0, // Object is next in snapshot.
187 // 1-8 One per space. 191 // 1-8 One per space.
188 kRootArray = 0x9, // Object is found in root array. 192 kRootArray = 0x9, // Object is found in root array.
189 kPartialSnapshotCache = 0xa, // Object is in the cache. 193 kPartialSnapshotCache = 0xa, // Object is in the cache.
190 kExternalReference = 0xb, // Pointer to an external reference. 194 kExternalReference = 0xb, // Pointer to an external reference.
191 // 0xc-0xf Free. 195 // 0xc-0xf Free.
(...skipping 17 matching lines...) Expand all
209 213
210 // Where to point within the object. 214 // Where to point within the object.
211 enum WhereToPoint { 215 enum WhereToPoint {
212 kStartOfObject = 0, 216 kStartOfObject = 0,
213 kFirstInstruction = 0x80, 217 kFirstInstruction = 0x80,
214 kWhereToPointMask = 0x80 218 kWhereToPointMask = 0x80
215 }; 219 };
216 220
217 // Misc. 221 // Misc.
218 // Raw data to be copied from the snapshot. 222 // Raw data to be copied from the snapshot.
219 static const int kRawData = 0x30; 223 RLYSTC const int kRawData = 0x30;
220 // Some common raw lengths: 0x31-0x3f 224 // Some common raw lengths: 0x31-0x3f
221 // A tag emitted at strategic points in the snapshot to delineate sections. 225 // A tag emitted at strategic points in the snapshot to delineate sections.
222 // If the deserializer does not find these at the expected moments then it 226 // If the deserializer does not find these at the expected moments then it
223 // is an indication that the snapshot and the VM do not fit together. 227 // is an indication that the snapshot and the VM do not fit together.
224 // Examine the build process for architecture, version or configuration 228 // Examine the build process for architecture, version or configuration
225 // mismatches. 229 // mismatches.
226 static const int kSynchronize = 0x70; 230 RLYSTC const int kSynchronize = 0x70;
227 // Used for the source code of the natives, which is in the executable, but 231 // Used for the source code of the natives, which is in the executable, but
228 // is referred to from external strings in the snapshot. 232 // is referred to from external strings in the snapshot.
229 static const int kNativesStringResource = 0x71; 233 RLYSTC const int kNativesStringResource = 0x71;
230 static const int kNewPage = 0x72; 234 RLYSTC const int kNewPage = 0x72;
231 // 0x73-0x7f Free. 235 // 0x73-0x7f Free.
232 // 0xb0-0xbf Free. 236 // 0xb0-0xbf Free.
233 // 0xf0-0xff Free. 237 // 0xf0-0xff Free.
234 238
235 239
236 static const int kLargeData = LAST_SPACE; 240 RLYSTC const int kLargeData = LAST_SPACE;
237 static const int kLargeCode = kLargeData + 1; 241 RLYSTC const int kLargeCode = kLargeData + 1;
238 static const int kLargeFixedArray = kLargeCode + 1; 242 RLYSTC const int kLargeFixedArray = kLargeCode + 1;
239 static const int kNumberOfSpaces = kLargeFixedArray + 1; 243 RLYSTC const int kNumberOfSpaces = kLargeFixedArray + 1;
240 static const int kAnyOldSpace = -1; 244 RLYSTC const int kAnyOldSpace = -1;
241 245
242 // A bitmask for getting the space out of an instruction. 246 // A bitmask for getting the space out of an instruction.
243 static const int kSpaceMask = 15; 247 RLYSTC const int kSpaceMask = 15;
244 248
245 static inline bool SpaceIsLarge(int space) { return space >= kLargeData; } 249 RLYSTC inline bool SpaceIsLarge(int space) { return space >= kLargeData; }
246 static inline bool SpaceIsPaged(int space) { 250 RLYSTC inline bool SpaceIsPaged(int space) {
247 return space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE; 251 return space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE;
248 } 252 }
249
250 static int partial_snapshot_cache_length_;
251 static const int kPartialSnapshotCacheCapacity = 1400;
252 static Object* partial_snapshot_cache_[];
253 }; 253 };
254 254
255 255
256 int SnapshotByteSource::GetInt() { 256 int SnapshotByteSource::GetInt() {
257 // A little unwind to catch the really small ints. 257 // A little unwind to catch the really small ints.
258 int snapshot_byte = Get(); 258 int snapshot_byte = Get();
259 if ((snapshot_byte & 0x80) == 0) { 259 if ((snapshot_byte & 0x80) == 0) {
260 return snapshot_byte; 260 return snapshot_byte;
261 } 261 }
262 int accumulator = (snapshot_byte & 0x7f) << 7; 262 int accumulator = (snapshot_byte & 0x7f) << 7;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
306 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { 306 virtual void VisitRuntimeEntry(RelocInfo* rinfo) {
307 UNREACHABLE(); 307 UNREACHABLE();
308 } 308 }
309 309
310 void ReadChunk(Object** start, Object** end, int space, Address address); 310 void ReadChunk(Object** start, Object** end, int space, Address address);
311 HeapObject* GetAddressFromStart(int space); 311 HeapObject* GetAddressFromStart(int space);
312 inline HeapObject* GetAddressFromEnd(int space); 312 inline HeapObject* GetAddressFromEnd(int space);
313 Address Allocate(int space_number, Space* space, int size); 313 Address Allocate(int space_number, Space* space, int size);
314 void ReadObject(int space_number, Space* space, Object** write_back); 314 void ReadObject(int space_number, Space* space, Object** write_back);
315 315
316 // Cached current isolate.
317 Isolate* isolate_;
318
316 // Keep track of the pages in the paged spaces. 319 // Keep track of the pages in the paged spaces.
317 // (In large object space we are keeping track of individual objects 320 // (In large object space we are keeping track of individual objects
318 // rather than pages.) In new space we just need the address of the 321 // rather than pages.) In new space we just need the address of the
319 // first object and the others will flow from that. 322 // first object and the others will flow from that.
320 List<Address> pages_[SerializerDeserializer::kNumberOfSpaces]; 323 List<Address> pages_[SerializerDeserializer::kNumberOfSpaces];
321 324
322 SnapshotByteSource* source_; 325 SnapshotByteSource* source_;
323 static ExternalReferenceDecoder* external_reference_decoder_;
324 // This is the address of the next object that will be allocated in each 326 // This is the address of the next object that will be allocated in each
325 // space. It is used to calculate the addresses of back-references. 327 // space. It is used to calculate the addresses of back-references.
326 Address high_water_[LAST_SPACE + 1]; 328 Address high_water_[LAST_SPACE + 1];
327 // This is the address of the most recent object that was allocated. It 329 // This is the address of the most recent object that was allocated. It
328 // is used to set the location of the new page when we encounter a 330 // is used to set the location of the new page when we encounter a
329 // START_NEW_PAGE_SERIALIZATION tag. 331 // START_NEW_PAGE_SERIALIZATION tag.
330 Address last_object_address_; 332 Address last_object_address_;
331 333
334 ExternalReferenceDecoder* external_reference_decoder_;
335
332 DISALLOW_COPY_AND_ASSIGN(Deserializer); 336 DISALLOW_COPY_AND_ASSIGN(Deserializer);
333 }; 337 };
334 338
335 339
336 class SnapshotByteSink { 340 class SnapshotByteSink {
337 public: 341 public:
338 virtual ~SnapshotByteSink() { } 342 virtual ~SnapshotByteSink() { }
339 virtual void Put(int byte, const char* description) = 0; 343 virtual void Put(int byte, const char* description) = 0;
340 virtual void PutSection(int byte, const char* description) { 344 virtual void PutSection(int byte, const char* description) {
341 Put(byte, description); 345 Put(byte, description);
(...skipping 27 matching lines...) Expand all
369 } 373 }
370 374
371 void AddMapping(HeapObject* obj, int to) { 375 void AddMapping(HeapObject* obj, int to) {
372 ASSERT(!IsMapped(obj)); 376 ASSERT(!IsMapped(obj));
373 HashMap::Entry* entry = 377 HashMap::Entry* entry =
374 serialization_map_->Lookup(Key(obj), Hash(obj), true); 378 serialization_map_->Lookup(Key(obj), Hash(obj), true);
375 entry->value = Value(to); 379 entry->value = Value(to);
376 } 380 }
377 381
378 private: 382 private:
379 static bool SerializationMatchFun(void* key1, void* key2) { 383 RLYSTC bool SerializationMatchFun(void* key1, void* key2) {
380 return key1 == key2; 384 return key1 == key2;
381 } 385 }
382 386
383 static uint32_t Hash(HeapObject* obj) { 387 RLYSTC uint32_t Hash(HeapObject* obj) {
384 return static_cast<int32_t>(reinterpret_cast<intptr_t>(obj->address())); 388 return static_cast<int32_t>(reinterpret_cast<intptr_t>(obj->address()));
385 } 389 }
386 390
387 static void* Key(HeapObject* obj) { 391 RLYSTC void* Key(HeapObject* obj) {
388 return reinterpret_cast<void*>(obj->address()); 392 return reinterpret_cast<void*>(obj->address());
389 } 393 }
390 394
391 static void* Value(int v) { 395 RLYSTC void* Value(int v) {
392 return reinterpret_cast<void*>(v); 396 return reinterpret_cast<void*>(v);
393 } 397 }
394 398
395 HashMap* serialization_map_; 399 HashMap* serialization_map_;
396 AssertNoAllocation* no_allocation_; 400 AssertNoAllocation* no_allocation_;
397 DISALLOW_COPY_AND_ASSIGN(SerializationAddressMapper); 401 DISALLOW_COPY_AND_ASSIGN(SerializationAddressMapper);
398 }; 402 };
399 403
400 404
401 class Serializer : public SerializerDeserializer { 405 // There can be only one serializer per V8 process.
406 STATIC_CLASS Serializer : public SerializerDeserializer {
402 public: 407 public:
403 explicit Serializer(SnapshotByteSink* sink); 408 explicit Serializer(SnapshotByteSink* sink);
404 ~Serializer(); 409 ~Serializer();
405 void VisitPointers(Object** start, Object** end); 410 void VisitPointers(Object** start, Object** end);
406 // You can call this after serialization to find out how much space was used 411 // You can call this after serialization to find out how much space was used
407 // in each space. 412 // in each space.
408 int CurrentAllocationAddress(int space) { 413 int CurrentAllocationAddress(int space) {
409 if (SpaceIsLarge(space)) return large_object_total_; 414 if (SpaceIsLarge(space)) return large_object_total_;
410 return fullness_[space]; 415 return fullness_[space];
411 } 416 }
412 417
413 static void Enable() { 418 RLYSTC void Enable() {
414 if (!serialization_enabled_) { 419 if (!serialization_enabled_) {
415 ASSERT(!too_late_to_enable_now_); 420 ASSERT(!too_late_to_enable_now_);
416 } 421 }
417 serialization_enabled_ = true; 422 serialization_enabled_ = true;
418 } 423 }
419 424
420 static void Disable() { serialization_enabled_ = false; } 425 RLYSTC void Disable() { serialization_enabled_ = false; }
421 // Call this when you have made use of the fact that there is no serialization 426 // Call this when you have made use of the fact that there is no serialization
422 // going on. 427 // going on.
423 static void TooLateToEnableNow() { too_late_to_enable_now_ = true; } 428 RLYSTC void TooLateToEnableNow() { too_late_to_enable_now_ = true; }
424 static bool enabled() { return serialization_enabled_; } 429 RLYSTC bool enabled() { return serialization_enabled_; }
425 SerializationAddressMapper* address_mapper() { return &address_mapper_; } 430 SerializationAddressMapper* address_mapper() { return &address_mapper_; }
426 #ifdef DEBUG 431 #ifdef DEBUG
427 virtual void Synchronize(const char* tag); 432 virtual void Synchronize(const char* tag);
428 #endif 433 #endif
429 434
430 protected: 435 protected:
431 static const int kInvalidRootIndex = -1; 436 RLYSTC const int kInvalidRootIndex = -1;
432 virtual int RootIndex(HeapObject* heap_object) = 0; 437 virtual int RootIndex(HeapObject* heap_object) = 0;
433 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) = 0; 438 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) = 0;
434 439
435 class ObjectSerializer : public ObjectVisitor { 440 class ObjectSerializer : public ObjectVisitor {
436 public: 441 public:
437 ObjectSerializer(Serializer* serializer, 442 ObjectSerializer(Serializer* serializer,
438 Object* o, 443 Object* o,
439 SnapshotByteSink* sink, 444 SnapshotByteSink* sink,
440 HowToCode how_to_code, 445 HowToCode how_to_code,
441 WhereToPoint where_to_point) 446 WhereToPoint where_to_point)
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 void SerializeReferenceToPreviousObject( 481 void SerializeReferenceToPreviousObject(
477 int space, 482 int space,
478 int address, 483 int address,
479 HowToCode how_to_code, 484 HowToCode how_to_code,
480 WhereToPoint where_to_point); 485 WhereToPoint where_to_point);
481 void InitializeAllocators(); 486 void InitializeAllocators();
482 // This will return the space for an object. If the object is in large 487 // This will return the space for an object. If the object is in large
483 // object space it may return kLargeCode or kLargeFixedArray in order 488 // object space it may return kLargeCode or kLargeFixedArray in order
484 // to indicate to the deserializer what kind of large object allocation 489 // to indicate to the deserializer what kind of large object allocation
485 // to make. 490 // to make.
486 static int SpaceOfObject(HeapObject* object); 491 RLYSTC int SpaceOfObject(HeapObject* object);
487 // This just returns the space of the object. It will return LO_SPACE 492 // This just returns the space of the object. It will return LO_SPACE
488 // for all large objects since you can't check the type of the object 493 // for all large objects since you can't check the type of the object
489 // once the map has been used for the serialization address. 494 // once the map has been used for the serialization address.
490 static int SpaceOfAlreadySerializedObject(HeapObject* object); 495 RLYSTC int SpaceOfAlreadySerializedObject(HeapObject* object);
491 int Allocate(int space, int size, bool* new_page_started); 496 int Allocate(int space, int size, bool* new_page_started);
492 int EncodeExternalReference(Address addr) { 497 int EncodeExternalReference(Address addr) {
493 return external_reference_encoder_->Encode(addr); 498 return external_reference_encoder_->Encode(addr);
494 } 499 }
495 500
496 // Keep track of the fullness of each space in order to generate 501 // Keep track of the fullness of each space in order to generate
497 // relative addresses for back references. Large objects are 502 // relative addresses for back references. Large objects are
498 // just numbered sequentially since relative addresses make no 503 // just numbered sequentially since relative addresses make no
499 // sense in large object space. 504 // sense in large object space.
500 int fullness_[LAST_SPACE + 1]; 505 int fullness_[LAST_SPACE + 1];
501 SnapshotByteSink* sink_; 506 SnapshotByteSink* sink_;
502 int current_root_index_; 507 int current_root_index_;
503 ExternalReferenceEncoder* external_reference_encoder_; 508 ExternalReferenceEncoder* external_reference_encoder_;
504 static bool serialization_enabled_; 509 RLYSTC bool serialization_enabled_;
505 // Did we already make use of the fact that serialization was not enabled? 510 // Did we already make use of the fact that serialization was not enabled?
506 static bool too_late_to_enable_now_; 511 RLYSTC bool too_late_to_enable_now_;
507 int large_object_total_; 512 int large_object_total_;
508 SerializationAddressMapper address_mapper_; 513 SerializationAddressMapper address_mapper_;
509 514
510 friend class ObjectSerializer; 515 friend class ObjectSerializer;
511 friend class Deserializer; 516 friend class Deserializer;
512 517
513 DISALLOW_COPY_AND_ASSIGN(Serializer); 518 DISALLOW_COPY_AND_ASSIGN(Serializer);
514 }; 519 };
515 520
516 521
(...skipping 15 matching lines...) Expand all
532 virtual int RootIndex(HeapObject* o); 537 virtual int RootIndex(HeapObject* o);
533 virtual int PartialSnapshotCacheIndex(HeapObject* o); 538 virtual int PartialSnapshotCacheIndex(HeapObject* o);
534 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { 539 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) {
535 // Scripts should be referred only through shared function infos. We can't 540 // Scripts should be referred only through shared function infos. We can't
536 // allow them to be part of the partial snapshot because they contain a 541 // allow them to be part of the partial snapshot because they contain a
537 // unique ID, and deserializing several partial snapshots containing script 542 // unique ID, and deserializing several partial snapshots containing script
538 // would cause dupes. 543 // would cause dupes.
539 ASSERT(!o->IsScript()); 544 ASSERT(!o->IsScript());
540 return o->IsString() || o->IsSharedFunctionInfo() || 545 return o->IsString() || o->IsSharedFunctionInfo() ||
541 o->IsHeapNumber() || o->IsCode() || 546 o->IsHeapNumber() || o->IsCode() ||
542 o->map() == Heap::fixed_cow_array_map(); 547 o->map() == HEAP->fixed_cow_array_map();
543 } 548 }
544 549
545 private: 550 private:
546 Serializer* startup_serializer_; 551 Serializer* startup_serializer_;
547 DISALLOW_COPY_AND_ASSIGN(PartialSerializer); 552 DISALLOW_COPY_AND_ASSIGN(PartialSerializer);
548 }; 553 };
549 554
550 555
551 class StartupSerializer : public Serializer { 556 class StartupSerializer : public Serializer {
552 public: 557 public:
553 explicit StartupSerializer(SnapshotByteSink* sink) : Serializer(sink) { 558 explicit StartupSerializer(SnapshotByteSink* sink) : Serializer(sink) {
554 // Clear the cache of objects used by the partial snapshot. After the 559 // Clear the cache of objects used by the partial snapshot. After the
555 // strong roots have been serialized we can create a partial snapshot 560 // strong roots have been serialized we can create a partial snapshot
556 // which will repopulate the cache with objects neede by that partial 561 // which will repopulate the cache with objects neede by that partial
557 // snapshot. 562 // snapshot.
558 partial_snapshot_cache_length_ = 0; 563 Isolate::Current()->set_serialize_partial_snapshot_cache_length(0);
559 } 564 }
560 // Serialize the current state of the heap. The order is: 565 // Serialize the current state of the heap. The order is:
561 // 1) Strong references. 566 // 1) Strong references.
562 // 2) Partial snapshot cache. 567 // 2) Partial snapshot cache.
563 // 3) Weak references (eg the symbol table). 568 // 3) Weak references (eg the symbol table).
564 virtual void SerializeStrongReferences(); 569 virtual void SerializeStrongReferences();
565 virtual void SerializeObject(Object* o, 570 virtual void SerializeObject(Object* o,
566 HowToCode how_to_code, 571 HowToCode how_to_code,
567 WhereToPoint where_to_point); 572 WhereToPoint where_to_point);
568 void SerializeWeakReferences(); 573 void SerializeWeakReferences();
569 void Serialize() { 574 void Serialize() {
570 SerializeStrongReferences(); 575 SerializeStrongReferences();
571 SerializeWeakReferences(); 576 SerializeWeakReferences();
572 } 577 }
573 578
574 private: 579 private:
575 virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; } 580 virtual int RootIndex(HeapObject* o) { return kInvalidRootIndex; }
576 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) { 581 virtual bool ShouldBeInThePartialSnapshotCache(HeapObject* o) {
577 return false; 582 return false;
578 } 583 }
579 }; 584 };
580 585
581 586
582 } } // namespace v8::internal 587 } } // namespace v8::internal
583 588
584 #endif // V8_SERIALIZE_H_ 589 #endif // V8_SERIALIZE_H_
OLDNEW
« no previous file with comments | « src/scopes.cc ('k') | src/serialize.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698