* xmlXPathCacheNewNodeSet: * @ctxt: the XPath context * @val: the NodePtr value * * This is the cached version of xmlXPathNewNodeSet(). * Acquire an xmlXPathObjectPtr of type NodeSet and initialize * it with the single Node @val * * Returns the created or reused object. */
| 2007 | * Returns the created or reused object. |
| 2008 | */ |
| 2009 | static xmlXPathObjectPtr |
| 2010 | xmlXPathCacheNewNodeSet(xmlXPathContextPtr ctxt, xmlNodePtr val) |
| 2011 | { |
| 2012 | if ((ctxt != NULL) && (ctxt->cache)) { |
| 2013 | xmlXPathContextCachePtr cache = (xmlXPathContextCachePtr) ctxt->cache; |
| 2014 | |
| 2015 | if ((cache->nodesetObjs != NULL) && |
| 2016 | (cache->nodesetObjs->number != 0)) |
| 2017 | { |
| 2018 | xmlXPathObjectPtr ret; |
| 2019 | /* |
| 2020 | * Use the nodset-cache. |
| 2021 | */ |
| 2022 | ret = (xmlXPathObjectPtr) |
| 2023 | cache->nodesetObjs->items[--cache->nodesetObjs->number]; |
| 2024 | ret->type = XPATH_NODESET; |
| 2025 | ret->boolval = 0; |
| 2026 | if (val) { |
| 2027 | if ((ret->nodesetval->nodeMax == 0) || |
| 2028 | (val->type == XML_NAMESPACE_DECL)) |
| 2029 | { |
| 2030 | xmlXPathNodeSetAddUnique(ret->nodesetval, val); |
| 2031 | } else { |
| 2032 | ret->nodesetval->nodeTab[0] = val; |
| 2033 | ret->nodesetval->nodeNr = 1; |
| 2034 | } |
| 2035 | } |
| 2036 | #ifdef XP_DEBUG_OBJ_USAGE |
| 2037 | xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); |
| 2038 | #endif |
| 2039 | return(ret); |
| 2040 | } else if ((cache->miscObjs != NULL) && |
| 2041 | (cache->miscObjs->number != 0)) |
| 2042 | { |
| 2043 | xmlXPathObjectPtr ret; |
| 2044 | /* |
| 2045 | * Fallback to misc-cache. |
| 2046 | */ |
| 2047 | |
| 2048 | ret = (xmlXPathObjectPtr) |
| 2049 | cache->miscObjs->items[--cache->miscObjs->number]; |
| 2050 | |
| 2051 | ret->type = XPATH_NODESET; |
| 2052 | ret->boolval = 0; |
| 2053 | ret->nodesetval = xmlXPathNodeSetCreate(val); |
| 2054 | #ifdef XP_DEBUG_OBJ_USAGE |
| 2055 | xmlXPathDebugObjUsageRequested(ctxt, XPATH_NODESET); |
| 2056 | #endif |
| 2057 | return(ret); |
| 2058 | } |
| 2059 | } |
| 2060 | return(xmlXPathNewNodeSet(val)); |
| 2061 | } |
| 2062 | |
| 2063 | /** |
| 2064 | * xmlXPathCacheNewCString: |
no test coverage detected