Skip to content

Commit f7b703c

Browse files
committed
SortedMap cmp could be None
1 parent 500a468 commit f7b703c

1 file changed

Lines changed: 25 additions & 2 deletions

File tree

src/rbtree.c

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -561,7 +561,19 @@ static void rbtree_delete(CtsRBTree *tree, CtsRBTreeNode *z) {
561561
}
562562

563563
static void RBTree_RemoveNode(CtsRBTree *tree, CtsRBTreeNode *node) {
564-
rbtree_delete(tree, node);
564+
CtsRBTreeNode *root, *sentinel;
565+
566+
root = tree->root;
567+
sentinel = tree->sentinel;
568+
assert(root != sentinel);
569+
assert(node != sentinel);
570+
if (root == node && tree->length == 1) {
571+
Py_INCREF(sentinel);
572+
tree->root = sentinel;
573+
} else {
574+
rbtree_delete(tree, node);
575+
}
576+
565577
Py_DECREF(node->key);
566578
Py_DECREF(node->value);
567579
if (node->left == tree->sentinel) {
@@ -628,22 +640,33 @@ static CtsRBTree *RBTree_New(PyObject *cmp) {
628640

629641
static PyObject *RBTree_tp_new(PyTypeObject *Py_UNUSED(type), PyObject *args,
630642
PyObject *Py_UNUSED(kwds)) {
643+
PyObject *o;
631644
PyObject *cmp = NULL;
632645
if (!PyArg_ParseTuple(args, "|O", &cmp)) {
633646
return NULL;
634647
}
635-
return PyObjectCast(RBTree_New(cmp));
648+
if (cmp == Py_None) {
649+
Py_DECREF(cmp);
650+
cmp = NULL;
651+
}
652+
o = PyObjectCast(RBTree_New(cmp));
653+
if (cmp) {
654+
Py_DECREF(cmp);
655+
}
656+
return o;
636657
}
637658

638659
static int RBTree_tp_traverse(CtsRBTree *self, visitproc visit, void *arg) {
639660
Py_VISIT(self->root);
640661
Py_VISIT(self->sentinel);
662+
Py_VISIT(self->cmpfunc);
641663
return 0;
642664
}
643665

644666
static int RBTree_tp_clear(CtsRBTree *self) {
645667
Py_CLEAR(self->root);
646668
Py_CLEAR(self->sentinel);
669+
Py_CLEAR(self->cmpfunc);
647670
return 0;
648671
}
649672

0 commit comments

Comments
 (0)