fix(lib): account for the root node of a tree cursor being an alias

This commit is contained in:
Amaan Qureshi 2024-03-18 07:51:32 -04:00
parent 24a68697ac
commit 09d2b23a64
7 changed files with 16 additions and 8 deletions

View file

@ -53,6 +53,7 @@ static inline void marshal_cursor(const TSTreeCursor *cursor) {
TRANSFER_BUFFER[0] = cursor->id;
TRANSFER_BUFFER[1] = (const void *)cursor->context[0];
TRANSFER_BUFFER[2] = (const void *)cursor->context[1];
TRANSFER_BUFFER[3] = (const void *)cursor->context[2];
}
static inline TSTreeCursor unmarshal_cursor(const void **buffer, const TSTree *tree) {
@ -60,6 +61,7 @@ static inline TSTreeCursor unmarshal_cursor(const void **buffer, const TSTree *t
cursor.id = buffer[0];
cursor.context[0] = (uint32_t)buffer[1];
cursor.context[1] = (uint32_t)buffer[2];
cursor.context[2] = (uint32_t)buffer[3];
cursor.tree = tree;
return cursor;
}
@ -276,7 +278,7 @@ void ts_tree_cursor_reset_wasm(const TSTree *tree) {
void ts_tree_cursor_reset_to_wasm(const TSTree *_dst, const TSTree *_src) {
TSTreeCursor cursor = unmarshal_cursor(TRANSFER_BUFFER, _dst);
TSTreeCursor src = unmarshal_cursor(&TRANSFER_BUFFER[3], _src);
TSTreeCursor src = unmarshal_cursor(&TRANSFER_BUFFER[4], _src);
ts_tree_cursor_reset_to(&cursor, &src);
marshal_cursor(&cursor);
}

View file

@ -6,7 +6,7 @@
const C = Module;
const INTERNAL = {};
const SIZE_OF_INT = 4;
const SIZE_OF_CURSOR = 3 * SIZE_OF_INT;
const SIZE_OF_CURSOR = 4 * SIZE_OF_INT;
const SIZE_OF_NODE = 5 * SIZE_OF_INT;
const SIZE_OF_POINT = 2 * SIZE_OF_INT;
const SIZE_OF_RANGE = 2 * SIZE_OF_INT + 2 * SIZE_OF_POINT;
@ -1493,12 +1493,14 @@ function marshalTreeCursor(cursor, address = TRANSFER_BUFFER) {
setValue(address + 0 * SIZE_OF_INT, cursor[0], 'i32'),
setValue(address + 1 * SIZE_OF_INT, cursor[1], 'i32'),
setValue(address + 2 * SIZE_OF_INT, cursor[2], 'i32');
setValue(address + 3 * SIZE_OF_INT, cursor[3], 'i32');
}
function unmarshalTreeCursor(cursor) {
cursor[0] = getValue(TRANSFER_BUFFER + 0 * SIZE_OF_INT, 'i32'),
cursor[1] = getValue(TRANSFER_BUFFER + 1 * SIZE_OF_INT, 'i32'),
cursor[2] = getValue(TRANSFER_BUFFER + 2 * SIZE_OF_INT, 'i32');
cursor[3] = getValue(TRANSFER_BUFFER + 3 * SIZE_OF_INT, 'i32');
}
function marshalPoint(address, point) {