| 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 #include "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/base/atomicops.h" | 7 #include "src/base/atomicops.h" |
| 8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/compilation-cache.h" | 10 #include "src/compilation-cache.h" |
| (...skipping 2866 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2877 } | 2877 } |
| 2878 | 2878 |
| 2879 void VisitEmbeddedPointer(RelocInfo* rinfo) { | 2879 void VisitEmbeddedPointer(RelocInfo* rinfo) { |
| 2880 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); | 2880 DCHECK(rinfo->rmode() == RelocInfo::EMBEDDED_OBJECT); |
| 2881 Object* target = rinfo->target_object(); | 2881 Object* target = rinfo->target_object(); |
| 2882 Object* old_target = target; | 2882 Object* old_target = target; |
| 2883 VisitPointer(&target); | 2883 VisitPointer(&target); |
| 2884 // Avoid unnecessary changes that might unnecessary flush the instruction | 2884 // Avoid unnecessary changes that might unnecessary flush the instruction |
| 2885 // cache. | 2885 // cache. |
| 2886 if (target != old_target) { | 2886 if (target != old_target) { |
| 2887 // TODO(jochen): Remove again after fixing http://crbug.com/452095 |
| 2888 CHECK(target->IsHeapObject() == old_target->IsHeapObject()); |
| 2887 rinfo->set_target_object(target); | 2889 rinfo->set_target_object(target); |
| 2888 } | 2890 } |
| 2889 } | 2891 } |
| 2890 | 2892 |
| 2891 void VisitCodeTarget(RelocInfo* rinfo) { | 2893 void VisitCodeTarget(RelocInfo* rinfo) { |
| 2892 DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); | 2894 DCHECK(RelocInfo::IsCodeTarget(rinfo->rmode())); |
| 2893 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); | 2895 Object* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); |
| 2894 Object* old_target = target; | 2896 Object* old_target = target; |
| 2895 VisitPointer(&target); | 2897 VisitPointer(&target); |
| 2896 if (target != old_target) { | 2898 if (target != old_target) { |
| 2899 // TODO(jochen): Remove again after fixing http://crbug.com/452095 |
| 2900 CHECK(target->IsHeapObject() == old_target->IsHeapObject()); |
| 2897 rinfo->set_target_address(Code::cast(target)->instruction_start()); | 2901 rinfo->set_target_address(Code::cast(target)->instruction_start()); |
| 2898 } | 2902 } |
| 2899 } | 2903 } |
| 2900 | 2904 |
| 2901 void VisitCodeAgeSequence(RelocInfo* rinfo) { | 2905 void VisitCodeAgeSequence(RelocInfo* rinfo) { |
| 2902 DCHECK(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); | 2906 DCHECK(RelocInfo::IsCodeAgeSequence(rinfo->rmode())); |
| 2903 Object* stub = rinfo->code_age_stub(); | 2907 Object* stub = rinfo->code_age_stub(); |
| 2904 DCHECK(stub != NULL); | 2908 DCHECK(stub != NULL); |
| 2905 VisitPointer(&stub); | 2909 VisitPointer(&stub); |
| 2906 if (stub != rinfo->code_age_stub()) { | 2910 if (stub != rinfo->code_age_stub()) { |
| 2911 // TODO(jochen): Remove again after fixing http://crbug.com/452095 |
| 2912 CHECK(stub->IsHeapObject() == rinfo->code_age_stub()->IsHeapObject()); |
| 2907 rinfo->set_code_age_stub(Code::cast(stub)); | 2913 rinfo->set_code_age_stub(Code::cast(stub)); |
| 2908 } | 2914 } |
| 2909 } | 2915 } |
| 2910 | 2916 |
| 2911 void VisitDebugTarget(RelocInfo* rinfo) { | 2917 void VisitDebugTarget(RelocInfo* rinfo) { |
| 2912 DCHECK((RelocInfo::IsJSReturn(rinfo->rmode()) && | 2918 DCHECK((RelocInfo::IsJSReturn(rinfo->rmode()) && |
| 2913 rinfo->IsPatchedReturnSequence()) || | 2919 rinfo->IsPatchedReturnSequence()) || |
| 2914 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && | 2920 (RelocInfo::IsDebugBreakSlot(rinfo->rmode()) && |
| 2915 rinfo->IsPatchedDebugBreakSlotSequence())); | 2921 rinfo->IsPatchedDebugBreakSlotSequence())); |
| 2916 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); | 2922 Object* target = Code::GetCodeFromTargetAddress(rinfo->call_address()); |
| 2917 VisitPointer(&target); | 2923 VisitPointer(&target); |
| 2924 // TODO(jochen): Remove again after fixing http://crbug.com/452095 |
| 2925 CHECK(target->IsCode() && |
| 2926 HAS_SMI_TAG(Code::cast(target)->instruction_start())); |
| 2918 rinfo->set_call_address(Code::cast(target)->instruction_start()); | 2927 rinfo->set_call_address(Code::cast(target)->instruction_start()); |
| 2919 } | 2928 } |
| 2920 | 2929 |
| 2921 static inline void UpdateSlot(Heap* heap, Object** slot) { | 2930 static inline void UpdateSlot(Heap* heap, Object** slot) { |
| 2922 Object* obj = reinterpret_cast<Object*>( | 2931 Object* obj = reinterpret_cast<Object*>( |
| 2923 base::NoBarrier_Load(reinterpret_cast<base::AtomicWord*>(slot))); | 2932 base::NoBarrier_Load(reinterpret_cast<base::AtomicWord*>(slot))); |
| 2924 | 2933 |
| 2925 if (!obj->IsHeapObject()) return; | 2934 if (!obj->IsHeapObject()) return; |
| 2926 | 2935 |
| 2927 HeapObject* heap_obj = HeapObject::cast(obj); | 2936 HeapObject* heap_obj = HeapObject::cast(obj); |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3052 | 3061 |
| 3053 | 3062 |
| 3054 static void UpdatePointer(HeapObject** address, HeapObject* object) { | 3063 static void UpdatePointer(HeapObject** address, HeapObject* object) { |
| 3055 MapWord map_word = object->map_word(); | 3064 MapWord map_word = object->map_word(); |
| 3056 // The store buffer can still contain stale pointers in dead large objects. | 3065 // The store buffer can still contain stale pointers in dead large objects. |
| 3057 // Ignore these pointers here. | 3066 // Ignore these pointers here. |
| 3058 DCHECK(map_word.IsForwardingAddress() || | 3067 DCHECK(map_word.IsForwardingAddress() || |
| 3059 object->GetHeap()->lo_space()->FindPage( | 3068 object->GetHeap()->lo_space()->FindPage( |
| 3060 reinterpret_cast<Address>(address)) != NULL); | 3069 reinterpret_cast<Address>(address)) != NULL); |
| 3061 if (map_word.IsForwardingAddress()) { | 3070 if (map_word.IsForwardingAddress()) { |
| 3071 // TODO(jochen): Remove again after fixing http://crbug.com/452095 |
| 3072 CHECK((*address)->IsHeapObject() == |
| 3073 map_word.ToForwardingAddress()->IsHeapObject()); |
| 3062 // Update the corresponding slot. | 3074 // Update the corresponding slot. |
| 3063 *address = map_word.ToForwardingAddress(); | 3075 *address = map_word.ToForwardingAddress(); |
| 3064 } | 3076 } |
| 3065 } | 3077 } |
| 3066 | 3078 |
| 3067 | 3079 |
| 3068 static String* UpdateReferenceInExternalStringTableEntry(Heap* heap, | 3080 static String* UpdateReferenceInExternalStringTableEntry(Heap* heap, |
| 3069 Object** p) { | 3081 Object** p) { |
| 3070 MapWord map_word = HeapObject::cast(*p)->map_word(); | 3082 MapWord map_word = HeapObject::cast(*p)->map_word(); |
| 3071 | 3083 |
| (...skipping 1678 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4750 SlotsBuffer* buffer = *buffer_address; | 4762 SlotsBuffer* buffer = *buffer_address; |
| 4751 while (buffer != NULL) { | 4763 while (buffer != NULL) { |
| 4752 SlotsBuffer* next_buffer = buffer->next(); | 4764 SlotsBuffer* next_buffer = buffer->next(); |
| 4753 DeallocateBuffer(buffer); | 4765 DeallocateBuffer(buffer); |
| 4754 buffer = next_buffer; | 4766 buffer = next_buffer; |
| 4755 } | 4767 } |
| 4756 *buffer_address = NULL; | 4768 *buffer_address = NULL; |
| 4757 } | 4769 } |
| 4758 } | 4770 } |
| 4759 } // namespace v8::internal | 4771 } // namespace v8::internal |
| OLD | NEW |