applied an old patch from Lukas Schroeder to track node creation and
* global.data globals.c tree.c include/libxml/globals.h: applied
an old patch from Lukas Schroeder to track node creation and
destruction. Probably missing a lot of references at the moment
and not usable reliably.
Daniel
diff --git a/tree.c b/tree.c
index 67b7d16..7df24d5 100644
--- a/tree.c
+++ b/tree.c
@@ -338,6 +338,8 @@
doc->extSubset = cur;
cur->doc = doc;
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -463,6 +465,10 @@
#endif
return;
}
+
+ if (xmlDeregisterNodeDefaultValue)
+ xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
if (cur->children != NULL) {
xmlNodePtr next, c = cur->children;
@@ -530,6 +536,9 @@
cur->compression = -1; /* not initialized */
cur->doc = cur;
cur->charset = XML_CHAR_ENCODING_UTF8;
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -550,6 +559,10 @@
#endif
return;
}
+
+ if (xmlDeregisterNodeDefaultValue)
+ xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
/*
* Do this before freeing the children list to avoid ID lookups
*/
@@ -1127,6 +1140,9 @@
cur->prev = prev;
}
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -1204,6 +1220,9 @@
cur->prev = prev;
}
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -1333,6 +1352,9 @@
tmp = tmp->next;
}
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -1374,6 +1396,10 @@
#endif
return;
}
+
+ if (xmlDeregisterNodeDefaultValue)
+ xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
+
/* Check for ID removal -> leading to invalid references ! */
if ((cur->parent != NULL) && (cur->parent->doc != NULL) &&
((cur->parent->doc->intSubset != NULL) ||
@@ -1471,6 +1497,9 @@
if (content != NULL) {
cur->content = xmlStrdup(content);
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
@@ -1509,6 +1538,9 @@
cur->name = xmlStrdup(name);
cur->ns = ns;
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1579,6 +1611,7 @@
UPDATE_LAST_CHILD_AND_PARENT(cur)
}
}
+
return(cur);
}
@@ -1667,6 +1700,9 @@
cur->type = XML_DOCUMENT_FRAG_NODE;
cur->doc = doc;
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1697,6 +1733,9 @@
if (content != NULL) {
cur->content = xmlStrdup(content);
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1797,6 +1836,9 @@
cur->name = xmlStrndup(name, len);
} else
cur->name = xmlStrdup(name);
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1848,6 +1890,9 @@
cur->children = (xmlNodePtr) ent;
cur->last = (xmlNodePtr) ent;
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1896,6 +1941,9 @@
if (content != NULL) {
cur->content = xmlStrndup(content, len);
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1945,6 +1993,9 @@
if (content != NULL) {
cur->content = xmlStrdup(content);
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -1977,6 +2028,9 @@
if (content != NULL) {
cur->content = xmlStrndup(content, len);
}
+
+ if (xmlRegisterNodeDefaultValue)
+ xmlRegisterNodeDefaultValue(cur);
return(cur);
}
@@ -2398,6 +2452,9 @@
/*
* add the first element at the end of the children list.
*/
+ if (cur->parent == parent)
+ return(cur);
+
if (parent->children == NULL) {
parent->children = cur;
} else {
@@ -2407,7 +2464,7 @@
if ((cur->type == XML_TEXT_NODE) &&
(parent->last->type == XML_TEXT_NODE) &&
(cur->name == parent->last->name)) {
- xmlNodeAddContent(parent->last, cur->content);
+ xmlNodeAddContent(parent->last, cur->content);
/*
* if it's the only child, nothing more to be done.
*/
@@ -2477,13 +2534,15 @@
*/
if (cur->type == XML_TEXT_NODE) {
if ((parent->type == XML_TEXT_NODE) &&
- (parent->content != NULL)) {
+ (parent->content != NULL) &&
+ (parent != cur)) {
xmlNodeAddContent(parent, cur->content);
xmlFreeNode(cur);
return(parent);
}
if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) &&
- (parent->last->name == cur->name)) {
+ (parent->last->name == cur->name) &&
+ (parent->last != cur)) {
xmlNodeAddContent(parent->last, cur->content);
xmlFreeNode(cur);
return(parent->last);
@@ -2493,16 +2552,23 @@
/*
* add the new element at the end of the children list.
*/
+ prev = cur->parent;
cur->parent = parent;
if (cur->doc != parent->doc) {
xmlSetTreeDoc(cur, parent->doc);
}
+ /* this check prevents a loop on tree-traversions if a developer
+ * tries to add a node to its parent multiple times
+ */
+ if (prev == parent)
+ return(cur);
/*
* Coalescing
*/
if ((parent->type == XML_TEXT_NODE) &&
- (parent->content != NULL)) {
+ (parent->content != NULL) &&
+ (parent != cur)) {
xmlNodeAddContent(parent, cur->content);
xmlFreeNode(cur);
return(parent);
@@ -2588,6 +2654,10 @@
next = cur->next;
/* unroll to speed up freeing the document */
if (cur->type != XML_DTD_NODE) {
+
+ if (xmlDeregisterNodeDefaultValue)
+ xmlDeregisterNodeDefaultValue(cur);
+
if ((cur->children != NULL) &&
(cur->type != XML_ENTITY_REF_NODE))
xmlFreeNodeList(cur->children);
@@ -2655,6 +2725,7 @@
#endif
return;
}
+
/* use xmlFreeDtd for DTD nodes */
if (cur->type == XML_DTD_NODE) {
xmlFreeDtd((xmlDtdPtr) cur);
@@ -2668,6 +2739,10 @@
xmlFreeProp((xmlAttrPtr) cur);
return;
}
+
+ if (xmlDeregisterNodeDefaultValue)
+ xmlDeregisterNodeDefaultValue(cur);
+
if ((cur->children != NULL) &&
(cur->type != XML_ENTITY_REF_NODE))
xmlFreeNodeList(cur->children);