Reviewers: Hannes Payer,

Description:
Register array buffer right after writing it into the object

BUG=chromium:504875
[email protected]
LOG=n

Please review this at https://codereview.chromium.org/1215103003/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+16, -5 lines):
  M src/heap/heap.cc
  M src/runtime/runtime-typedarray.cc


Index: src/heap/heap.cc
diff --git a/src/heap/heap.cc b/src/heap/heap.cc
index 6039bdb4c6ba64d3d47b7bd9f527c1e9e460bae2..7b2fb4748f3e4a741fe0647255c5752ff2876e86 100644
--- a/src/heap/heap.cc
+++ b/src/heap/heap.cc
@@ -1839,6 +1839,7 @@ size_t Heap::FreeDeadArrayBuffersHelper(
   size_t freed_memory = 0;
   for (auto buffer = not_yet_discovered_buffers.begin();
        buffer != not_yet_discovered_buffers.end(); ++buffer) {
+    fprintf(stderr, "free buffer %p\n", buffer->first);
     isolate->array_buffer_allocator()->Free(buffer->first, buffer->second);
     freed_memory += buffer->second;
     live_buffers.erase(buffer->first);
@@ -1863,6 +1864,8 @@ void Heap::TearDownArrayBuffersHelper(
 void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,
                                   size_t length) {
   if (!data) return;
+  fprintf(stderr, "new buffer %p (%s space)\n", data,
+          in_new_space ? "new" : "old");
   RegisterNewArrayBufferHelper(live_array_buffers_, data, length);
   if (in_new_space) {
     RegisterNewArrayBufferHelper(live_array_buffers_for_scavenge_, data,
@@ -1875,6 +1878,8 @@ void Heap::RegisterNewArrayBuffer(bool in_new_space, void* data,

 void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
   if (!data) return;
+  fprintf(stderr, "unreg buffer %p (%s space)\n", data,
+          in_new_space ? "new" : "old");
   UnregisterArrayBufferHelper(live_array_buffers_,
                               not_yet_discovered_array_buffers_, data);
   if (in_new_space) {
@@ -1888,6 +1893,8 @@ void Heap::UnregisterArrayBuffer(bool in_new_space, void* data) {
 void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) {
   // ArrayBuffer might be in the middle of being constructed.
   if (data == undefined_value()) return;
+  fprintf(stderr, "found buffer %p (%s space)\n", data,
+          from_scavenge ? "new" : "old");
   RegisterLiveArrayBufferHelper(
       from_scavenge ? not_yet_discovered_array_buffers_for_scavenge_
                     : not_yet_discovered_array_buffers_,
@@ -1896,6 +1903,8 @@ void Heap::RegisterLiveArrayBuffer(bool from_scavenge, void* data) {


 void Heap::FreeDeadArrayBuffers(bool from_scavenge) {
+  fprintf(stderr, "reaping buffers in %s space:\n",
+          from_scavenge ? "new" : "old");
   if (from_scavenge) {
     for (auto& buffer : not_yet_discovered_array_buffers_for_scavenge_) {
       not_yet_discovered_array_buffers_.erase(buffer.first);
@@ -1930,6 +1939,7 @@ void Heap::TearDownArrayBuffers() {


 void Heap::PrepareArrayBufferDiscoveryInNewSpace() {
+  fprintf(stderr, "prepare scavenge\n");
   not_yet_discovered_array_buffers_for_scavenge_ =
       live_array_buffers_for_scavenge_;
 }
@@ -1942,6 +1952,7 @@ void Heap::PromoteArrayBuffer(Object* obj) {
   if (!data) return;
   // ArrayBuffer might be in the middle of being constructed.
   if (data == undefined_value()) return;
+  fprintf(stderr, "promoting buffer %p\n", data);
   DCHECK(live_array_buffers_for_scavenge_.count(data) > 0);
   DCHECK(live_array_buffers_.count(data) > 0);
   live_array_buffers_for_scavenge_.erase(data);
Index: src/runtime/runtime-typedarray.cc
diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc index ae10eeb6665ed7ea3bed0d5495e31e456fa89f82..4d355247037e57e46c0130b01a39f9b1068b4da0 100644
--- a/src/runtime/runtime-typedarray.cc
+++ b/src/runtime/runtime-typedarray.cc
@@ -28,15 +28,15 @@ void Runtime::SetupArrayBuffer(Isolate* isolate,
   array_buffer->set_is_neuterable(shared == SharedFlag::kNotShared);
   array_buffer->set_is_shared(shared == SharedFlag::kShared);

-  Handle<Object> byte_length =
-      isolate->factory()->NewNumberFromSize(allocated_length);
-  CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber());
-  array_buffer->set_byte_length(*byte_length);
-
   if (data && !is_external) {
     isolate->heap()->RegisterNewArrayBuffer(
isolate->heap()->InNewSpace(*array_buffer), data, allocated_length);
   }
+
+  Handle<Object> byte_length =
+      isolate->factory()->NewNumberFromSize(allocated_length);
+  CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber());
+  array_buffer->set_byte_length(*byte_length);
 }




--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to