| OLD | NEW | 
|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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/heap/objects-visiting.h" | 7 #include "src/heap/objects-visiting.h" | 
| 8 | 8 | 
| 9 namespace v8 { | 9 namespace v8 { | 
| 10 namespace internal { | 10 namespace internal { | 
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 185          heap->mark_compact_collector()->is_compacting(); | 185          heap->mark_compact_collector()->is_compacting(); | 
| 186 } | 186 } | 
| 187 | 187 | 
| 188 | 188 | 
| 189 template <class T> | 189 template <class T> | 
| 190 struct WeakListVisitor; | 190 struct WeakListVisitor; | 
| 191 | 191 | 
| 192 | 192 | 
| 193 template <class T> | 193 template <class T> | 
| 194 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer, | 194 Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer, | 
| 195                       bool stop_after_young) { | 195                       bool stop_after_young, Object** list_tail) { | 
| 196   Object* undefined = heap->undefined_value(); | 196   Object* undefined = heap->undefined_value(); | 
| 197   Object* head = undefined; | 197   Object* head = undefined; | 
| 198   T* tail = NULL; | 198   T* tail = NULL; | 
| 199   MarkCompactCollector* collector = heap->mark_compact_collector(); | 199   MarkCompactCollector* collector = heap->mark_compact_collector(); | 
| 200   bool record_slots = MustRecordSlots(heap); | 200   bool record_slots = MustRecordSlots(heap); | 
| 201 | 201 | 
| 202   while (list != undefined) { | 202   while (list != undefined) { | 
| 203     // Check whether to keep the candidate in the list. | 203     // Check whether to keep the candidate in the list. | 
| 204     T* candidate = reinterpret_cast<T*>(list); | 204     T* candidate = reinterpret_cast<T*>(list); | 
| 205 | 205 | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 230       WeakListVisitor<T>::VisitPhantomObject(heap, candidate); | 230       WeakListVisitor<T>::VisitPhantomObject(heap, candidate); | 
| 231     } | 231     } | 
| 232 | 232 | 
| 233     // Move to next element in the list. | 233     // Move to next element in the list. | 
| 234     list = WeakListVisitor<T>::WeakNext(candidate); | 234     list = WeakListVisitor<T>::WeakNext(candidate); | 
| 235   } | 235   } | 
| 236 | 236 | 
| 237   // Terminate the list if there is one or more elements. | 237   // Terminate the list if there is one or more elements. | 
| 238   if (tail != NULL) { | 238   if (tail != NULL) { | 
| 239     WeakListVisitor<T>::SetWeakNext(tail, undefined); | 239     WeakListVisitor<T>::SetWeakNext(tail, undefined); | 
|  | 240     if (list_tail) *list_tail = tail; | 
| 240   } | 241   } | 
| 241   return head; | 242   return head; | 
| 242 } | 243 } | 
| 243 | 244 | 
| 244 | 245 | 
| 245 Object* VisitNewArrayBufferViewsWeakList(Heap* heap, Object* list, | 246 Object* VisitNewArrayBufferViewsWeakList(Heap* heap, Object* list, | 
| 246                                          WeakObjectRetainer* retainer) { | 247                                          WeakObjectRetainer* retainer) { | 
| 247   Object* undefined = heap->undefined_value(); | 248   Object* undefined = heap->undefined_value(); | 
| 248   Object* previous = undefined; | 249   Object* previous = undefined; | 
| 249   Object* head = undefined; | 250   Object* head = undefined; | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 363       DoWeakList<Code>(heap, context, retainer, Context::OPTIMIZED_CODE_LIST); | 364       DoWeakList<Code>(heap, context, retainer, Context::OPTIMIZED_CODE_LIST); | 
| 364       DoWeakList<Code>(heap, context, retainer, Context::DEOPTIMIZED_CODE_LIST); | 365       DoWeakList<Code>(heap, context, retainer, Context::DEOPTIMIZED_CODE_LIST); | 
| 365     } | 366     } | 
| 366   } | 367   } | 
| 367 | 368 | 
| 368   template <class T> | 369   template <class T> | 
| 369   static void DoWeakList(Heap* heap, Context* context, | 370   static void DoWeakList(Heap* heap, Context* context, | 
| 370                          WeakObjectRetainer* retainer, int index) { | 371                          WeakObjectRetainer* retainer, int index) { | 
| 371     // Visit the weak list, removing dead intermediate elements. | 372     // Visit the weak list, removing dead intermediate elements. | 
| 372     Object* list_head = | 373     Object* list_head = | 
| 373         VisitWeakList<T>(heap, context->get(index), retainer, false); | 374         VisitWeakList<T>(heap, context->get(index), retainer, false, NULL); | 
| 374 | 375 | 
| 375     // Update the list head. | 376     // Update the list head. | 
| 376     context->set(index, list_head, UPDATE_WRITE_BARRIER); | 377     context->set(index, list_head, UPDATE_WRITE_BARRIER); | 
| 377 | 378 | 
| 378     if (MustRecordSlots(heap)) { | 379     if (MustRecordSlots(heap)) { | 
| 379       // Record the updated slot if necessary. | 380       // Record the updated slot if necessary. | 
| 380       Object** head_slot = | 381       Object** head_slot = | 
| 381           HeapObject::RawField(context, FixedArray::SizeFor(index)); | 382           HeapObject::RawField(context, FixedArray::SizeFor(index)); | 
| 382       heap->mark_compact_collector()->RecordSlot(head_slot, head_slot, | 383       heap->mark_compact_collector()->RecordSlot(head_slot, head_slot, | 
| 383                                                  list_head); | 384                                                  list_head); | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 415     obj->set_weak_next(next); | 416     obj->set_weak_next(next); | 
| 416   } | 417   } | 
| 417 | 418 | 
| 418   static Object* WeakNext(JSArrayBuffer* obj) { return obj->weak_next(); } | 419   static Object* WeakNext(JSArrayBuffer* obj) { return obj->weak_next(); } | 
| 419 | 420 | 
| 420   static int WeakNextOffset() { return JSArrayBuffer::kWeakNextOffset; } | 421   static int WeakNextOffset() { return JSArrayBuffer::kWeakNextOffset; } | 
| 421 | 422 | 
| 422   static void VisitLiveObject(Heap* heap, JSArrayBuffer* array_buffer, | 423   static void VisitLiveObject(Heap* heap, JSArrayBuffer* array_buffer, | 
| 423                               WeakObjectRetainer* retainer) { | 424                               WeakObjectRetainer* retainer) { | 
| 424     Object* typed_array_obj = VisitWeakList<JSArrayBufferView>( | 425     Object* typed_array_obj = VisitWeakList<JSArrayBufferView>( | 
| 425         heap, array_buffer->weak_first_view(), retainer, false); | 426         heap, array_buffer->weak_first_view(), retainer, false, NULL); | 
| 426     array_buffer->set_weak_first_view(typed_array_obj); | 427     array_buffer->set_weak_first_view(typed_array_obj); | 
| 427     if (typed_array_obj != heap->undefined_value() && MustRecordSlots(heap)) { | 428     if (typed_array_obj != heap->undefined_value() && MustRecordSlots(heap)) { | 
| 428       Object** slot = HeapObject::RawField(array_buffer, | 429       Object** slot = HeapObject::RawField(array_buffer, | 
| 429                                            JSArrayBuffer::kWeakFirstViewOffset); | 430                                            JSArrayBuffer::kWeakFirstViewOffset); | 
| 430       heap->mark_compact_collector()->RecordSlot(slot, slot, typed_array_obj); | 431       heap->mark_compact_collector()->RecordSlot(slot, slot, typed_array_obj); | 
| 431     } | 432     } | 
| 432   } | 433   } | 
| 433 | 434 | 
| 434   static void VisitPhantomObject(Heap* heap, JSArrayBuffer* phantom) { | 435   static void VisitPhantomObject(Heap* heap, JSArrayBuffer* phantom) { | 
| 435     Runtime::FreeArrayBuffer(heap->isolate(), phantom); | 436     Runtime::FreeArrayBuffer(heap->isolate(), phantom); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 448   static int WeakNextOffset() { return AllocationSite::kWeakNextOffset; } | 449   static int WeakNextOffset() { return AllocationSite::kWeakNextOffset; } | 
| 449 | 450 | 
| 450   static void VisitLiveObject(Heap*, AllocationSite*, WeakObjectRetainer*) {} | 451   static void VisitLiveObject(Heap*, AllocationSite*, WeakObjectRetainer*) {} | 
| 451 | 452 | 
| 452   static void VisitPhantomObject(Heap*, AllocationSite*) {} | 453   static void VisitPhantomObject(Heap*, AllocationSite*) {} | 
| 453 }; | 454 }; | 
| 454 | 455 | 
| 455 | 456 | 
| 456 template Object* VisitWeakList<Context>(Heap* heap, Object* list, | 457 template Object* VisitWeakList<Context>(Heap* heap, Object* list, | 
| 457                                         WeakObjectRetainer* retainer, | 458                                         WeakObjectRetainer* retainer, | 
| 458                                         bool stop_after_young); | 459                                         bool stop_after_young, | 
|  | 460                                         Object** list_tail); | 
| 459 | 461 | 
| 460 | 462 | 
| 461 template Object* VisitWeakList<JSArrayBuffer>(Heap* heap, Object* list, | 463 template Object* VisitWeakList<JSArrayBuffer>(Heap* heap, Object* list, | 
| 462                                               WeakObjectRetainer* retainer, | 464                                               WeakObjectRetainer* retainer, | 
| 463                                               bool stop_after_young); | 465                                               bool stop_after_young, | 
|  | 466                                               Object** list_tail); | 
| 464 | 467 | 
| 465 template Object* VisitWeakList<JSArrayBufferView>(Heap* heap, Object* list, | 468 template Object* VisitWeakList<JSArrayBufferView>(Heap* heap, Object* list, | 
| 466                                                   WeakObjectRetainer* retainer, | 469                                                   WeakObjectRetainer* retainer, | 
| 467                                                   bool stop_after_young); | 470                                                   bool stop_after_young, | 
|  | 471                                                   Object** list_tail); | 
| 468 | 472 | 
| 469 template Object* VisitWeakList<AllocationSite>(Heap* heap, Object* list, | 473 template Object* VisitWeakList<AllocationSite>(Heap* heap, Object* list, | 
| 470                                                WeakObjectRetainer* retainer, | 474                                                WeakObjectRetainer* retainer, | 
| 471                                                bool stop_after_young); | 475                                                bool stop_after_young, | 
|  | 476                                                Object** list_tail); | 
| 472 } | 477 } | 
| 473 }  // namespace v8::internal | 478 }  // namespace v8::internal | 
| OLD | NEW | 
|---|