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/compiler.h" | 8 #include "src/compiler.h" |
9 #include "src/hashmap.h" | 9 #include "src/hashmap.h" |
10 #include "src/heap-profiler.h" | 10 #include "src/heap-profiler.h" |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 void set_reservation(int space_number, int reservation) { | 250 void set_reservation(int space_number, int reservation) { |
251 DCHECK(space_number >= 0); | 251 DCHECK(space_number >= 0); |
252 DCHECK(space_number <= LAST_SPACE); | 252 DCHECK(space_number <= LAST_SPACE); |
253 reservations_[space_number] = reservation; | 253 reservations_[space_number] = reservation; |
254 } | 254 } |
255 | 255 |
256 void FlushICacheForNewCodeObjects(); | 256 void FlushICacheForNewCodeObjects(); |
257 | 257 |
258 // Serialized user code reference certain objects that are provided in a list | 258 // Serialized user code reference certain objects that are provided in a list |
259 // By calling this method, we assume that we are deserializing user code. | 259 // By calling this method, we assume that we are deserializing user code. |
260 void SetAttachedObjects(Vector<Object*>* attached_objects) { | 260 void SetAttachedObjects(Vector<Handle<Object> >* attached_objects) { |
261 attached_objects_ = attached_objects; | 261 attached_objects_ = attached_objects; |
262 } | 262 } |
263 | 263 |
264 bool deserializing_user_code() { return attached_objects_ != NULL; } | 264 bool deserializing_user_code() { return attached_objects_ != NULL; } |
265 | 265 |
266 private: | 266 private: |
267 virtual void VisitPointers(Object** start, Object** end); | 267 virtual void VisitPointers(Object** start, Object** end); |
268 | 268 |
269 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { | 269 virtual void VisitRuntimeEntry(RelocInfo* rinfo) { |
270 UNREACHABLE(); | 270 UNREACHABLE(); |
(...skipping 30 matching lines...) Expand all Loading... |
301 HeapObject* GetAddressFromEnd(int space) { | 301 HeapObject* GetAddressFromEnd(int space) { |
302 int offset = source_->GetInt(); | 302 int offset = source_->GetInt(); |
303 offset <<= kObjectAlignmentBits; | 303 offset <<= kObjectAlignmentBits; |
304 return HeapObject::FromAddress(high_water_[space] - offset); | 304 return HeapObject::FromAddress(high_water_[space] - offset); |
305 } | 305 } |
306 | 306 |
307 // Cached current isolate. | 307 // Cached current isolate. |
308 Isolate* isolate_; | 308 Isolate* isolate_; |
309 | 309 |
310 // Objects from the attached object descriptions in the serialized user code. | 310 // Objects from the attached object descriptions in the serialized user code. |
311 Vector<Object*>* attached_objects_; | 311 Vector<Handle<Object> >* attached_objects_; |
312 | 312 |
313 SnapshotByteSource* source_; | 313 SnapshotByteSource* source_; |
314 // This is the address of the next object that will be allocated in each | 314 // This is the address of the next object that will be allocated in each |
315 // space. It is used to calculate the addresses of back-references. | 315 // space. It is used to calculate the addresses of back-references. |
316 Address high_water_[LAST_SPACE + 1]; | 316 Address high_water_[LAST_SPACE + 1]; |
317 | 317 |
318 int reservations_[LAST_SPACE + 1]; | 318 int reservations_[LAST_SPACE + 1]; |
319 static const intptr_t kUninitializedReservation = -1; | 319 static const intptr_t kUninitializedReservation = -1; |
320 | 320 |
321 ExternalReferenceDecoder* external_reference_decoder_; | 321 ExternalReferenceDecoder* external_reference_decoder_; |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
452 int reference_representation_; | 452 int reference_representation_; |
453 int bytes_processed_so_far_; | 453 int bytes_processed_so_far_; |
454 bool code_object_; | 454 bool code_object_; |
455 bool code_has_been_output_; | 455 bool code_has_been_output_; |
456 }; | 456 }; |
457 | 457 |
458 virtual void SerializeObject(Object* o, | 458 virtual void SerializeObject(Object* o, |
459 HowToCode how_to_code, | 459 HowToCode how_to_code, |
460 WhereToPoint where_to_point, | 460 WhereToPoint where_to_point, |
461 int skip) = 0; | 461 int skip) = 0; |
462 void SerializeReferenceToPreviousObject( | 462 void SerializeReferenceToPreviousObject(HeapObject* heap_object, |
463 int space, | 463 HowToCode how_to_code, |
464 int address, | 464 WhereToPoint where_to_point, |
465 HowToCode how_to_code, | 465 int skip); |
466 WhereToPoint where_to_point, | |
467 int skip); | |
468 void InitializeAllocators(); | 466 void InitializeAllocators(); |
469 // This will return the space for an object. | 467 // This will return the space for an object. |
470 static int SpaceOfObject(HeapObject* object); | 468 static int SpaceOfObject(HeapObject* object); |
471 int Allocate(int space, int size); | 469 int Allocate(int space, int size); |
472 int EncodeExternalReference(Address addr) { | 470 int EncodeExternalReference(Address addr) { |
473 return external_reference_encoder_->Encode(addr); | 471 return external_reference_encoder_->Encode(addr); |
474 } | 472 } |
475 | 473 |
476 int SpaceAreaSize(int space); | 474 int SpaceAreaSize(int space); |
477 | 475 |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
587 Handle<String> source); | 585 Handle<String> source); |
588 | 586 |
589 virtual void SerializeObject(Object* o, HowToCode how_to_code, | 587 virtual void SerializeObject(Object* o, HowToCode how_to_code, |
590 WhereToPoint where_to_point, int skip); | 588 WhereToPoint where_to_point, int skip); |
591 | 589 |
592 static Handle<SharedFunctionInfo> Deserialize(Isolate* isolate, | 590 static Handle<SharedFunctionInfo> Deserialize(Isolate* isolate, |
593 ScriptData* data, | 591 ScriptData* data, |
594 Handle<String> source); | 592 Handle<String> source); |
595 | 593 |
596 static const int kSourceObjectIndex = 0; | 594 static const int kSourceObjectIndex = 0; |
| 595 static const int kCodeStubsBaseIndex = 1; |
597 | 596 |
598 String* source() { | 597 String* source() { |
599 DCHECK(!AllowHeapAllocation::IsAllowed()); | 598 DCHECK(!AllowHeapAllocation::IsAllowed()); |
600 return source_; | 599 return source_; |
601 } | 600 } |
602 | 601 |
| 602 List<uint32_t>* stub_keys() { return &stub_keys_; } |
| 603 |
603 private: | 604 private: |
604 void SerializeBuiltin(Code* builtin, HowToCode how_to_code, | 605 void SerializeBuiltin(Code* builtin, HowToCode how_to_code, |
605 WhereToPoint where_to_point, int skip); | 606 WhereToPoint where_to_point, int skip); |
| 607 void SerializeCodeStub(Code* code, HowToCode how_to_code, |
| 608 WhereToPoint where_to_point, int skip); |
606 void SerializeSourceObject(HowToCode how_to_code, WhereToPoint where_to_point, | 609 void SerializeSourceObject(HowToCode how_to_code, WhereToPoint where_to_point, |
607 int skip); | 610 int skip); |
| 611 void SerializeHeapObject(HeapObject* heap_object, HowToCode how_to_code, |
| 612 WhereToPoint where_to_point, int skip); |
| 613 int AddCodeStubKey(uint32_t stub_key); |
608 | 614 |
609 DisallowHeapAllocation no_gc_; | 615 DisallowHeapAllocation no_gc_; |
610 String* source_; | 616 String* source_; |
| 617 List<uint32_t> stub_keys_; |
611 DISALLOW_COPY_AND_ASSIGN(CodeSerializer); | 618 DISALLOW_COPY_AND_ASSIGN(CodeSerializer); |
612 }; | 619 }; |
613 | 620 |
614 | 621 |
615 // Wrapper around ScriptData to provide code-serializer-specific functionality. | 622 // Wrapper around ScriptData to provide code-serializer-specific functionality. |
616 class SerializedCodeData { | 623 class SerializedCodeData { |
617 public: | 624 public: |
618 // Used by when consuming. | 625 // Used by when consuming. |
619 explicit SerializedCodeData(ScriptData* data, String* source) | 626 explicit SerializedCodeData(ScriptData* data, String* source) |
620 : script_data_(data), owns_script_data_(false) { | 627 : script_data_(data), owns_script_data_(false) { |
(...skipping 10 matching lines...) Expand all Loading... |
631 | 638 |
632 // Return ScriptData object and relinquish ownership over it to the caller. | 639 // Return ScriptData object and relinquish ownership over it to the caller. |
633 ScriptData* GetScriptData() { | 640 ScriptData* GetScriptData() { |
634 ScriptData* result = script_data_; | 641 ScriptData* result = script_data_; |
635 script_data_ = NULL; | 642 script_data_ = NULL; |
636 DCHECK(owns_script_data_); | 643 DCHECK(owns_script_data_); |
637 owns_script_data_ = false; | 644 owns_script_data_ = false; |
638 return result; | 645 return result; |
639 } | 646 } |
640 | 647 |
| 648 Vector<const uint32_t> CodeStubKeys() const { |
| 649 return Vector<const uint32_t>( |
| 650 reinterpret_cast<const uint32_t*>(script_data_->data() + kHeaderSize), |
| 651 GetHeaderValue(kNumCodeStubKeysOffset)); |
| 652 } |
| 653 |
641 const byte* Payload() const { | 654 const byte* Payload() const { |
642 return script_data_->data() + kHeaderEntries * kIntSize; | 655 int code_stubs_size = GetHeaderValue(kNumCodeStubKeysOffset) * kInt32Size; |
| 656 return script_data_->data() + kHeaderSize + code_stubs_size; |
643 } | 657 } |
644 | 658 |
645 int PayloadLength() const { | 659 int PayloadLength() const { |
646 return script_data_->length() - kHeaderEntries * kIntSize; | 660 int payload_length = GetHeaderValue(kPayloadLengthOffset); |
| 661 DCHECK_EQ(script_data_->data() + script_data_->length(), |
| 662 Payload() + payload_length); |
| 663 return payload_length; |
647 } | 664 } |
648 | 665 |
649 int GetReservation(int space) const { | 666 int GetReservation(int space) const { |
650 return GetHeaderValue(kReservationsOffset + space); | 667 return GetHeaderValue(kReservationsOffset + space); |
651 } | 668 } |
652 | 669 |
653 private: | 670 private: |
654 void SetHeaderValue(int offset, int value) { | 671 void SetHeaderValue(int offset, int value) { |
655 reinterpret_cast<int*>(const_cast<byte*>(script_data_->data()))[offset] = | 672 reinterpret_cast<int*>(const_cast<byte*>(script_data_->data()))[offset] = |
656 value; | 673 value; |
657 } | 674 } |
658 | 675 |
659 int GetHeaderValue(int offset) const { | 676 int GetHeaderValue(int offset) const { |
660 return reinterpret_cast<const int*>(script_data_->data())[offset]; | 677 return reinterpret_cast<const int*>(script_data_->data())[offset]; |
661 } | 678 } |
662 | 679 |
663 bool IsSane(String* source); | 680 bool IsSane(String* source); |
664 | 681 |
665 int CheckSum(String* source); | 682 int CheckSum(String* source); |
666 | 683 |
667 // The data header consists of int-sized entries: | 684 // The data header consists of int-sized entries: |
668 // [0] version hash | 685 // [0] version hash |
669 // [1..7] reservation sizes for spaces from NEW_SPACE to PROPERTY_CELL_SPACE. | 686 // [1] number of code stub keys |
| 687 // [2] payload length |
| 688 // [3..9] reservation sizes for spaces from NEW_SPACE to PROPERTY_CELL_SPACE. |
670 static const int kCheckSumOffset = 0; | 689 static const int kCheckSumOffset = 0; |
671 static const int kReservationsOffset = 1; | 690 static const int kNumCodeStubKeysOffset = 1; |
672 static const int kHeaderEntries = 8; | 691 static const int kPayloadLengthOffset = 2; |
| 692 static const int kReservationsOffset = 3; |
| 693 |
| 694 static const int kNumSpaces = PROPERTY_CELL_SPACE - NEW_SPACE + 1; |
| 695 static const int kHeaderEntries = kReservationsOffset + kNumSpaces; |
| 696 static const int kHeaderSize = kHeaderEntries * kIntSize; |
| 697 |
| 698 // Following the header, we store, in sequential order |
| 699 // - code stub keys |
| 700 // - serialization payload |
673 | 701 |
674 ScriptData* script_data_; | 702 ScriptData* script_data_; |
675 bool owns_script_data_; | 703 bool owns_script_data_; |
676 }; | 704 }; |
677 } } // namespace v8::internal | 705 } } // namespace v8::internal |
678 | 706 |
679 #endif // V8_SERIALIZE_H_ | 707 #endif // V8_SERIALIZE_H_ |
OLD | NEW |