From: Dmitry Stogov Date: Tue, 5 May 2015 15:51:08 +0000 (+0300) Subject: Loop splitting and specialization X-Git-Tag: PRE_PHP7_NSAPI_REMOVAL~93^2~6 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f6663c72019c4a4e73a2c7073a938829c7b34b09;p=php Loop splitting and specialization --- diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 6909b77453..c360662858 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -2319,22 +2319,45 @@ static xmlNodePtr php_sxe_iterator_fetch(php_sxe_object *sxe, xmlNodePtr node, i { xmlChar *prefix = sxe->iter.nsprefix; int isprefix = sxe->iter.isprefix; - int test_elem = sxe->iter.type == SXE_ITER_ELEMENT && sxe->iter.name; - int test_attr = sxe->iter.type == SXE_ITER_ATTRLIST && sxe->iter.name; - while (node) { - SKIP_TEXT(node); - if (sxe->iter.type != SXE_ITER_ATTRLIST && node->type == XML_ELEMENT_NODE) { - if ((!test_elem || !xmlStrcmp(node->name, sxe->iter.name)) && match_ns(sxe, node, prefix, isprefix)) { - break; + if (sxe->iter.type == SXE_ITER_ATTRLIST) { + if (sxe->iter.name) { + while (node) { + if (node->type == XML_ATTRIBUTE_NODE) { + if (!xmlStrcmp(node->name, sxe->iter.name) && match_ns(sxe, node, prefix, isprefix)) { + break; + } + } + node = node->next; } - } else if (node->type == XML_ATTRIBUTE_NODE) { - if ((!test_attr || !xmlStrcmp(node->name, sxe->iter.name)) && match_ns(sxe, node, prefix, isprefix)) { - break; + } else { + while (node) { + if (node->type == XML_ATTRIBUTE_NODE) { + if (match_ns(sxe, node, prefix, isprefix)) { + break; + } + } + node = node->next; } } -next_iter: - node = node->next; + } else if (sxe->iter.type == SXE_ITER_ELEMENT && sxe->iter.name) { + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (!xmlStrcmp(node->name, sxe->iter.name) && match_ns(sxe, node, prefix, isprefix)) { + break; + } + } + node = node->next; + } + } else { + while (node) { + if (node->type == XML_ELEMENT_NODE) { + if (match_ns(sxe, node, prefix, isprefix)) { + break; + } + } + node = node->next; + } } if (node && use_data) {