From 437bb25d920d68103bd759b685d1a9eea87be317 Mon Sep 17 00:00:00 2001 From: Anna Henningsen Date: Mon, 18 Feb 2019 17:30:42 +0100 Subject: [PATCH] src: make IsolateData store ArrayBufferAllocator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This enables us to identify whether we are using an allocator that we know more about than what the generic `ArrayBuffer::Allocator` API provides, in particular whether it is `malloc()`-compatible. PR-URL: https://github.com/nodejs/node/pull/26207 Reviewed-By: James M Snell Reviewed-By: Joyee Cheung Backport-PR-URL: https://github.com/nodejs/node/pull/26302 Reviewed-By: Michaƫl Zasso --- src/api/environment.cc | 6 +----- src/env-inl.h | 12 ++++++++++-- src/env.cc | 13 ++++++++----- src/env.h | 14 ++++++++++---- 4 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/api/environment.cc b/src/api/environment.cc index 91e4495538392f..9c509e174b8177 100644 --- a/src/api/environment.cc +++ b/src/api/environment.cc @@ -115,11 +115,7 @@ IsolateData* CreateIsolateData(Isolate* isolate, uv_loop_t* loop, MultiIsolatePlatform* platform, ArrayBufferAllocator* allocator) { - return new IsolateData( - isolate, - loop, - platform, - allocator != nullptr ? allocator->zero_fill_field() : nullptr); + return new IsolateData(isolate, loop, platform, allocator); } void FreeIsolateData(IsolateData* isolate_data) { diff --git a/src/env-inl.h b/src/env-inl.h index aca817605673fd..51c7e0d7b06561 100644 --- a/src/env-inl.h +++ b/src/env-inl.h @@ -49,8 +49,16 @@ inline uv_loop_t* IsolateData::event_loop() const { return event_loop_; } -inline uint32_t* IsolateData::zero_fill_field() const { - return zero_fill_field_; +inline bool IsolateData::uses_node_allocator() const { + return uses_node_allocator_; +} + +inline v8::ArrayBuffer::Allocator* IsolateData::allocator() const { + return allocator_; +} + +inline ArrayBufferAllocator* IsolateData::node_allocator() const { + return node_allocator_; } inline MultiIsolatePlatform* IsolateData::platform() const { diff --git a/src/env.cc b/src/env.cc index ead11b393a6911..fdf47b964a240c 100644 --- a/src/env.cc +++ b/src/env.cc @@ -74,11 +74,14 @@ void* const Environment::kNodeContextTagPtr = const_cast( IsolateData::IsolateData(Isolate* isolate, uv_loop_t* event_loop, MultiIsolatePlatform* platform, - uint32_t* zero_fill_field) : - isolate_(isolate), - event_loop_(event_loop), - zero_fill_field_(zero_fill_field), - platform_(platform) { + ArrayBufferAllocator* node_allocator) + : isolate_(isolate), + event_loop_(event_loop), + allocator_(isolate->GetArrayBufferAllocator()), + node_allocator_(node_allocator), + uses_node_allocator_(allocator_ == node_allocator_), + platform_(platform) { + CHECK_NOT_NULL(allocator_); if (platform_ != nullptr) platform_->RegisterIsolate(isolate_, event_loop); diff --git a/src/env.h b/src/env.h index 41ec5805e6d574..c94edf34524906 100644 --- a/src/env.h +++ b/src/env.h @@ -392,16 +392,20 @@ class Environment; class IsolateData { public: - IsolateData(v8::Isolate* isolate, uv_loop_t* event_loop, + IsolateData(v8::Isolate* isolate, + uv_loop_t* event_loop, MultiIsolatePlatform* platform = nullptr, - uint32_t* zero_fill_field = nullptr); + ArrayBufferAllocator* node_allocator = nullptr); ~IsolateData(); inline uv_loop_t* event_loop() const; - inline uint32_t* zero_fill_field() const; inline MultiIsolatePlatform* platform() const; inline std::shared_ptr options(); inline void set_options(std::shared_ptr options); + inline bool uses_node_allocator() const; + inline v8::ArrayBuffer::Allocator* allocator() const; + inline ArrayBufferAllocator* node_allocator() const; + #define VP(PropertyName, StringValue) V(v8::Private, PropertyName) #define VY(PropertyName, StringValue) V(v8::Symbol, PropertyName) #define VS(PropertyName, StringValue) V(v8::String, PropertyName) @@ -434,7 +438,9 @@ class IsolateData { v8::Isolate* const isolate_; uv_loop_t* const event_loop_; - uint32_t* const zero_fill_field_; + v8::ArrayBuffer::Allocator* const allocator_; + ArrayBufferAllocator* const node_allocator_; + const bool uses_node_allocator_; MultiIsolatePlatform* platform_; std::shared_ptr options_;