@@ -49,6 +49,13 @@ static void itemHashScanner (void *payload, void *data, xmlChar *name)
4949}
5050/* }}} */
5151
52+ static dom_nnodemap_object * php_dom_iterator_get_nnmap (const php_dom_iterator * iterator )
53+ {
54+ const zval * object = & iterator -> intern .data ;
55+ dom_object * nnmap = Z_DOMOBJ_P (object );
56+ return nnmap -> ptr ;
57+ }
58+
5259xmlNodePtr create_notation (const xmlChar * name , const xmlChar * ExternalID , const xmlChar * SystemID ) /* {{{ */
5360{
5461 xmlEntityPtr ret = xmlMalloc (sizeof (xmlEntity ));
@@ -120,18 +127,22 @@ zval *php_dom_iterator_current_data(zend_object_iterator *iter) /* {{{ */
120127static void php_dom_iterator_current_key (zend_object_iterator * iter , zval * key ) /* {{{ */
121128{
122129 php_dom_iterator * iterator = (php_dom_iterator * )iter ;
123- zval * object = & iterator -> intern .data ;
124- zend_class_entry * ce = Z_OBJCE_P (object );
130+ dom_nnodemap_object * objmap = php_dom_iterator_get_nnmap (iterator );
125131
126- /* Nodelists have the index as a key while named node maps have the name as a key. */
127- if (instanceof_function (ce , dom_nodelist_class_entry ) || instanceof_function (ce , dom_modern_nodelist_class_entry )) {
132+ /* Only dtd named node maps, i.e. the ones based on a libxml hash table or attribute collections,
133+ * are keyed by the name because in that case the name is unique. */
134+ if (!objmap -> ht && objmap -> nodetype != XML_ATTRIBUTE_NODE ) {
128135 ZVAL_LONG (key , iter -> index );
129136 } else {
130137 dom_object * intern = Z_DOMOBJ_P (& iterator -> curobj );
131138
132139 if (intern != NULL && intern -> ptr != NULL ) {
133- xmlNodePtr curnode = (xmlNodePtr )((php_libxml_node_ptr * )intern -> ptr )-> node ;
134- ZVAL_STRINGL (key , (char * ) curnode -> name , xmlStrlen (curnode -> name ));
140+ xmlNodePtr curnode = ((php_libxml_node_ptr * )intern -> ptr )-> node ;
141+ if (objmap -> nodetype == XML_ATTRIBUTE_NODE && php_dom_follow_spec_intern (intern )) {
142+ ZVAL_NEW_STR (key , dom_node_get_node_name_attribute_or_element (curnode , false));
143+ } else {
144+ ZVAL_STRINGL (key , (const char * ) curnode -> name , xmlStrlen (curnode -> name ));
145+ }
135146 } else {
136147 ZVAL_NULL (key );
137148 }
@@ -169,9 +180,7 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */
169180 }
170181
171182 dom_object * intern = Z_DOMOBJ_P (& iterator -> curobj );
172- zval * object = & iterator -> intern .data ;
173- dom_object * nnmap = Z_DOMOBJ_P (object );
174- dom_nnodemap_object * objmap = nnmap -> ptr ;
183+ dom_nnodemap_object * objmap = php_dom_iterator_get_nnmap (iterator );
175184
176185 if (intern != NULL && intern -> ptr != NULL ) {
177186 if (objmap -> nodetype != XML_ENTITY_NODE &&
0 commit comments