From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Thu, 20 Sep 2018 17:44:26 -0700 Subject: add_realloc.patch Blink overrides ArrayBuffer's allocator with its own one, while Node simply uses malloc and free, so we need to use v8's allocator in Node. As part of the 10.6.0 upgrade, we needed to make SerializerDelegate accept an allocator argument in its constructor, and override ReallocateBufferMemory and FreeBufferMemory to use the allocator. We cannot simply allocate and then memcpy when we override ReallocateBufferMemory, so we therefore need to implement Realloc on the v8 side and correspondingly in gin. diff --git a/gin/array_buffer.cc b/gin/array_buffer.cc index 210760801f1d027196111631d34bab3eb5a10792..cdfdf91841b5f2feb248b0c5890ddcfdb5a8f9ce 100644 --- a/gin/array_buffer.cc +++ b/gin/array_buffer.cc @@ -37,6 +37,10 @@ void* ArrayBufferAllocator::AllocateUninitialized(size_t length) { return malloc(length); } +void* ArrayBufferAllocator::Realloc(void* data, size_t length) { + return realloc(data, length); +} + void ArrayBufferAllocator::Free(void* data, size_t length) { free(data); } diff --git a/gin/array_buffer.h b/gin/array_buffer.h index 086371af29bd8c7520485125deddca411e8b978b..2c6886ddcc47019be4d552d4fddfc1c3d00cbca0 100644 --- a/gin/array_buffer.h +++ b/gin/array_buffer.h @@ -21,6 +21,7 @@ class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { public: void* Allocate(size_t length) override; void* AllocateUninitialized(size_t length) override; + void* Realloc(void* data, size_t length) override; void Free(void* data, size_t length) override; GIN_EXPORT static ArrayBufferAllocator* SharedInstance(); diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc index b7509d4f4a47987ac8f4e2ae3fdcb29d20b3d484..c05209010570867a8c08a60c2b32f853906bd03d 100644 --- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc +++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc @@ -699,6 +699,10 @@ class ArrayBufferAllocator : public v8::ArrayBuffer::Allocator { return result; } + void* Realloc(void* data, size_t size) override { + return ArrayBufferContents::Realloc(data, size); + } + void Free(void* data, size_t size) override { if (max_allocation_ != 0 && data) total_allocation_.fetch_sub(size, std::memory_order_relaxed); diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc index ec217020077613d72eee4b5c408bd5e9eda2ae47..7ab2fa4d00eca9d4896653e29c98654ff75d4306 100644 --- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc +++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.cc @@ -149,6 +149,11 @@ void* ArrayBufferContents::AllocateMemoryOrNull(size_t size, return AllocateMemoryWithFlags(size, policy, base::PartitionAllocReturnNull); } +void* ArrayBufferContents::Realloc(void* data, size_t size) { + return WTF::Partitions::ArrayBufferPartition()->Realloc(data, size, + WTF_HEAP_PROFILER_TYPE_NAME(ArrayBufferContents)); +} + void ArrayBufferContents::FreeMemory(void* data) { InstanceCounters::DecrementCounter( InstanceCounters::kArrayBufferContentsCounter); diff --git a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h index cce802e4fc94c258607bc943d9902e6d18173c44..4f7f4eaf005aac701360e567e6faca7f2e0ff3da 100644 --- a/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h +++ b/third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h @@ -108,6 +108,7 @@ class CORE_EXPORT ArrayBufferContents { void CopyTo(ArrayBufferContents& other); static void* AllocateMemoryOrNull(size_t, InitializationPolicy); + static void* Realloc(void* data, size_t); static void FreeMemory(void*); private: