From a52402adc7bbc46d02902936ac715f8acbe95bc4 Mon Sep 17 00:00:00 2001 From: George Petrov Date: Sat, 20 Nov 2021 19:13:45 +0100 Subject: [PATCH 1/3] Use the new ArrayBuffer API for Electron 13 --- src/conversions.cc | 3 ++- src/node.cc | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/conversions.cc b/src/conversions.cc index 92c92c67..7f81930c 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -28,7 +28,8 @@ void InitConversions(Local exports) { end_position_key.Reset(Nan::Persistent(Nan::New("endPosition").ToLocalChecked())); point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); - auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); } diff --git a/src/node.cc b/src/node.cc index 711781e2..8a1e21fc 100644 --- a/src/node.cc +++ b/src/node.cc @@ -29,7 +29,8 @@ static inline void setup_transfer_buffer(uint32_t node_count) { } transfer_buffer_length = new_length; transfer_buffer = static_cast(malloc(transfer_buffer_length * sizeof(uint32_t))); - auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); Nan::Set( Nan::New(module_exports), Nan::New("nodeTransferArray").ToLocalChecked(), From 1bbd4e29a5d3ec0c713531d5cfe4c980cc0cc770 Mon Sep 17 00:00:00 2001 From: George Petrov Date: Sat, 20 Nov 2021 20:36:03 +0100 Subject: [PATCH 2/3] make V8 version dependent --- src/conversions.cc | 6 ++++++ src/node.cc | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/src/conversions.cc b/src/conversions.cc index 7f81930c..5f97d0f7 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -28,8 +28,14 @@ void InitConversions(Local exports) { end_position_key.Reset(Nan::Persistent(Nan::New("endPosition").ToLocalChecked())); point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); + + #if V8_MAJOR_VERSION >= 8 auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #else + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + #endif + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); } diff --git a/src/node.cc b/src/node.cc index 8a1e21fc..322a32f0 100644 --- a/src/node.cc +++ b/src/node.cc @@ -29,8 +29,14 @@ static inline void setup_transfer_buffer(uint32_t node_count) { } transfer_buffer_length = new_length; transfer_buffer = static_cast(malloc(transfer_buffer_length * sizeof(uint32_t))); + + #if V8_MAJOR_VERSION >= 8 auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #else + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + #endif + Nan::Set( Nan::New(module_exports), Nan::New("nodeTransferArray").ToLocalChecked(), From 4cdc66818e119487cd2b0a12a323b9a6b201e0ce Mon Sep 17 00:00:00 2001 From: George Petrov Date: Sat, 20 Nov 2021 21:18:07 +0100 Subject: [PATCH 3/3] added the electron on windows fix --- binding.gyp | 4 ++++ src/conversions.cc | 13 +++++++++---- src/node.cc | 13 +++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/binding.gyp b/binding.gyp index d0e9b81b..8f93e64f 100644 --- a/binding.gyp +++ b/binding.gyp @@ -49,4 +49,8 @@ ] } ], + 'variables': { 'runtime%': 'node' }, + 'conditions': [ + ['runtime=="electron"', { 'defines': ['NODE_RUNTIME_ELECTRON=1'] }], + ] } diff --git a/src/conversions.cc b/src/conversions.cc index 5f97d0f7..fefe01d7 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -29,11 +29,16 @@ void InitConversions(Local exports) { point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); - #if V8_MAJOR_VERSION >= 8 - auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); - auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // this is a terrible thing we have to do because of https://github.com/electron/electron/issues/29893 + v8::Local bufferView; + bufferView = node::Buffer::New(Isolate::GetCurrent(), point_transfer_buffer, 0, 2 * sizeof(uint32_t)).ToLocalChecked(); + auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + #elif V8_MAJOR_VERSION >= 8 + auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); #else - auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); #endif Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); diff --git a/src/node.cc b/src/node.cc index 322a32f0..be9b0468 100644 --- a/src/node.cc +++ b/src/node.cc @@ -30,11 +30,16 @@ static inline void setup_transfer_buffer(uint32_t node_count) { transfer_buffer_length = new_length; transfer_buffer = static_cast(malloc(transfer_buffer_length * sizeof(uint32_t))); - #if V8_MAJOR_VERSION >= 8 - auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); - auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); + #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // this is a terrible thing we have to do because of https://github.com/electron/electron/issues/29893 + v8::Local bufferView; + bufferView = node::Buffer::New(Isolate::GetCurrent(), transfer_buffer, 0, transfer_buffer_length * sizeof(uint32_t)).ToLocalChecked(); + auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + #elif V8_MAJOR_VERSION >= 8 + auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), std::move(backing_store)); #else - auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); #endif Nan::Set(