]> granicus.if.org Git - php/commitdiff
Loop splitting and specialization
authorDmitry Stogov <dmitry@zend.com>
Tue, 5 May 2015 15:51:08 +0000 (18:51 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 5 May 2015 15:51:08 +0000 (18:51 +0300)
ext/simplexml/simplexml.c

index 6909b7745318c9c9491d405ad02370ca50e845e4..c360662858f4c2d7aed9c35a279231d882dbb22c 100644 (file)
@@ -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) {