| Index: src/heap/heap.cc
|
| diff --git a/src/heap/heap.cc b/src/heap/heap.cc
|
| index 0742aafc83913c1c3e4a46792ca6da2e415c2ebe..e8a533416d06b2af1d6158ff9ff3e4ff9b1fdd6a 100644
|
| --- a/src/heap/heap.cc
|
| +++ b/src/heap/heap.cc
|
| @@ -144,7 +144,8 @@ Heap::Heap()
|
| external_string_table_(this),
|
| chunks_queued_for_free_(NULL),
|
| gc_callbacks_depth_(0),
|
| - deserialization_complete_(false) {
|
| + deserialization_complete_(false),
|
| + promotion_failure_(false) {
|
| // Allow build-time customization of the max semispace size. Building
|
| // V8 with snapshots and a non-default max semispace size is much
|
| // easier if you can define it as part of the build environment.
|
| @@ -731,6 +732,7 @@ void Heap::GarbageCollectionEpilogue() {
|
| // Remember the last top pointer so that we can later find out
|
| // whether we allocated in new space since the last GC.
|
| new_space_top_after_last_gc_ = new_space()->top();
|
| + set_promotion_failure(false);
|
| }
|
|
|
|
|
| @@ -1689,32 +1691,43 @@ void Heap::UpdateReferencesInExternalStringTable(
|
|
|
|
|
| void Heap::ProcessAllWeakReferences(WeakObjectRetainer* retainer) {
|
| - ProcessArrayBuffers(retainer);
|
| + ProcessArrayBuffers(retainer, false);
|
| + ProcessNewArrayBufferViews(retainer);
|
| ProcessNativeContexts(retainer);
|
| ProcessAllocationSites(retainer);
|
| }
|
|
|
|
|
| void Heap::ProcessYoungWeakReferences(WeakObjectRetainer* retainer) {
|
| - ProcessArrayBuffers(retainer);
|
| + ProcessArrayBuffers(retainer, true);
|
| + ProcessNewArrayBufferViews(retainer);
|
| ProcessNativeContexts(retainer);
|
| }
|
|
|
|
|
| void Heap::ProcessNativeContexts(WeakObjectRetainer* retainer) {
|
| - Object* head = VisitWeakList<Context>(this, native_contexts_list(), retainer);
|
| + Object* head =
|
| + VisitWeakList<Context>(this, native_contexts_list(), retainer, false);
|
| // Update the head of the list of contexts.
|
| set_native_contexts_list(head);
|
| }
|
|
|
|
|
| -void Heap::ProcessArrayBuffers(WeakObjectRetainer* retainer) {
|
| - Object* array_buffer_obj =
|
| - VisitWeakList<JSArrayBuffer>(this, array_buffers_list(), retainer);
|
| +void Heap::ProcessArrayBuffers(WeakObjectRetainer* retainer,
|
| + bool stop_after_young) {
|
| + Object* array_buffer_obj = VisitWeakList<JSArrayBuffer>(
|
| + this, array_buffers_list(), retainer, stop_after_young);
|
| set_array_buffers_list(array_buffer_obj);
|
| }
|
|
|
|
|
| +void Heap::ProcessNewArrayBufferViews(WeakObjectRetainer* retainer) {
|
| + Object* typed_array_obj = VisitWeakList<JSArrayBufferView>(
|
| + this, new_array_buffers_view_list_, retainer, false);
|
| + set_new_array_buffers_view_list(typed_array_obj);
|
| +}
|
| +
|
| +
|
| void Heap::TearDownArrayBuffers() {
|
| Object* undefined = undefined_value();
|
| for (Object* o = array_buffers_list(); o != undefined;) {
|
| @@ -1727,8 +1740,8 @@ void Heap::TearDownArrayBuffers() {
|
|
|
|
|
| void Heap::ProcessAllocationSites(WeakObjectRetainer* retainer) {
|
| - Object* allocation_site_obj =
|
| - VisitWeakList<AllocationSite>(this, allocation_sites_list(), retainer);
|
| + Object* allocation_site_obj = VisitWeakList<AllocationSite>(
|
| + this, allocation_sites_list(), retainer, false);
|
| set_allocation_sites_list(allocation_site_obj);
|
| }
|
|
|
| @@ -2161,6 +2174,7 @@ class ScavengingVisitor : public StaticVisitorBase {
|
| return;
|
| }
|
|
|
| + heap->set_promotion_failure(true);
|
| // If promotion failed, we try to copy the object to the other semi-space
|
| if (SemiSpaceCopyObject<alignment>(map, slot, object, object_size)) return;
|
|
|
| @@ -5500,6 +5514,7 @@ bool Heap::CreateHeapObjects() {
|
|
|
| set_native_contexts_list(undefined_value());
|
| set_array_buffers_list(undefined_value());
|
| + set_new_array_buffers_view_list(undefined_value());
|
| set_allocation_sites_list(undefined_value());
|
| weak_object_to_code_table_ = undefined_value();
|
| return true;
|
|
|