From 8d805feab16423e0ee51b818eef32c93b924182b Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Wed, 9 May 2018 14:15:11 -0700 Subject: [PATCH] Allow ReusableNode to advance off the end of the tree Co-Authored-By: Rick Winfrey --- src/runtime/reusable_node.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/runtime/reusable_node.h b/src/runtime/reusable_node.h index 803304de..71d56b68 100644 --- a/src/runtime/reusable_node.h +++ b/src/runtime/reusable_node.h @@ -25,11 +25,15 @@ static inline void reusable_node_reset(ReusableNode *self, Tree *tree) { } static inline Tree *reusable_node_tree(ReusableNode *self) { - return array_back(&self->stack)->tree; + return self->stack.size > 0 + ? self->stack.contents[self->stack.size - 1].tree + : NULL; } static inline uint32_t reusable_node_byte_offset(ReusableNode *self) { - return array_back(&self->stack)->byte_offset; + return self->stack.size > 0 + ? self->stack.contents[self->stack.size - 1].byte_offset + : UINT32_MAX; } static inline void reusable_node_delete(ReusableNode *self) { @@ -52,6 +56,7 @@ static inline void reusable_node_advance(ReusableNode *self) { do { StackEntry popped_entry = array_pop(&self->stack); next_index = popped_entry.child_index + 1; + if (self->stack.size == 0) return; tree = array_back(&self->stack)->tree; } while (tree->children.size <= next_index);