diff --git a/src/runtime/array.h b/src/runtime/array.h index a8899c88..0fa08d5a 100644 --- a/src/runtime/array.h +++ b/src/runtime/array.h @@ -58,9 +58,6 @@ extern "C" { #define array_pop(self) ((self)->contents[--(self)->size]) -#define array_reverse(self) \ - array__reverse((VoidArray *)(self), array__elem_size(self)) - // Private typedef Array(void) VoidArray; @@ -118,18 +115,6 @@ static inline void array__splice(VoidArray *self, size_t element_size, self->size += new_count - old_count; } -static inline void array__reverse(VoidArray *self, size_t element_size) { - char swap[element_size]; - char *contents = (char *)self->contents; - for (uint32_t i = 0, limit = self->size / 2; i < limit; i++) { - size_t offset = i * element_size; - size_t reverse_offset = (self->size - 1 - i) * element_size; - memcpy(&swap, contents + offset, element_size); - memcpy(contents + offset, contents + reverse_offset, element_size); - memcpy(contents + reverse_offset, &swap, element_size); - } -} - #ifdef __cplusplus } #endif diff --git a/src/runtime/stack.c b/src/runtime/stack.c index e353153a..4293292e 100644 --- a/src/runtime/stack.c +++ b/src/runtime/stack.c @@ -259,7 +259,7 @@ inline StackPopResult stack__iter(Stack *self, StackVersion version, TreeArray trees = iterator->trees; if (!should_stop) ts_tree_array_copy(trees, &trees); - array_reverse(&trees); + ts_tree_array_reverse(&trees); ts_stack__add_slice( self, node, diff --git a/src/runtime/tree.c b/src/runtime/tree.c index 5d09a9df..644a5995 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -133,10 +133,19 @@ TreeArray ts_tree_array_remove_trailing_extras(TreeArray *self) { } self->size = i + 1; - array_reverse(&result); + ts_tree_array_reverse(&result); return result; } +void ts_tree_array_reverse(TreeArray *self) { + for (uint32_t i = 0, limit = self->size / 2; i < limit; i++) { + size_t reverse_index = self->size - 1 - i; + Tree *swap = self->contents[i]; + self->contents[i] = self->contents[reverse_index]; + self->contents[reverse_index] = swap; + } +} + Tree *ts_tree_make_error(Length size, Length padding, int32_t lookahead_char, const TSLanguage *language) { Tree *result = ts_tree_make_leaf(ts_builtin_sym_error, padding, size, language); diff --git a/src/runtime/tree.h b/src/runtime/tree.h index d7e9424a..a05edb12 100644 --- a/src/runtime/tree.h +++ b/src/runtime/tree.h @@ -86,6 +86,7 @@ void ts_tree_array_delete(TreeArray *); uint32_t ts_tree_array_essential_count(const TreeArray *); TreeArray ts_tree_array_remove_last_n(TreeArray *, uint32_t); TreeArray ts_tree_array_remove_trailing_extras(TreeArray *); +void ts_tree_array_reverse(TreeArray *); Tree *ts_tree_make_leaf(TSSymbol, Length, Length, const TSLanguage *); Tree *ts_tree_make_node(TSSymbol, uint32_t, Tree **, unsigned, const TSLanguage *);