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:
parent
bcefef202e
commit
6fdc20ba36
71
xpath.c
71
xpath.c
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user