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]; } diff --git a/src/conversions.cc b/src/conversions.cc index 0c749dd9..c9751b93 100644 --- a/src/conversions.cc +++ b/src/conversions.cc @@ -29,19 +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(), point_transfer_buffer, 0, 2 * sizeof(uint32_t)).ToLocalChecked(); - auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + 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); 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)); #else auto js_point_transfer_buffer = ArrayBuffer::New(Isolate::GetCurrent(), point_transfer_buffer, 2 * sizeof(uint32_t)); + Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); #endif - - Nan::Set(exports, Nan::New("pointTransferArray").ToLocalChecked(), Uint32Array::New(js_point_transfer_buffer, 0, 2)); } void TransferPoint(const TSPoint &point) { diff --git a/src/node.cc b/src/node.cc index f855ec7c..72b71454 100644 --- a/src/node.cc +++ b/src/node.cc @@ -30,23 +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(); - auto js_point_transfer_buffer = node::Buffer::Data(bufferView); + 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); 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) - ); } } @@ -94,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);