From 262de4e219501ee987d962757de04683c4cefc8a Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Sat, 22 Feb 2014 09:08:12 +0000 Subject: [PATCH] Fixing splaytreefind on empty tree. oops. Regression test: xc/Debug/fbmtest 215526357 Copied from Perforce Change: 184434 ServerID: perforce.ravenbrook.com --- mps/code/splay.c | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/mps/code/splay.c b/mps/code/splay.c index 02d97405808..42b0ca58e6e 100644 --- a/mps/code/splay.c +++ b/mps/code/splay.c @@ -457,6 +457,9 @@ Bool SplayTreeFind(Tree *nodeReturn, SplayTree tree, TreeKey key) { AVERT(SplayTree, tree); AVER(nodeReturn != NULL); + if (SplayTreeRoot(tree) == TreeEMPTY) + return FALSE; + if (SplaySplay(tree, key, tree->compare) != CompareEQUAL) return FALSE; @@ -593,18 +596,18 @@ Bool SplayTreeNeighbours(Tree *leftReturn, Tree *rightReturn, Tree SplayTreeFirst(SplayTree tree, TreeKey zeroKey) { Tree node; + Compare cmp; AVERT(SplayTree, tree); - if (SplayTreeRoot(tree) == TreeEMPTY) { - node = TreeEMPTY; - } else { - Compare cmp = SplaySplay(tree, zeroKey, tree->compare); - AVER(cmp != CompareEQUAL); - node = SplayTreeRoot(tree); - AVER(node != TreeEMPTY); - AVER(TreeLeft(node) == TreeEMPTY); - } + if (SplayTreeRoot(tree) == TreeEMPTY) + return TreeEMPTY; + + cmp = SplaySplay(tree, zeroKey, tree->compare); + AVER(cmp != CompareEQUAL); + node = SplayTreeRoot(tree); + AVER(node != TreeEMPTY); + AVER(TreeLeft(node) == TreeEMPTY); return node; } @@ -613,6 +616,9 @@ Tree SplayTreeNext(SplayTree tree, Tree oldNode, TreeKey oldKey) { AVERT(SplayTree, tree); AVERT(Tree, oldNode); + if (SplayTreeRoot(tree) == TreeEMPTY) + return TreeEMPTY; + /* Make old node the root. Probably already is. We don't mind if the node has been deleted, or replaced by a node with the same key. */ switch (SplaySplay(tree, oldKey, tree->compare)) {