@@ -46,47 +46,35 @@ static dom_named_item dom_html_collection_named_item(zend_string *key, zend_obje
4646
4747 /* 2. Return the first element in the collection for which at least one of the following is true: */
4848 xmlNodePtr basep = dom_object_get_node (objmap -> baseobj );
49- if (basep != NULL ) {
50- zend_long cur = 0 ;
51- zend_long next = cur ; /* not +1, otherwise we skip the first candidate */
52- xmlNodePtr candidate = basep -> children ;
53- bool iterate_tag_name = objmap -> handler == & php_dom_obj_map_by_tag_name ;
54- while (candidate != NULL ) {
55- if (iterate_tag_name ) {
56- candidate = dom_get_elements_by_tag_name_ns_raw (basep , candidate , objmap -> ns , objmap -> local , objmap -> local_lower , & cur , next );
57- if (candidate == NULL ) {
58- break ;
59- }
60- next = cur + 1 ;
61- } else {
62- if (candidate -> type != XML_ELEMENT_NODE ) {
63- candidate = candidate -> next ;
64- continue ;
65- }
49+ if (basep != NULL && basep -> children != NULL ) {
50+ php_dom_obj_map_collection_iter iter = {0 };
51+ iter .candidate = basep -> children ;
52+ iter .basep = basep ;
53+
54+ while (true) {
55+ objmap -> handler -> collection_named_item_iter (objmap , & iter );
56+ if (iter .candidate == NULL ) {
57+ break ;
6658 }
6759
68- ZEND_ASSERT (candidate -> type == XML_ELEMENT_NODE );
60+ ZEND_ASSERT (iter . candidate -> type == XML_ELEMENT_NODE );
6961
7062 xmlAttrPtr attr ;
7163
7264 /* it has an ID which is key; */
73- if ((attr = xmlHasNsProp (candidate , BAD_CAST "id" , NULL )) != NULL && dom_compare_value (attr , BAD_CAST ZSTR_VAL (key ))) {
65+ if ((attr = xmlHasNsProp (iter . candidate , BAD_CAST "id" , NULL )) != NULL && dom_compare_value (attr , BAD_CAST ZSTR_VAL (key ))) {
7466 ret .context_intern = objmap -> baseobj ;
75- ret .node = candidate ;
67+ ret .node = iter . candidate ;
7668 return ret ;
7769 }
7870 /* it is in the HTML namespace and has a name attribute whose value is key; */
79- else if (php_dom_ns_is_fast (candidate , php_dom_ns_is_html_magic_token )) {
80- if ((attr = xmlHasNsProp (candidate , BAD_CAST "name" , NULL )) != NULL && dom_compare_value (attr , BAD_CAST ZSTR_VAL (key ))) {
71+ else if (php_dom_ns_is_fast (iter . candidate , php_dom_ns_is_html_magic_token )) {
72+ if ((attr = xmlHasNsProp (iter . candidate , BAD_CAST "name" , NULL )) != NULL && dom_compare_value (attr , BAD_CAST ZSTR_VAL (key ))) {
8173 ret .context_intern = objmap -> baseobj ;
82- ret .node = candidate ;
74+ ret .node = iter . candidate ;
8375 return ret ;
8476 }
8577 }
86-
87- if (!iterate_tag_name ) {
88- candidate = candidate -> next ;
89- }
9078 }
9179 }
9280
0 commit comments