From: Rob Richards Date: Tue, 1 Nov 2005 23:21:29 +0000 (+0000) Subject: optimize sxe_add_registered_namespaces X-Git-Tag: RELEASE_2_0_1~72 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8de7ff8c9197e8f6723e4af346a6ee875b0c7ac0;p=php optimize sxe_add_registered_namespaces add only first encountered prefixes to namespace arrays update test --- diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index f9bc29d5dd..67204e2fd1 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -1106,7 +1106,10 @@ SXE_METHOD(asXML) static inline void sxe_add_namespace_name(zval *return_value, xmlNsPtr ns) { - add_assoc_string(return_value, SXE_NS_PREFIX(ns), (char*)ns->href, 1); + char *prefix = SXE_NS_PREFIX(ns); + if (zend_hash_exists(Z_ARRVAL_P(return_value), prefix, strlen(prefix) + 1) == 0) { + add_assoc_string(return_value, prefix, (char*)ns->href, 1); + } } static void sxe_add_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool recursive, zval *return_value TSRMLS_DC) /* {{{ */ @@ -1167,25 +1170,27 @@ next_iter: } /* }}} */ -static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlDocPtr doc, xmlNodePtr node, zend_bool recursive, zval *return_value TSRMLS_DC) /* {{{ */ +static void sxe_add_registered_namespaces(php_sxe_object *sxe, xmlNodePtr node, zend_bool recursive, zval *return_value TSRMLS_DC) /* {{{ */ { - xmlNsPtr *ns = xmlGetNsList(doc, node); - - while (ns && ns[0]) { - sxe_add_namespace_name(return_value, ns[0]); - ns++; - } + xmlNsPtr ns; - if (recursive) { - node = node->children; - while (node) { - sxe_add_registered_namespaces(sxe, doc, node, recursive, return_value TSRMLS_CC); - node = node->next; + if (node->type == XML_ELEMENT_NODE) { + ns = node->nsDef; + while (ns != NULL) { + sxe_add_namespace_name(return_value, ns); + ns = ns->next; + } + if (recursive) { + node = node->children; + while (node) { + sxe_add_registered_namespaces(sxe, node, recursive, return_value TSRMLS_CC); + node = node->next; + } } } } -/* {{{ proto string SimpleXMLElement::getDocNamespaces([bool recursve]) +/* {{{ proto string SimpleXMLElement::getDocNamespaces([bool recursive]) Return all namespaces registered with document */ SXE_METHOD(getDocNamespaces) { @@ -1200,7 +1205,7 @@ SXE_METHOD(getDocNamespaces) sxe = php_sxe_fetch_object(getThis() TSRMLS_CC); - sxe_add_registered_namespaces(sxe, (xmlDocPtr)sxe->document->ptr, xmlDocGetRootElement((xmlDocPtr)sxe->document->ptr), recursive, return_value TSRMLS_CC); + sxe_add_registered_namespaces(sxe, xmlDocGetRootElement((xmlDocPtr)sxe->document->ptr), recursive, return_value TSRMLS_CC); } /* }}} */ diff --git a/ext/simplexml/tests/025.phpt b/ext/simplexml/tests/025.phpt index 5eb873a1fa..8579a1e09f 100755 --- a/ext/simplexml/tests/025.phpt +++ b/ext/simplexml/tests/025.phpt @@ -8,7 +8,7 @@ SimpleXML: getting namespaces $xml =<< -bla +bla bla @@ -25,7 +25,9 @@ var_dump($sxe->getDocNamespaces(true)); $xml =<< - + +bla + EOF; $sxe = simplexml_load_string($xml);