mirror of
git://git.sv.gnu.org/emacs.git
synced 2026-01-03 10:31:37 -08:00
Avoid dropping children of found node in non-update case. oops.
Copied from Perforce Change: 184439 ServerID: perforce.ravenbrook.com
This commit is contained in:
parent
f951709e99
commit
2bb859f62b
1 changed files with 33 additions and 18 deletions
|
|
@ -187,30 +187,43 @@ static Tree SplayUpdateRightSpine(SplayTree tree, Tree node, Tree top)
|
|||
*/
|
||||
|
||||
static void SplayAssemble(SplayTree tree, Tree top,
|
||||
Tree leftTop, Tree rightTop)
|
||||
Tree leftTop, Tree leftLast,
|
||||
Tree rightTop, Tree rightFirst)
|
||||
{
|
||||
AVERT(SplayTree, tree);
|
||||
AVERT(Tree, top);
|
||||
AVERT(Tree, leftTop);
|
||||
AVERT(Tree, rightTop);
|
||||
|
||||
if (tree->updateNode != SplayTrivUpdate) {
|
||||
/* Update client property using pointer reversal (Ugh!). */
|
||||
Tree leftLast = TreeReverseRightSpine(leftTop);
|
||||
Tree newLeft = SplayUpdateRightSpine(tree, leftLast, top);
|
||||
AVER(newLeft == (leftTop != TreeEMPTY ? leftTop : TreeLeft(top)));
|
||||
TreeSetLeft(top, newLeft);
|
||||
} else
|
||||
TreeSetLeft(top, leftTop);
|
||||
if (leftTop != TreeEMPTY) {
|
||||
if (tree->updateNode != SplayTrivUpdate) {
|
||||
/* Update client property using pointer reversal (Ugh!). */
|
||||
Tree left, newLeft;
|
||||
left = TreeReverseRightSpine(leftTop);
|
||||
AVER(left == leftLast);
|
||||
newLeft = SplayUpdateRightSpine(tree, left, top);
|
||||
AVER(newLeft == leftTop);
|
||||
TreeSetLeft(top, newLeft);
|
||||
} else {
|
||||
TreeSetRight(leftLast, TreeLeft(top));
|
||||
TreeSetLeft(top, leftTop);
|
||||
}
|
||||
}
|
||||
|
||||
if (tree->updateNode != SplayTrivUpdate) {
|
||||
/* Update client property using pointer reversal (Ugh!). */
|
||||
Tree rightFirst = TreeReverseLeftSpine(rightTop);
|
||||
Tree newRight = SplayUpdateLeftSpine(tree, rightFirst, top);
|
||||
AVER(newRight == (rightTop != TreeEMPTY ? rightTop : TreeRight(top)));
|
||||
TreeSetRight(top, newRight);
|
||||
} else
|
||||
TreeSetRight(top, rightTop);
|
||||
if (rightTop != TreeEMPTY) {
|
||||
if (tree->updateNode != SplayTrivUpdate) {
|
||||
/* Update client property using pointer reversal (Ugh!). */
|
||||
Tree right, newRight;
|
||||
right = TreeReverseLeftSpine(rightTop);
|
||||
AVER(right == rightFirst);
|
||||
newRight = SplayUpdateLeftSpine(tree, rightFirst, top);
|
||||
AVER(newRight == rightTop);
|
||||
TreeSetRight(top, newRight);
|
||||
} else {
|
||||
TreeSetLeft(rightFirst, TreeRight(top));
|
||||
TreeSetRight(top, rightTop);
|
||||
}
|
||||
}
|
||||
|
||||
tree->updateNode(tree, top);
|
||||
}
|
||||
|
|
@ -337,7 +350,9 @@ static Compare SplaySplay(SplayTree tree, TreeKey key, TreeCompare compare)
|
|||
}
|
||||
|
||||
assemble:
|
||||
SplayAssemble(tree, node, TreeRight(&sides), TreeLeft(&sides));
|
||||
SplayAssemble(tree, node,
|
||||
TreeRight(&sides), leftLast,
|
||||
TreeLeft(&sides), rightFirst);
|
||||
|
||||
SplayTreeSetRoot(tree, node);
|
||||
return cmp;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue