static void JSNode_finalize(JSObjectRef object) { Node* node = JSObjectGetPrivate(object); ASSERT(node); Node_deref(node); }
extern void NodeList_deref(NodeList* nodeList) { if (--nodeList->refCount == 0) { Node_deref(nodeList->parentNode); free(nodeList); } }
void Node_replaceChild(Node* node, Node* newChild, Node* oldChild) { /* Linear search from tail -- good enough for our purposes here */ NodeLink* current; for (current = node->childNodesTail; current; current = current->prev) { if (current->node == oldChild) { Node_deref(current->node); current->node = newChild; } } }
void Node_removeChild(Node* node, Node* child) { /* Linear search from tail -- good enough for our purposes here */ NodeLink* current; NodeLink** currentHandle; for (currentHandle = &node->childNodesTail, current = *currentHandle; current; currentHandle = ¤t->prev, current = *currentHandle) { if (current->node == child) { Node_deref(current->node); *currentHandle = current->prev; free(current); break; } } }