* xmlXPathCacheObjectCopy: * @pctxt the XPath context * @val: the original object * * This is the cached version of xmlXPathObjectCopy(). * Acquire a copy of a given object * * Returns a created or reused created object. */
| 1938 | * Returns a created or reused created object. |
| 1939 | */ |
| 1940 | static xmlXPathObjectPtr |
| 1941 | xmlXPathCacheObjectCopy(xmlXPathParserContextPtr pctxt, xmlXPathObjectPtr val) |
| 1942 | { |
| 1943 | xmlXPathObjectPtr ret; |
| 1944 | xmlXPathContextPtr ctxt = pctxt->context; |
| 1945 | |
| 1946 | if (val == NULL) |
| 1947 | return(NULL); |
| 1948 | |
| 1949 | if ((ctxt != NULL) && (ctxt->cache != NULL)) { |
| 1950 | switch (val->type) { |
| 1951 | case XPATH_NODESET: { |
| 1952 | xmlNodeSetPtr set; |
| 1953 | |
| 1954 | set = xmlXPathNodeSetMerge(NULL, val->nodesetval); |
| 1955 | if (set == NULL) { |
| 1956 | xmlXPathPErrMemory(pctxt); |
| 1957 | return(NULL); |
| 1958 | } |
| 1959 | return(xmlXPathCacheWrapNodeSet(pctxt, set)); |
| 1960 | } |
| 1961 | case XPATH_STRING: |
| 1962 | return(xmlXPathCacheNewString(pctxt, val->stringval)); |
| 1963 | case XPATH_BOOLEAN: |
| 1964 | return(xmlXPathCacheNewBoolean(pctxt, val->boolval)); |
| 1965 | case XPATH_NUMBER: |
| 1966 | return(xmlXPathCacheNewFloat(pctxt, val->floatval)); |
| 1967 | default: |
| 1968 | break; |
| 1969 | } |
| 1970 | } |
| 1971 | ret = xmlXPathObjectCopy(val); |
| 1972 | if (ret == NULL) |
| 1973 | xmlXPathPErrMemory(pctxt); |
| 1974 | return(ret); |
| 1975 | } |
| 1976 | |
| 1977 | /************************************************************************ |
| 1978 | * * |
no test coverage detected