diff options
author | Dmitry Stogov <dmitry@zend.com> | 2015-05-05 18:51:08 +0300 |
---|---|---|
committer | Dmitry Stogov <dmitry@zend.com> | 2015-05-05 18:51:08 +0300 |
commit | f6663c72019c4a4e73a2c7073a938829c7b34b09 (patch) | |
tree | 5cbce27f4ecb5353c9c2dc5bf215192e146a4122 /ext/simplexml | |
parent | a8172353baa3fb1ec7bf243e4090989e9d8c982a (diff) | |
download | php-git-f6663c72019c4a4e73a2c7073a938829c7b34b09.tar.gz |
Loop splitting and specialization
Diffstat (limited to 'ext/simplexml')
-rw-r--r-- | ext/simplexml/simplexml.c | 47 |
1 files changed, 35 insertions, 12 deletions
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) { |