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 2449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2460 void VisitDebugTarget(RelocInfo* rinfo) { | 2460 void VisitDebugTarget(RelocInfo* rinfo) { |
2461 ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) && | 2461 ASSERT((RelocInfo::IsJSReturn(rinfo->rmode()) && |
2462 rinfo->IsPatchedReturnSequence()) || | 2462 rinfo->IsPatchedReturnSequence()) || |
2463 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && | 2463 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
2464 rinfo->IsPatchedDebugBreakSlotSequence())); | 2464 rinfo->IsPatchedDebugBreakSlotSequence())); |
2465 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); | 2465 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); |
2466 VisitPointer(&target); | 2466 VisitPointer(&target); |
2467 rinfo->set_call_address(Code::cast(target)->instruction_start()); | 2467 rinfo->set_call_address(Code::cast(target)->instruction_start()); |
2468 } | 2468 } |
2469 | 2469 |
| 2470 static inline void UpdateSlot(Heap* heap, Object** slot) { |
| 2471 Object* obj = *slot; |
| 2472 |
| 2473 if (!obj->IsHeapObject()) return; |
| 2474 |
| 2475 HeapObject* heap_obj = HeapObject::cast(obj); |
| 2476 |
| 2477 MapWord map_word = heap_obj->map_word(); |
| 2478 if (map_word.IsForwardingAddress()) { |
| 2479 ASSERT(heap->InFromSpace(heap_obj) || |
| 2480 MarkCompactCollector::IsOnEvacuationCandidate(heap_obj)); |
| 2481 HeapObject* target = map_word.ToForwardingAddress(); |
| 2482 *slot = target; |
| 2483 ASSERT(!heap->InFromSpace(target) && |
| 2484 !MarkCompactCollector::IsOnEvacuationCandidate(target)); |
| 2485 } |
| 2486 } |
| 2487 |
2470 private: | 2488 private: |
| 2489 |
2471 inline void UpdatePointer(Object** p) { | 2490 inline void UpdatePointer(Object** p) { |
2472 if (!(*p)->IsHeapObject()) return; | 2491 UpdateSlot(heap_, p); |
2473 | |
2474 HeapObject* obj = HeapObject::cast(*p); | |
2475 | |
2476 MapWord map_word = obj->map_word(); | |
2477 if (map_word.IsForwardingAddress()) { | |
2478 ASSERT(heap_->InFromSpace(obj) || | |
2479 MarkCompactCollector::IsOnEvacuationCandidate(obj)); | |
2480 *p = obj->map_word().ToForwardingAddress(); | |
2481 ASSERT(!heap_->InFromSpace(*p) && | |
2482 !MarkCompactCollector::IsOnEvacuationCandidate(*p)); | |
2483 } | |
2484 } | 2492 } |
2485 | 2493 |
2486 Heap* heap_; | 2494 Heap* heap_; |
2487 }; | 2495 }; |
2488 | 2496 |
2489 | 2497 |
2490 static void UpdatePointer(HeapObject** p, HeapObject* object) { | 2498 static void UpdatePointer(HeapObject** p, HeapObject* object) { |
2491 ASSERT(*p == object); | 2499 ASSERT(*p == object); |
2492 | 2500 |
2493 Address old_addr = object->address(); | 2501 Address old_addr = object->address(); |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2719 MapWord map_word = heap_object->map_word(); | 2727 MapWord map_word = heap_object->map_word(); |
2720 if (map_word.IsForwardingAddress()) { | 2728 if (map_word.IsForwardingAddress()) { |
2721 return map_word.ToForwardingAddress(); | 2729 return map_word.ToForwardingAddress(); |
2722 } | 2730 } |
2723 } | 2731 } |
2724 return object; | 2732 return object; |
2725 } | 2733 } |
2726 }; | 2734 }; |
2727 | 2735 |
2728 | 2736 |
2729 static inline void UpdateSlot(Object** slot) { | |
2730 Object* obj = *slot; | |
2731 if (!obj->IsHeapObject()) return; | |
2732 | |
2733 HeapObject* heap_obj = HeapObject::cast(obj); | |
2734 | |
2735 MapWord map_word = heap_obj->map_word(); | |
2736 if (map_word.IsForwardingAddress()) { | |
2737 ASSERT(MarkCompactCollector::IsOnEvacuationCandidate(*slot)); | |
2738 *slot = map_word.ToForwardingAddress(); | |
2739 ASSERT(!MarkCompactCollector::IsOnEvacuationCandidate(*slot)); | |
2740 } | |
2741 } | |
2742 | |
2743 | |
2744 static inline void UpdateSlot(ObjectVisitor* v, | 2737 static inline void UpdateSlot(ObjectVisitor* v, |
2745 SlotsBuffer::SlotType slot_type, | 2738 SlotsBuffer::SlotType slot_type, |
2746 Address addr) { | 2739 Address addr) { |
2747 switch (slot_type) { | 2740 switch (slot_type) { |
2748 case SlotsBuffer::CODE_TARGET_SLOT: { | 2741 case SlotsBuffer::CODE_TARGET_SLOT: { |
2749 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); | 2742 RelocInfo rinfo(addr, RelocInfo::CODE_TARGET, 0, NULL); |
2750 rinfo.Visit(v); | 2743 rinfo.Visit(v); |
2751 break; | 2744 break; |
2752 } | 2745 } |
2753 case SlotsBuffer::CODE_ENTRY_SLOT: { | 2746 case SlotsBuffer::CODE_ENTRY_SLOT: { |
(...skipping 996 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3750 return static_cast<SlotsBuffer::SlotType>(reinterpret_cast<intptr_t>(slot)); | 3743 return static_cast<SlotsBuffer::SlotType>(reinterpret_cast<intptr_t>(slot)); |
3751 } | 3744 } |
3752 | 3745 |
3753 | 3746 |
3754 void SlotsBuffer::UpdateSlots(Heap* heap) { | 3747 void SlotsBuffer::UpdateSlots(Heap* heap) { |
3755 PointersUpdatingVisitor v(heap); | 3748 PointersUpdatingVisitor v(heap); |
3756 | 3749 |
3757 for (int slot_idx = 0; slot_idx < idx_; ++slot_idx) { | 3750 for (int slot_idx = 0; slot_idx < idx_; ++slot_idx) { |
3758 ObjectSlot slot = slots_[slot_idx]; | 3751 ObjectSlot slot = slots_[slot_idx]; |
3759 if (!IsTypedSlot(slot)) { | 3752 if (!IsTypedSlot(slot)) { |
3760 UpdateSlot(slot); | 3753 PointersUpdatingVisitor::UpdateSlot(heap, slot); |
3761 } else { | 3754 } else { |
3762 ++slot_idx; | 3755 ++slot_idx; |
3763 ASSERT(slot_idx < idx_); | 3756 ASSERT(slot_idx < idx_); |
3764 UpdateSlot(&v, | 3757 UpdateSlot(&v, |
3765 DecodeSlotType(slot), | 3758 DecodeSlotType(slot), |
3766 reinterpret_cast<Address>(slots_[slot_idx])); | 3759 reinterpret_cast<Address>(slots_[slot_idx])); |
3767 } | 3760 } |
3768 } | 3761 } |
3769 } | 3762 } |
3770 | 3763 |
3771 | 3764 |
3772 void SlotsBuffer::UpdateSlotsWithFilter(Heap* heap) { | 3765 void SlotsBuffer::UpdateSlotsWithFilter(Heap* heap) { |
3773 PointersUpdatingVisitor v(heap); | 3766 PointersUpdatingVisitor v(heap); |
3774 | 3767 |
3775 for (int slot_idx = 0; slot_idx < idx_; ++slot_idx) { | 3768 for (int slot_idx = 0; slot_idx < idx_; ++slot_idx) { |
3776 ObjectSlot slot = slots_[slot_idx]; | 3769 ObjectSlot slot = slots_[slot_idx]; |
3777 if (!IsTypedSlot(slot)) { | 3770 if (!IsTypedSlot(slot)) { |
3778 if (!IsOnInvalidatedCodeObject(reinterpret_cast<Address>(slot))) { | 3771 if (!IsOnInvalidatedCodeObject(reinterpret_cast<Address>(slot))) { |
3779 UpdateSlot(slot); | 3772 PointersUpdatingVisitor::UpdateSlot(heap, slot); |
3780 } | 3773 } |
3781 } else { | 3774 } else { |
3782 ++slot_idx; | 3775 ++slot_idx; |
3783 ASSERT(slot_idx < idx_); | 3776 ASSERT(slot_idx < idx_); |
3784 Address pc = reinterpret_cast<Address>(slots_[slot_idx]); | 3777 Address pc = reinterpret_cast<Address>(slots_[slot_idx]); |
3785 if (!IsOnInvalidatedCodeObject(pc)) { | 3778 if (!IsOnInvalidatedCodeObject(pc)) { |
3786 UpdateSlot(&v, | 3779 UpdateSlot(&v, |
3787 DecodeSlotType(slot), | 3780 DecodeSlotType(slot), |
3788 reinterpret_cast<Address>(slots_[slot_idx])); | 3781 reinterpret_cast<Address>(slots_[slot_idx])); |
3789 } | 3782 } |
(...skipping 17 matching lines...) Expand all Loading... |
3807 while (buffer != NULL) { | 3800 while (buffer != NULL) { |
3808 SlotsBuffer* next_buffer = buffer->next(); | 3801 SlotsBuffer* next_buffer = buffer->next(); |
3809 DeallocateBuffer(buffer); | 3802 DeallocateBuffer(buffer); |
3810 buffer = next_buffer; | 3803 buffer = next_buffer; |
3811 } | 3804 } |
3812 *buffer_address = NULL; | 3805 *buffer_address = NULL; |
3813 } | 3806 } |
3814 | 3807 |
3815 | 3808 |
3816 } } // namespace v8::internal | 3809 } } // namespace v8::internal |
OLD | NEW |