From c811ecb0346f3b3abb52761dffc9889a171dbbaa Mon Sep 17 00:00:00 2001 From: selfint Date: Fri, 16 Jun 2023 16:15:01 +0300 Subject: [PATCH 1/6] it works --- src/conversions.cc | 24 +++++++++++++----------- src/node.cc | 20 +++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/conversions.cc b/src/conversions.cc index 0c749dd9..890ad274 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -29,19 +29,21 @@ void InitConversions(Local exports) { point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); - #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // #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 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) - 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)); + bufferView = node::Buffer::New(Isolate::GetCurrent(), (char *) point_transfer_buffer, (size_t) (2 * sizeof(uint32_t))).ToLocalChecked(); + // 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 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) + // 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)); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); } void TransferPoint(const TSPoint &point) { diff --git a/src/node.cc b/src/node.cc index f855ec7c..e89d4bbd 100644 --- a/src/node.cc +++ b/src/node.cc @@ -30,22 +30,24 @@ 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 _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + // #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(); + // bufferView = node::Buffer::New(Isolate::GetCurrent(), transfer_buffer, 0, transfer_buffer_length * sizeof(uint32_t)).ToLocalChecked(); + bufferView = node::Buffer::New(Isolate::GetCurrent(), (char *) transfer_buffer, (size_t) (transfer_buffer_length * sizeof(uint32_t))).ToLocalChecked(); auto js_point_transfer_buffer = node::Buffer::Data(bufferView); - #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) - 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 + // #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) + // 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(), - Uint32Array::New(js_transfer_buffer, 0, transfer_buffer_length) + // Uint32Array::New(js_transfer_buffer, 0, transfer_buffer_length) + bufferView ); } } From eeed6c3319594ac16538cc42ba6c71bf699b1974 Mon Sep 17 00:00:00 2001 From: selfint Date: Fri, 16 Jun 2023 16:50:35 +0300 Subject: [PATCH 2/6] preserve old code --- src/conversions.cc | 22 ++++++++++------------ src/node.cc | 25 ++++++++++--------------- 2 files changed, 20 insertions(+), 27 deletions(-) diff --git a/src/conversions.cc b/src/conversions.cc index 890ad274..4373ea26 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -29,21 +29,19 @@ void InitConversions(Local exports) { point_transfer_buffer = static_cast(malloc(2 * sizeof(uint32_t))); - // #if _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + #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(), (char *) point_transfer_buffer, (size_t) (2 * sizeof(uint32_t))).ToLocalChecked(); - // 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 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) - // 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)); - Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); + #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) + 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(), bufferView); + #else + auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); + #endif } void TransferPoint(const TSPoint &point) { diff --git a/src/node.cc b/src/node.cc index e89d4bbd..98480327 100644 --- a/src/node.cc +++ b/src/node.cc @@ -30,25 +30,20 @@ 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 _MSC_VER && NODE_RUNTIME_ELECTRON && NODE_MODULE_VERSION >= 89 + #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(); bufferView = node::Buffer::New(Isolate::GetCurrent(), (char *) transfer_buffer, (size_t) (transfer_buffer_length * sizeof(uint32_t))).ToLocalChecked(); - auto js_point_transfer_buffer = node::Buffer::Data(bufferView); - // #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) - // 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(), bufferView); + #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) + 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(), Uint32Array::New(js_transfer_buffer, 0, transfer_buffer_length)); + #else + auto js_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), transfer_buffer, transfer_buffer_length * sizeof(uint32_t)); + Nan::Set(Nan::New(module_exports), Nan::New("nodeTransferArray").ToLocalChecked(), Uint32Array::New(js_transfer_buffer, 0, transfer_buffer_length)); + #endif - Nan::Set( - Nan::New(module_exports), - Nan::New("nodeTransferArray").ToLocalChecked(), - // Uint32Array::New(js_transfer_buffer, 0, transfer_buffer_length) - bufferView - ); } } From 56042301025659012f61108174dd730b6161971a Mon Sep 17 00:00:00 2001 From: selfint Date: Sun, 18 Jun 2023 18:03:53 +0300 Subject: [PATCH 3/6] fix bad copy paste --- src/conversions.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conversions.cc b/src/conversions.cc index 4373ea26..982b077f 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -37,10 +37,10 @@ void InitConversions(Local exports) { #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) 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(), bufferView); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); #else auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); - Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); #endif } From 52dfdfeb728c72447a694ad0645d64ceb82fb977 Mon Sep 17 00:00:00 2001 From: selfint Date: Sun, 18 Jun 2023 18:04:05 +0300 Subject: [PATCH 4/6] remove unneeded cast --- src/node.cc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/node.cc b/src/node.cc index 98480327..72b71454 100644 --- a/src/node.cc +++ b/src/node.cc @@ -33,7 +33,7 @@ static inline void setup_transfer_buffer(uint32_t node_count) { #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(), (char *) transfer_buffer, (size_t) (transfer_buffer_length * sizeof(uint32_t))).ToLocalChecked(); + bufferView = node::Buffer::New(Isolate::GetCurrent(), (char *) transfer_buffer, transfer_buffer_length * sizeof(uint32_t)).ToLocalChecked(); Nan::Set(Nan::New(module_exports), Nan::New("nodeTransferArray").ToLocalChecked(), bufferView); #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) auto backing_store = ArrayBuffer::NewBackingStore(transfer_buffer, transfer_buffer_length * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr); @@ -91,17 +91,22 @@ Local GetMarshalNodes(const Nan::FunctionCallbackInfo &info, Local GetMarshalNode(const Nan::FunctionCallbackInfo &info, const Tree *tree, TSNode node) { const auto &cache_entry = tree->cached_nodes_.find(node.id); + auto cond = cache_entry == tree->cached_nodes_.end(); + auto end = tree->cached_nodes_.end(); if (cache_entry == tree->cached_nodes_.end()) { setup_transfer_buffer(1); uint32_t *p = transfer_buffer; + auto sizeOfId = sizeof(node.id); MarshalNodeId(node.id, p); p += 2; *(p++) = node.context[0]; *(p++) = node.context[1]; *(p++) = node.context[2]; *(p++) = node.context[3]; + auto cond2 = !!node.id; if (node.id) { - return Nan::New(ts_node_symbol(node)); + auto res = ts_node_symbol(node); + return Nan::New(res); } } else { return Nan::New(cache_entry->second->node); From cf9473e7baa9df1311a824fba327cd1216bb1813 Mon Sep 17 00:00:00 2001 From: selfint Date: Sun, 18 Jun 2023 18:05:53 +0300 Subject: [PATCH 5/6] fix vscode crash when using Buffer instead of ArrayBuffer (in V8), the exported object is of type (in JS) Uint8Array. But the transfer buffers are uint32 arrays, so we need to load them as Uint32Array s manually. --- index.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index cfbb3e7e..1758d248 100644 --- a/index.js +++ b/index.js @@ -611,7 +611,8 @@ function getTextFromTextBuffer ({startPosition, endPosition}) { return this.input.getTextInRange({start: startPosition, end: endPosition}); } -const {pointTransferArray} = binding; +let {pointTransferArray} = binding; +pointTransferArray = new Uint32Array(pointTransferArray.buffer); const NODE_FIELD_COUNT = 6; const ERROR_TYPE_ID = 0xFFFF @@ -635,7 +636,9 @@ function unmarshalNode(value, tree, offset = 0, cache = null) { ? SyntaxNode : tree.language.nodeSubclasses[nodeTypeId]; - const {nodeTransferArray} = binding; + let {nodeTransferArray} = binding; + nodeTransferArray = new Uint32Array(nodeTransferArray.buffer); + const id = getID(nodeTransferArray, offset) if (id === 0n) { return null @@ -676,7 +679,8 @@ function unmarshalNodes(nodes, tree) { } function marshalNode(node) { - const {nodeTransferArray} = binding; + let {nodeTransferArray} = binding; + nodeTransferArray = new Uint32Array(nodeTransferArray.buffer); for (let i = 0; i < NODE_FIELD_COUNT; i++) { nodeTransferArray[i] = node[i]; } From a208ee38038ee4aa1555c0c8c310a89a53a29e0b Mon Sep 17 00:00:00 2001 From: selfint Date: Sun, 18 Jun 2023 18:18:44 +0300 Subject: [PATCH 6/6] remove unneeded cast --- src/conversions.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conversions.cc b/src/conversions.cc index 982b077f..c9751b93 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -32,7 +32,7 @@ void InitConversions(Local exports) { #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(), (char *) point_transfer_buffer, (size_t) (2 * sizeof(uint32_t))).ToLocalChecked(); + bufferView = node::Buffer::New(Isolate::GetCurrent(), (char *) point_transfer_buffer, (2 * sizeof(uint32_t))).ToLocalChecked(); Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), bufferView); #elif (V8_MAJOR_VERSION > 8 || (V8_MAJOR_VERSION == 8 && V8_MINOR_VERION > 3)) auto backing_store = ArrayBuffer::NewBackingStore(point_transfer_buffer, 2 * sizeof(uint32_t), BackingStore::EmptyDeleter, nullptr);