OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 741 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
752 | 752 |
753 | 753 |
754 static const int kUnknownOffsetFromStart = -1; | 754 static const int kUnknownOffsetFromStart = -1; |
755 | 755 |
756 | 756 |
757 void Deserializer::ReadChunk(Object** current, | 757 void Deserializer::ReadChunk(Object** current, |
758 Object** limit, | 758 Object** limit, |
759 int source_space, | 759 int source_space, |
760 Address current_object_address) { | 760 Address current_object_address) { |
761 Isolate* const isolate = isolate_; | 761 Isolate* const isolate = isolate_; |
| 762 bool write_barrier_needed = (current_object_address != NULL && |
| 763 source_space != NEW_SPACE && |
| 764 source_space != CELL_SPACE && |
| 765 source_space == OLD_DATA_SPACE); |
762 while (current < limit) { | 766 while (current < limit) { |
763 int data = source_->Get(); | 767 int data = source_->Get(); |
764 switch (data) { | 768 switch (data) { |
765 #define CASE_STATEMENT(where, how, within, space_number) \ | 769 #define CASE_STATEMENT(where, how, within, space_number) \ |
766 case where + how + within + space_number: \ | 770 case where + how + within + space_number: \ |
767 ASSERT((where & ~kPointedToMask) == 0); \ | 771 ASSERT((where & ~kPointedToMask) == 0); \ |
768 ASSERT((how & ~kHowToCodeMask) == 0); \ | 772 ASSERT((how & ~kHowToCodeMask) == 0); \ |
769 ASSERT((within & ~kWhereToPointMask) == 0); \ | 773 ASSERT((within & ~kWhereToPointMask) == 0); \ |
770 ASSERT((space_number & ~kSpaceMask) == 0); | 774 ASSERT((space_number & ~kSpaceMask) == 0); |
771 | 775 |
772 #define CASE_BODY(where, how, within, space_number_if_any, offset_from_start) \ | 776 #define CASE_BODY(where, how, within, space_number_if_any, offset_from_start) \ |
773 { \ | 777 { \ |
774 bool emit_write_barrier = false; \ | 778 bool emit_write_barrier = false; \ |
775 bool current_was_incremented = false; \ | 779 bool current_was_incremented = false; \ |
776 int space_number = space_number_if_any == kAnyOldSpace ? \ | 780 int space_number = space_number_if_any == kAnyOldSpace ? \ |
777 (data & kSpaceMask) : space_number_if_any; \ | 781 (data & kSpaceMask) : space_number_if_any; \ |
778 if (where == kNewObject && how == kPlain && within == kStartOfObject) {\ | 782 if (where == kNewObject && how == kPlain && within == kStartOfObject) {\ |
779 ASSIGN_DEST_SPACE(space_number) \ | 783 ASSIGN_DEST_SPACE(space_number) \ |
780 ReadObject(space_number, dest_space, current); \ | 784 ReadObject(space_number, dest_space, current); \ |
781 emit_write_barrier = (space_number == NEW_SPACE && \ | 785 emit_write_barrier = (space_number == NEW_SPACE); \ |
782 source_space != NEW_SPACE && \ | |
783 source_space != CELL_SPACE); \ | |
784 } else { \ | 786 } else { \ |
785 Object* new_object = NULL; /* May not be a real Object pointer. */ \ | 787 Object* new_object = NULL; /* May not be a real Object pointer. */ \ |
786 if (where == kNewObject) { \ | 788 if (where == kNewObject) { \ |
787 ASSIGN_DEST_SPACE(space_number) \ | 789 ASSIGN_DEST_SPACE(space_number) \ |
788 ReadObject(space_number, dest_space, &new_object); \ | 790 ReadObject(space_number, dest_space, &new_object); \ |
789 } else if (where == kRootArray) { \ | 791 } else if (where == kRootArray) { \ |
790 if (source_space != CELL_SPACE && \ | 792 emit_write_barrier = true; \ |
791 source_space != CODE_SPACE && \ | |
792 source_space != OLD_DATA_SPACE) { \ | |
793 emit_write_barrier = true; \ | |
794 } \ | |
795 int root_id = source_->GetInt(); \ | 793 int root_id = source_->GetInt(); \ |
796 new_object = isolate->heap()->roots_array_start()[root_id]; \ | 794 new_object = isolate->heap()->roots_array_start()[root_id]; \ |
797 } else if (where == kPartialSnapshotCache) { \ | 795 } else if (where == kPartialSnapshotCache) { \ |
798 if (source_space != CELL_SPACE && \ | 796 emit_write_barrier = true; \ |
799 source_space != CODE_SPACE && \ | |
800 source_space != OLD_DATA_SPACE) { \ | |
801 emit_write_barrier = true; \ | |
802 } \ | |
803 int cache_index = source_->GetInt(); \ | 797 int cache_index = source_->GetInt(); \ |
804 new_object = isolate->serialize_partial_snapshot_cache() \ | 798 new_object = isolate->serialize_partial_snapshot_cache() \ |
805 [cache_index]; \ | 799 [cache_index]; \ |
806 } else if (where == kExternalReference) { \ | 800 } else if (where == kExternalReference) { \ |
807 int reference_id = source_->GetInt(); \ | 801 int reference_id = source_->GetInt(); \ |
808 Address address = external_reference_decoder_-> \ | 802 Address address = external_reference_decoder_-> \ |
809 Decode(reference_id); \ | 803 Decode(reference_id); \ |
810 new_object = reinterpret_cast<Object*>(address); \ | 804 new_object = reinterpret_cast<Object*>(address); \ |
811 } else if (where == kBackref) { \ | 805 } else if (where == kBackref) { \ |
812 emit_write_barrier = (space_number == NEW_SPACE && \ | 806 emit_write_barrier = (space_number == NEW_SPACE); \ |
813 source_space != NEW_SPACE && \ | |
814 source_space != CELL_SPACE); \ | |
815 new_object = GetAddressFromEnd(data & kSpaceMask); \ | 807 new_object = GetAddressFromEnd(data & kSpaceMask); \ |
816 } else { \ | 808 } else { \ |
817 ASSERT(where == kFromStart); \ | 809 ASSERT(where == kFromStart); \ |
818 if (offset_from_start == kUnknownOffsetFromStart) { \ | 810 if (offset_from_start == kUnknownOffsetFromStart) { \ |
819 emit_write_barrier = (space_number == NEW_SPACE && \ | 811 emit_write_barrier = (space_number == NEW_SPACE); \ |
820 source_space != NEW_SPACE && \ | |
821 source_space != CELL_SPACE); \ | |
822 new_object = GetAddressFromStart(data & kSpaceMask); \ | 812 new_object = GetAddressFromStart(data & kSpaceMask); \ |
823 } else { \ | 813 } else { \ |
824 Address object_address = pages_[space_number][0] + \ | 814 Address object_address = pages_[space_number][0] + \ |
825 (offset_from_start << kObjectAlignmentBits); \ | 815 (offset_from_start << kObjectAlignmentBits); \ |
826 new_object = HeapObject::FromAddress(object_address); \ | 816 new_object = HeapObject::FromAddress(object_address); \ |
827 } \ | 817 } \ |
828 } \ | 818 } \ |
829 if (within == kFirstInstruction) { \ | 819 if (within == kFirstInstruction) { \ |
830 Code* new_code_object = reinterpret_cast<Code*>(new_object); \ | 820 Code* new_code_object = reinterpret_cast<Code*>(new_object); \ |
831 new_object = reinterpret_cast<Object*>( \ | 821 new_object = reinterpret_cast<Object*>( \ |
832 new_code_object->instruction_start()); \ | 822 new_code_object->instruction_start()); \ |
833 } \ | 823 } \ |
834 if (how == kFromCode) { \ | 824 if (how == kFromCode) { \ |
835 Address location_of_branch_data = \ | 825 Address location_of_branch_data = \ |
836 reinterpret_cast<Address>(current); \ | 826 reinterpret_cast<Address>(current); \ |
837 Assembler::set_target_at(location_of_branch_data, \ | 827 Assembler::set_target_at(location_of_branch_data, \ |
838 reinterpret_cast<Address>(new_object)); \ | 828 reinterpret_cast<Address>(new_object)); \ |
839 if (within == kFirstInstruction) { \ | 829 if (within == kFirstInstruction) { \ |
840 location_of_branch_data += Assembler::kCallTargetSize; \ | 830 location_of_branch_data += Assembler::kCallTargetSize; \ |
841 current = reinterpret_cast<Object**>(location_of_branch_data); \ | 831 current = reinterpret_cast<Object**>(location_of_branch_data); \ |
842 current_was_incremented = true; \ | 832 current_was_incremented = true; \ |
843 } \ | 833 } \ |
844 } else { \ | 834 } else { \ |
845 *current = new_object; \ | 835 *current = new_object; \ |
846 } \ | 836 } \ |
847 } \ | 837 } \ |
848 if (emit_write_barrier && current_object_address != NULL) { \ | 838 if (emit_write_barrier && write_barrier_needed) { \ |
849 Address current_address = reinterpret_cast<Address>(current); \ | 839 Address current_address = reinterpret_cast<Address>(current); \ |
850 isolate->heap()->RecordWrite( \ | 840 isolate->heap()->RecordWrite( \ |
851 current_object_address, \ | 841 current_object_address, \ |
852 static_cast<int>(current_address - current_object_address)); \ | 842 static_cast<int>(current_address - current_object_address)); \ |
853 } \ | 843 } \ |
854 if (!current_was_incremented) { \ | 844 if (!current_was_incremented) { \ |
855 current++; /* Increment current if it wasn't done above. */ \ | 845 current++; \ |
856 } \ | 846 } \ |
857 break; \ | 847 break; \ |
858 } \ | 848 } \ |
859 | 849 |
860 // This generates a case and a body for each space. The large object spaces are | 850 // This generates a case and a body for each space. The large object spaces are |
861 // very rare in snapshots so they are grouped in one body. | 851 // very rare in snapshots so they are grouped in one body. |
862 #define ONE_PER_SPACE(where, how, within) \ | 852 #define ONE_PER_SPACE(where, how, within) \ |
863 CASE_STATEMENT(where, how, within, NEW_SPACE) \ | 853 CASE_STATEMENT(where, how, within, NEW_SPACE) \ |
864 CASE_BODY(where, how, within, NEW_SPACE, kUnknownOffsetFromStart) \ | 854 CASE_BODY(where, how, within, NEW_SPACE, kUnknownOffsetFromStart) \ |
865 CASE_STATEMENT(where, how, within, OLD_DATA_SPACE) \ | 855 CASE_STATEMENT(where, how, within, OLD_DATA_SPACE) \ |
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1651 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); | 1641 fullness_[space] = RoundUp(fullness_[space], Page::kPageSize); |
1652 } | 1642 } |
1653 } | 1643 } |
1654 int allocation_address = fullness_[space]; | 1644 int allocation_address = fullness_[space]; |
1655 fullness_[space] = allocation_address + size; | 1645 fullness_[space] = allocation_address + size; |
1656 return allocation_address; | 1646 return allocation_address; |
1657 } | 1647 } |
1658 | 1648 |
1659 | 1649 |
1660 } } // namespace v8::internal | 1650 } } // namespace v8::internal |
OLD | NEW |