| Index: src/runtime/runtime-typedarray.cc
|
| diff --git a/src/runtime/runtime-typedarray.cc b/src/runtime/runtime-typedarray.cc
|
| index b95d20f1ddb7113af4d724a59b6aa9515aff7304..036ee41413d096a4382709ebb1349974e4b33a63 100644
|
| --- a/src/runtime/runtime-typedarray.cc
|
| +++ b/src/runtime/runtime-typedarray.cc
|
| @@ -11,6 +11,22 @@
|
|
|
| namespace v8 {
|
| namespace internal {
|
| +
|
| +void Runtime::FreeArrayBuffer(Isolate* isolate,
|
| + JSArrayBuffer* phantom_array_buffer) {
|
| + if (phantom_array_buffer->is_external()) return;
|
| +
|
| + size_t allocated_length =
|
| + NumberToSize(isolate, phantom_array_buffer->byte_length());
|
| +
|
| + reinterpret_cast<v8::Isolate*>(isolate)
|
| + ->AdjustAmountOfExternalAllocatedMemory(
|
| + -static_cast<int64_t>(allocated_length));
|
| + CHECK(isolate->array_buffer_allocator() != NULL);
|
| + isolate->array_buffer_allocator()->Free(phantom_array_buffer->backing_store(),
|
| + allocated_length);
|
| +}
|
| +
|
|
|
| void Runtime::SetupArrayBuffer(Isolate* isolate,
|
| Handle<JSArrayBuffer> array_buffer,
|
| @@ -31,8 +47,17 @@
|
| CHECK(byte_length->IsSmi() || byte_length->IsHeapNumber());
|
| array_buffer->set_byte_length(*byte_length);
|
|
|
| - if (data && !is_external) {
|
| - isolate->heap()->RegisterNewArrayBuffer(data, allocated_length);
|
| + if (isolate->heap()->InNewSpace(*array_buffer) ||
|
| + isolate->heap()->array_buffers_list()->IsUndefined()) {
|
| + array_buffer->set_weak_next(isolate->heap()->array_buffers_list());
|
| + isolate->heap()->set_array_buffers_list(*array_buffer);
|
| + if (isolate->heap()->last_array_buffer_in_list()->IsUndefined()) {
|
| + isolate->heap()->set_last_array_buffer_in_list(*array_buffer);
|
| + }
|
| + } else {
|
| + JSArrayBuffer::cast(isolate->heap()->last_array_buffer_in_list())
|
| + ->set_weak_next(*array_buffer);
|
| + isolate->heap()->set_last_array_buffer_in_list(*array_buffer);
|
| }
|
| }
|
|
|
| @@ -58,6 +83,10 @@
|
| }
|
|
|
| SetupArrayBuffer(isolate, array_buffer, false, data, allocated_length);
|
| +
|
| + reinterpret_cast<v8::Isolate*>(isolate)
|
| + ->AdjustAmountOfExternalAllocatedMemory(allocated_length);
|
| +
|
| return true;
|
| }
|
|
|
| @@ -144,7 +173,6 @@
|
| size_t byte_length = NumberToSize(isolate, array_buffer->byte_length());
|
| array_buffer->set_is_external(true);
|
| Runtime::NeuterArrayBuffer(array_buffer);
|
| - isolate->heap()->UnregisterArrayBuffer(backing_store);
|
| isolate->array_buffer_allocator()->Free(backing_store, byte_length);
|
| return isolate->heap()->undefined_value();
|
| }
|
|
|