@@ -561,7 +561,19 @@ static void rbtree_delete(CtsRBTree *tree, CtsRBTreeNode *z) {
561561}
562562
563563static 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
629641static 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
638659static 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
644666static 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