1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-04-01 10:50:08 +03:00

xpath: Don't free nodes of XSLT result value trees

This feature hasn't been required for a long time and libxslt works
around by manually setting 'boolval' to 0.
This commit is contained in:
Nick Wellnhofer 2023-12-20 18:33:29 +01:00
parent bcefef202e
commit 6fdc20ba36

71
xpath.c
View File

@ -885,8 +885,7 @@ struct _xmlXPathCompExpr {
* Forward declarations *
* *
************************************************************************/
static void
xmlXPathFreeValueTree(xmlNodeSetPtr obj);
static void
xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj);
static int
@ -3408,34 +3407,6 @@ xmlXPathNodeSetKeepLast(xmlNodeSetPtr set)
set->nodeNr = 1;
}
/**
* xmlXPathFreeValueTree:
* @obj: the xmlNodeSetPtr to free
*
* Free the NodeSet compound and the actual tree, this is different
* from xmlXPathFreeNodeSet()
*/
static void
xmlXPathFreeValueTree(xmlNodeSetPtr obj) {
int i;
if (obj == NULL) return;
if (obj->nodeTab != NULL) {
for (i = 0;i < obj->nodeNr;i++) {
if (obj->nodeTab[i] != NULL) {
if (obj->nodeTab[i]->type == XML_NAMESPACE_DECL) {
xmlXPathNodeSetFreeNs((xmlNsPtr) obj->nodeTab[i]);
} else {
xmlFreeNodeList(obj->nodeTab[i]);
}
}
}
xmlFree(obj->nodeTab);
}
xmlFree(obj);
}
/**
* xmlXPathNewNodeSet:
* @val: the NodePtr value
@ -3477,18 +3448,11 @@ xmlXPathObjectPtr
xmlXPathNewValueTree(xmlNodePtr val) {
xmlXPathObjectPtr ret;
ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject));
ret = xmlXPathNewNodeSet(val);
if (ret == NULL)
return(NULL);
memset(ret, 0 , sizeof(xmlXPathObject));
ret->type = XPATH_XSLT_TREE;
ret->boolval = 1;
ret->user = (void *) val;
ret->nodesetval = xmlXPathNodeSetCreate(val);
if (ret->nodesetval == NULL) {
xmlFree(ret);
return(NULL);
}
return(ret);
}
@ -4613,20 +4577,8 @@ void
xmlXPathFreeObject(xmlXPathObjectPtr obj) {
if (obj == NULL) return;
if ((obj->type == XPATH_NODESET) || (obj->type == XPATH_XSLT_TREE)) {
if (obj->boolval) {
#if 0
if (obj->user != NULL) {
xmlXPathFreeNodeSet(obj->nodesetval);
xmlFreeNodeList((xmlNodePtr) obj->user);
} else
#endif
obj->type = XPATH_XSLT_TREE; /* TODO: Just for debugging. */
if (obj->nodesetval != NULL)
xmlXPathFreeValueTree(obj->nodesetval);
} else {
if (obj->nodesetval != NULL)
xmlXPathFreeNodeSet(obj->nodesetval);
}
if (obj->nodesetval != NULL)
xmlXPathFreeNodeSet(obj->nodesetval);
#ifdef LIBXML_XPTR_LOCS_ENABLED
} else if (obj->type == XPATH_LOCATIONSET) {
if (obj->user != NULL)
@ -4666,17 +4618,8 @@ xmlXPathReleaseObject(xmlXPathContextPtr ctxt, xmlXPathObjectPtr obj)
case XPATH_NODESET:
case XPATH_XSLT_TREE:
if (obj->nodesetval != NULL) {
if (obj->boolval) {
/*
* It looks like the @boolval is used for
* evaluation if this an XSLT Result Tree Fragment.
* TODO: Check if this assumption is correct.
*/
obj->type = XPATH_XSLT_TREE; /* just for debugging */
xmlXPathFreeValueTree(obj->nodesetval);
obj->nodesetval = NULL;
} else if ((obj->nodesetval->nodeMax <= 40) &&
(cache->numNodeset < cache->maxNodeset)) {
if ((obj->nodesetval->nodeMax <= 40) &&
(cache->numNodeset < cache->maxNodeset)) {
obj->stringval = (void *) cache->nodesetObjs;
cache->nodesetObjs = obj;
cache->numNodeset += 1;