From 0cf59913ae49d8988687cd6a62548ed80f32ef4a Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Thu, 28 Jan 2016 23:15:22 -0800 Subject: [PATCH] Fix double retain of child trees --- spec/runtime/stack_spec.cc | 3 +++ spec/runtime/tree_spec.cc | 18 +++++++++++++++--- src/runtime/tree.c | 1 - 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/spec/runtime/stack_spec.cc b/spec/runtime/stack_spec.cc index 566f916e..f9694445 100644 --- a/spec/runtime/stack_spec.cc +++ b/spec/runtime/stack_spec.cc @@ -320,7 +320,10 @@ describe("Stack", [&]() { describe("when the first head is only one node deep", [&]() { it("creates a node with one null successor and one non-null successor", [&]() { + ts_tree_retain(trees[2]); + ts_tree_retain(trees[3]); TSTree *parent = ts_tree_make_node(5, 2, tree_array({ trees[2], trees[3] }), metadata); + tree_selection_spy.tree_to_return = parent; tree_selection_spy.call_count = 0; diff --git a/spec/runtime/tree_spec.cc b/spec/runtime/tree_spec.cc index e75d767e..dcec0a0f 100644 --- a/spec/runtime/tree_spec.cc +++ b/spec/runtime/tree_spec.cc @@ -33,6 +33,9 @@ describe("Tree", []() { before_each([&]() { tree1 = ts_tree_make_leaf(cat, {2, 1, 0, 1}, {5, 4, 0, 4}, visible); tree2 = ts_tree_make_leaf(cat, {1, 1, 0, 1}, {3, 3, 0, 3}, visible); + + ts_tree_retain(tree1); + ts_tree_retain(tree2); parent1 = ts_tree_make_node(dog, 2, tree_array({ tree1, tree2, @@ -83,6 +86,9 @@ describe("Tree", []() { before_each([&]() { tree1->fragile_left = true; tree1->extra = true; + + ts_tree_retain(tree1); + ts_tree_retain(tree2); parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, @@ -104,6 +110,9 @@ describe("Tree", []() { before_each([&]() { tree2->fragile_right = true; tree2->extra = true; + + ts_tree_retain(tree1); + ts_tree_retain(tree2); parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, @@ -125,6 +134,9 @@ describe("Tree", []() { before_each([&]() { tree1->fragile_right = true; tree2->fragile_left = true; + + ts_tree_retain(tree1); + ts_tree_retain(tree2); parent = ts_tree_make_node(eel, 2, tree_array({ tree1, tree2, @@ -281,8 +293,6 @@ describe("Tree", []() { AssertThat(ts_tree_eq(parent1, parent2), IsTrue()); - ts_tree_release(tree1_copy); - ts_tree_release(tree2_copy); ts_tree_release(parent2); }); @@ -320,8 +330,10 @@ describe("Tree", []() { tree1->size, visible); + ts_tree_retain(different_tree); + ts_tree_retain(tree2); TSTree *different_parent = ts_tree_make_node(dog, 2, tree_array({ - different_tree, different_tree, + different_tree, tree2, }), visible); AssertThat(ts_tree_eq(different_parent, parent1), IsFalse()); diff --git a/src/runtime/tree.c b/src/runtime/tree.c index 52c022ed..5bcb8127 100644 --- a/src/runtime/tree.c +++ b/src/runtime/tree.c @@ -82,7 +82,6 @@ void ts_tree_set_children(TSTree *self, size_t child_count, TSTree **children) { self->visible_child_count = 0; for (size_t i = 0; i < child_count; i++) { TSTree *child = children[i]; - ts_tree_retain(child); if (i == 0) { self->padding = child->padding;