From 01a6c8ae353261ad015da42c45364d319dc0c4ed Mon Sep 17 00:00:00 2001 From: "alph@chromium.org" Date: Fri, 24 Jan 2014 15:10:09 +0000 Subject: [PATCH] Mark weak fields of JSArrayBuffer and JSArrayBufferView as weak in heap snapshot. BUG=337144 LOG=N R=ulan@chromium.org, yurys@chromium.org Review URL: https://codereview.chromium.org/138443009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18830 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/heap-snapshot-generator.cc | 12 ++++++++++++ test/cctest/test-heap-profiler.cc | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/src/heap-snapshot-generator.cc b/src/heap-snapshot-generator.cc index 35cfcb4..8c8182e 100644 --- a/src/heap-snapshot-generator.cc +++ b/src/heap-snapshot-generator.cc @@ -1130,6 +1130,18 @@ void V8HeapExplorer::ExtractJSObjectReferences( SetInternalReference(global_obj, entry, "global_receiver", global_obj->global_receiver(), GlobalObject::kGlobalReceiverOffset); + } else if (obj->IsJSArrayBufferView()) { + JSArrayBufferView* view = JSArrayBufferView::cast(obj); + SetInternalReference(view, entry, "buffer", view->buffer(), + JSArrayBufferView::kBufferOffset); + SetWeakReference(view, entry, 1, view->weak_next(), + JSArrayBufferView::kWeakNextOffset); + } else if (obj->IsJSArrayBuffer()) { + JSArrayBuffer* buffer = JSArrayBuffer::cast(obj); + SetWeakReference(buffer, entry, 1, buffer->weak_next(), + JSArrayBuffer::kWeakNextOffset); + SetWeakReference(buffer, entry, 2, buffer->weak_first_view(), + JSArrayBuffer::kWeakFirstViewOffset); } TagObject(js_obj->properties(), "(object properties)"); SetInternalReference(obj, entry, diff --git a/test/cctest/test-heap-profiler.cc b/test/cctest/test-heap-profiler.cc index 754d9a5..39b12c9 100644 --- a/test/cctest/test-heap-profiler.cc +++ b/test/cctest/test-heap-profiler.cc @@ -2319,3 +2319,24 @@ TEST(TrackBumpPointerAllocations) { heap_profiler->StopTrackingHeapObjects(); } } + + +TEST(ArrayBufferAndArrayBufferView) { + LocalContext env; + v8::HandleScope scope(env->GetIsolate()); + v8::HeapProfiler* heap_profiler = env->GetIsolate()->GetHeapProfiler(); + CompileRun("arr1 = new Uint32Array(100);\n"); + const v8::HeapSnapshot* snapshot = + heap_profiler->TakeHeapSnapshot(v8_str("snapshot")); + CHECK(ValidateSnapshot(snapshot)); + const v8::HeapGraphNode* global = GetGlobalObject(snapshot); + const v8::HeapGraphNode* arr1_obj = + GetProperty(global, v8::HeapGraphEdge::kProperty, "arr1"); + CHECK_NE(NULL, arr1_obj); + const v8::HeapGraphNode* arr1_buffer = + GetProperty(arr1_obj, v8::HeapGraphEdge::kInternal, "buffer"); + CHECK_NE(NULL, arr1_buffer); + const v8::HeapGraphNode* first_view = + GetProperty(arr1_buffer, v8::HeapGraphEdge::kWeak, "2"); + CHECK_NE(NULL, first_view); +} -- 2.7.4