Destroy a node and decref all Python objects */
| 119 | |
| 120 | /* Destroy a node and decref all Python objects */ |
| 121 | void node_destroy(BPlusNode *node) { |
| 122 | if (!node) return; |
| 123 | |
| 124 | /* Decref all keys */ |
| 125 | for (int i = 0; i < node->num_keys; i++) { |
| 126 | Py_XDECREF(node_get_key(node, i)); |
| 127 | } |
| 128 | |
| 129 | if (node->type == NODE_LEAF) { |
| 130 | /* Decref all values */ |
| 131 | for (int i = 0; i < node->num_keys; i++) { |
| 132 | Py_XDECREF(node_get_value(node, i)); |
| 133 | } |
| 134 | } else { |
| 135 | /* Recursively destroy children */ |
| 136 | for (int i = 0; i <= node->num_keys; i++) { |
| 137 | BPlusNode *child = node_get_child(node, i); |
| 138 | if (child) { |
| 139 | node_destroy(child); |
| 140 | } |
| 141 | } |
| 142 | } |
| 143 | |
| 144 | cache_aligned_free(node); |
| 145 | } |
| 146 | |
| 147 | /* Clear a single slot: decref or destroy payload and null out key/value or child pointer */ |
| 148 | static void node_clear_slot(BPlusNode *node, int i) { |
no test coverage detected