Index: src/heap/objects-visiting.cc |
diff --git a/src/heap/objects-visiting.cc b/src/heap/objects-visiting.cc |
index de2cfddb28438137df3641c14c85e48818a9bfef..8c2f198754525390688fe114b61c3daebb229f1d 100644 |
--- a/src/heap/objects-visiting.cc |
+++ b/src/heap/objects-visiting.cc |
@@ -191,7 +191,8 @@ |
template <class T> |
-Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer) { |
+Object* VisitWeakList(Heap* heap, Object* list, WeakObjectRetainer* retainer, |
+ bool stop_after_young, Object** list_tail) { |
Object* undefined = heap->undefined_value(); |
Object* head = undefined; |
T* tail = NULL; |
@@ -234,7 +235,10 @@ |
} |
// Terminate the list if there is one or more elements. |
- if (tail != NULL) WeakListVisitor<T>::SetWeakNext(tail, undefined); |
+ if (tail != NULL) { |
+ WeakListVisitor<T>::SetWeakNext(tail, undefined); |
+ if (list_tail) *list_tail = tail; |
+ } |
return head; |
} |
@@ -316,7 +320,8 @@ |
static void DoWeakList(Heap* heap, Context* context, |
WeakObjectRetainer* retainer, int index) { |
// Visit the weak list, removing dead intermediate elements. |
- Object* list_head = VisitWeakList<T>(heap, context->get(index), retainer); |
+ Object* list_head = |
+ VisitWeakList<T>(heap, context->get(index), retainer, false, NULL); |
// Update the list head. |
context->set(index, list_head, UPDATE_WRITE_BARRIER); |
@@ -340,6 +345,26 @@ |
template <> |
+struct WeakListVisitor<JSArrayBuffer> { |
+ static void SetWeakNext(JSArrayBuffer* obj, Object* next) { |
+ obj->set_weak_next(next); |
+ } |
+ |
+ static Object* WeakNext(JSArrayBuffer* obj) { return obj->weak_next(); } |
+ |
+ static int WeakNextOffset() { return JSArrayBuffer::kWeakNextOffset; } |
+ |
+ static void VisitLiveObject(Heap* heap, JSArrayBuffer* array_buffer, |
+ WeakObjectRetainer* retainer) { |
+ } |
+ |
+ static void VisitPhantomObject(Heap* heap, JSArrayBuffer* phantom) { |
+ Runtime::FreeArrayBuffer(heap->isolate(), phantom); |
+ } |
+}; |
+ |
+ |
+template <> |
struct WeakListVisitor<AllocationSite> { |
static void SetWeakNext(AllocationSite* obj, Object* next) { |
obj->set_weak_next(next); |
@@ -356,9 +381,19 @@ |
template Object* VisitWeakList<Context>(Heap* heap, Object* list, |
- WeakObjectRetainer* retainer); |
+ WeakObjectRetainer* retainer, |
+ bool stop_after_young, |
+ Object** list_tail); |
+ |
+ |
+template Object* VisitWeakList<JSArrayBuffer>(Heap* heap, Object* list, |
+ WeakObjectRetainer* retainer, |
+ bool stop_after_young, |
+ Object** list_tail); |
template Object* VisitWeakList<AllocationSite>(Heap* heap, Object* list, |
- WeakObjectRetainer* retainer); |
+ WeakObjectRetainer* retainer, |
+ bool stop_after_young, |
+ Object** list_tail); |
} |
} // namespace v8::internal |