diff --git a/ChangeLog b/ChangeLog index 54f27f5a..76205c32 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Mon Jan 22 11:43:21 CET 2001 Daniel Veillard + + * xpath.c: when copying a XSLT tree object teh tree need to be copied + too, and deallocation need to occur the same way. + Mon Jan 22 10:35:40 CET 2001 Daniel Veillard * xpathInternals.h xpath.[ch] debugXML.c: added the XPATH_XSLT_TREE diff --git a/xpath.c b/xpath.c index a35683a0..409c12d6 100644 --- a/xpath.c +++ b/xpath.c @@ -726,6 +726,34 @@ xmlXPathFreeNodeSet(xmlNodeSetPtr obj) { xmlFree(obj); } +/** + * xmlXPathFreeValueTree: + * @obj: the xmlNodeSetPtr to free + * + * Free the NodeSet compound and the actual tree, this is different + * from xmlXPathFreeNodeSet() + */ +void +xmlXPathFreeValueTree(xmlNodeSetPtr obj) { + int i; + + if (obj == NULL) return; + for (i = 0;i < obj->nodeNr;i++) + if (obj->nodeTab[i] != NULL) + xmlFreeNode(obj->nodeTab[i]); + + if (obj->nodeTab != NULL) { +#ifdef DEBUG + memset(obj->nodeTab, 0xB , (size_t) sizeof(xmlNodePtr) * obj->nodeMax); +#endif + xmlFree(obj->nodeTab); + } +#ifdef DEBUG + memset(obj, 0xB , (size_t) sizeof(xmlNodeSet)); +#endif + xmlFree(obj); +} + #if defined(DEBUG) || defined(DEBUG_STEP) /** * xmlGenericErrorContextNodeSet: @@ -1332,6 +1360,13 @@ xmlXPathObjectCopy(xmlXPathObjectPtr val) { case XPATH_STRING: ret->stringval = xmlStrdup(val->stringval); case XPATH_XSLT_TREE: + if ((val->nodesetval != NULL) && + (val->nodesetval->nodeTab != NULL)) + ret->nodesetval = xmlXPathNodeSetCreate( + xmlCopyNode(val->nodesetval->nodeTab[0], 1)); + else + ret->nodesetval = xmlXPathNodeSetCreate(NULL); + break; case XPATH_NODESET: ret->nodesetval = xmlXPathNodeSetMerge(NULL, val->nodesetval); break; @@ -1375,7 +1410,7 @@ xmlXPathFreeObject(xmlXPathObjectPtr obj) { xmlFree(obj->stringval); } else if (obj->type == XPATH_XSLT_TREE) { if (obj->nodesetval != NULL) - xmlXPathFreeNodeSet(obj->nodesetval); + xmlXPathFreeValueTree(obj->nodesetval); } #ifdef DEBUG