diff --git a/lib/binding_web/binding.c b/lib/binding_web/binding.c index 9a4dec0b..1e95bf0a 100644 --- a/lib/binding_web/binding.c +++ b/lib/binding_web/binding.c @@ -32,18 +32,18 @@ static uint32_t byte_to_code_unit(uint32_t byte) { static inline void marshal_node(const void **buffer, TSNode node) { buffer[0] = (const void *)node.id; - buffer[1] = (const void *)node.context[0]; + buffer[1] = (const void *)byte_to_code_unit(node.context[0]); buffer[2] = (const void *)node.context[1]; - buffer[3] = (const void *)node.context[2]; + buffer[3] = (const void *)byte_to_code_unit(node.context[2]); buffer[4] = (const void *)node.context[3]; } static inline TSNode unmarshal_node(const TSTree *tree) { TSNode node; node.id = TRANSFER_BUFFER[0]; - node.context[0] = (uint32_t)TRANSFER_BUFFER[1]; + node.context[0] = code_unit_to_byte((uint32_t)TRANSFER_BUFFER[1]); node.context[1] = (uint32_t)TRANSFER_BUFFER[2]; - node.context[2] = (uint32_t)TRANSFER_BUFFER[3]; + node.context[2] = code_unit_to_byte((uint32_t)TRANSFER_BUFFER[3]); node.context[3] = (uint32_t)TRANSFER_BUFFER[4]; node.tree = tree; return node; diff --git a/lib/binding_web/binding.js b/lib/binding_web/binding.js index 8ed7fca7..e1ac4910 100644 --- a/lib/binding_web/binding.js +++ b/lib/binding_web/binding.js @@ -204,10 +204,6 @@ class Node { this.tree = tree; } - get id() { - return this[0]; - } - get typeId() { marshalNode(this); return C._ts_node_symbol_wasm(this.tree); @@ -217,23 +213,12 @@ class Node { return this.tree.language.types[this.typeId] || 'ERROR'; } - get startPosition() { - marshalNode(this); - C._ts_node_start_point_wasm(this.tree[0]); - return unmarshalPoint(TRANSFER_BUFFER); - } - get endPosition() { marshalNode(this); C._ts_node_end_point_wasm(this.tree[0]); return unmarshalPoint(TRANSFER_BUFFER); } - get startIndex() { - marshalNode(this); - return C._ts_node_start_index_wasm(this.tree[0]); - } - get endIndex() { marshalNode(this); return C._ts_node_end_index_wasm(this.tree[0]); @@ -843,22 +828,36 @@ function isPoint(point) { function marshalNode(node) { let address = TRANSFER_BUFFER; - for (let i = 0; i < 5; i++) { - setValue(address, node[i], 'i32'); - address += SIZE_OF_INT; - } + setValue(address, node.id, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startIndex, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startPosition.row, 'i32'); + address += SIZE_OF_INT; + setValue(address, node.startPosition.column, 'i32'); + address += SIZE_OF_INT; + setValue(address, node[0], 'i32'); } function unmarshalNode(tree, address = TRANSFER_BUFFER) { const id = getValue(address, 'i32'); - if (id === 0) return null; - const result = new Node(INTERNAL, tree); - result[0] = id; address += SIZE_OF_INT; - for (let i = 1; i < 5; i++) { - result[i] = getValue(address, 'i32'); - address += SIZE_OF_INT; - } + if (id === 0) return null; + + const index = getValue(address, 'i32'); + address += SIZE_OF_INT; + const row = getValue(address, 'i32'); + address += SIZE_OF_INT; + const column = getValue(address, 'i32'); + address += SIZE_OF_INT; + const other = getValue(address, 'i32'); + + const result = new Node(INTERNAL, tree); + result.id = id; + result.startIndex = index; + result.startPosition = {row, column}; + result[0] = other; + return result; }