From f6663c72019c4a4e73a2c7073a938829c7b34b09 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 5 May 2015 18:51:08 +0300 Subject: Loop splitting and specialization --- ext/simplexml/simplexml.c | 47 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 12 deletions(-) (limited to 'ext/simplexml/simplexml.c') 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) { -- cgit v1.2.1