@@ -68,7 +68,7 @@ xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const
68
68
}
69
69
/* }}} */
70
70
71
- static xmlNode * php_dom_libxml_hash_iter_ex (xmlHashTable * ht , int index )
71
+ xmlNodePtr php_dom_libxml_hash_iter (xmlHashTable * ht , int index )
72
72
{
73
73
int htsize ;
74
74
@@ -84,18 +84,6 @@ static xmlNode *php_dom_libxml_hash_iter_ex(xmlHashTable *ht, int index)
84
84
}
85
85
}
86
86
87
- xmlNode * php_dom_libxml_hash_iter (dom_nnodemap_object * objmap , int index )
88
- {
89
- xmlNode * curnode = php_dom_libxml_hash_iter_ex (objmap -> ht , index );
90
-
91
- if (curnode != NULL && objmap -> nodetype != XML_ENTITY_NODE ) {
92
- xmlNotation * notation = (xmlNotation * ) curnode ;
93
- curnode = create_notation (notation -> name , notation -> PublicID , notation -> SystemID );
94
- }
95
-
96
- return curnode ;
97
- }
98
-
99
87
static void php_dom_iterator_dtor (zend_object_iterator * iter ) /* {{{ */
100
88
{
101
89
php_dom_iterator * iterator = (php_dom_iterator * )iter ;
@@ -109,7 +97,7 @@ static zend_result php_dom_iterator_valid(zend_object_iterator *iter) /* {{{ */
109
97
{
110
98
php_dom_iterator * iterator = (php_dom_iterator * )iter ;
111
99
112
- if (Z_TYPE (iterator -> curobj ) != IS_UNDEF ) {
100
+ if (! Z_ISNULL (iterator -> curobj )) {
113
101
return SUCCESS ;
114
102
} else {
115
103
return FAILURE ;
@@ -120,7 +108,7 @@ static zend_result php_dom_iterator_valid(zend_object_iterator *iter) /* {{{ */
120
108
zval * php_dom_iterator_current_data (zend_object_iterator * iter ) /* {{{ */
121
109
{
122
110
php_dom_iterator * iterator = (php_dom_iterator * )iter ;
123
- return Z_ISUNDEF (iterator -> curobj ) ? NULL : & iterator -> curobj ;
111
+ return Z_ISNULL (iterator -> curobj ) ? NULL : & iterator -> curobj ;
124
112
}
125
113
/* }}} */
126
114
@@ -131,14 +119,14 @@ static void php_dom_iterator_current_key(zend_object_iterator *iter, zval *key)
131
119
132
120
/* Only dtd named node maps, i.e. the ones based on a libxml hash table or attribute collections,
133
121
* are keyed by the name because in that case the name is unique. */
134
- if (! objmap -> ht && objmap -> nodetype != XML_ATTRIBUTE_NODE ) {
122
+ if (objmap -> handler -> nameless ) {
135
123
ZVAL_LONG (key , iterator -> index );
136
124
} else {
137
125
dom_object * intern = Z_DOMOBJ_P (& iterator -> curobj );
138
126
139
- if (intern != NULL && intern -> ptr != NULL ) {
127
+ if (intern -> ptr != NULL ) {
140
128
xmlNodePtr curnode = ((php_libxml_node_ptr * )intern -> ptr )-> node ;
141
- if (objmap -> nodetype == XML_ATTRIBUTE_NODE && php_dom_follow_spec_intern (intern )) {
129
+ if (curnode -> type == XML_ATTRIBUTE_NODE && php_dom_follow_spec_intern (intern )) {
142
130
ZVAL_NEW_STR (key , dom_node_get_node_name_attribute_or_element (curnode , false));
143
131
} else {
144
132
ZVAL_STRINGL (key , (const char * ) curnode -> name , xmlStrlen (curnode -> name ));
@@ -150,99 +138,36 @@ static void php_dom_iterator_current_key(zend_object_iterator *iter, zval *key)
150
138
}
151
139
/* }}} */
152
140
153
- static xmlNodePtr dom_fetch_first_iteration_item (dom_nnodemap_object * objmap )
154
- {
155
- xmlNodePtr basep = dom_object_get_node (objmap -> baseobj );
156
- if (!basep ) {
157
- return NULL ;
158
- }
159
- if (objmap -> nodetype == XML_ATTRIBUTE_NODE || objmap -> nodetype == XML_ELEMENT_NODE ) {
160
- if (objmap -> nodetype == XML_ATTRIBUTE_NODE ) {
161
- return (xmlNodePtr ) basep -> properties ;
162
- } else {
163
- return dom_nodelist_iter_start_first_child (basep );
164
- }
165
- } else {
166
- zend_long curindex = 0 ;
167
- xmlNodePtr nodep = php_dom_first_child_of_container_node (basep );
168
- return dom_get_elements_by_tag_name_ns_raw (
169
- basep , nodep , objmap -> ns , objmap -> local , objmap -> local_lower , & curindex , 0 );
170
- }
171
- }
172
-
173
141
static void php_dom_iterator_move_forward (zend_object_iterator * iter ) /* {{{ */
174
142
{
175
- xmlNodePtr curnode = NULL ;
176
-
177
143
php_dom_iterator * iterator = (php_dom_iterator * )iter ;
178
- if (Z_ISUNDEF (iterator -> curobj )) {
144
+ if (Z_ISNULL (iterator -> curobj )) {
179
145
return ;
180
146
}
181
147
182
148
iterator -> index ++ ;
149
+ zval garbage ;
150
+ ZVAL_COPY_VALUE (& garbage , & iterator -> curobj );
151
+ ZVAL_NULL (& iterator -> curobj );
183
152
184
153
dom_object * intern = Z_DOMOBJ_P (& iterator -> curobj );
185
154
dom_nnodemap_object * objmap = php_dom_iterator_get_nnmap (iterator );
186
155
187
- if (intern != NULL && intern -> ptr != NULL ) {
188
- if (objmap -> nodetype != XML_ENTITY_NODE &&
189
- objmap -> nodetype != XML_NOTATION_NODE ) {
190
- if (objmap -> nodetype == DOM_NODESET ) {
191
- HashTable * nodeht = Z_ARRVAL_P (& objmap -> baseobj_zv );
192
- zval * entry = zend_hash_index_find (nodeht , iterator -> index );
193
- if (entry ) {
194
- zval_ptr_dtor (& iterator -> curobj );
195
- ZVAL_COPY (& iterator -> curobj , entry );
196
- return ;
197
- }
198
- } else {
199
- if (objmap -> nodetype == XML_ATTRIBUTE_NODE ||
200
- objmap -> nodetype == XML_ELEMENT_NODE ) {
201
-
202
- /* Note: keep legacy behaviour for non-spec mode. */
203
- if (php_dom_follow_spec_intern (intern ) && php_dom_is_cache_tag_stale_from_doc_ptr (& iterator -> cache_tag , intern -> document )) {
204
- php_dom_mark_cache_tag_up_to_date_from_doc_ref (& iterator -> cache_tag , intern -> document );
205
- curnode = dom_fetch_first_iteration_item (objmap );
206
- zend_ulong index = 0 ;
207
- while (curnode != NULL && index ++ < iterator -> index ) {
208
- curnode = curnode -> next ;
209
- }
210
- } else {
211
- curnode = (xmlNodePtr )((php_libxml_node_ptr * )intern -> ptr )-> node ;
212
- curnode = curnode -> next ;
213
- }
214
- } else {
215
- /* The collection is live, we nav the tree from the base object if we cannot
216
- * use the cache to restart from the last point. */
217
- xmlNodePtr basenode = dom_object_get_node (objmap -> baseobj );
218
-
219
- /* We have a strong reference to the base node via baseobj_zv, this cannot become NULL */
220
- ZEND_ASSERT (basenode != NULL );
221
-
222
- zend_long previndex ;
223
- if (php_dom_is_cache_tag_stale_from_node (& iterator -> cache_tag , basenode )) {
224
- php_dom_mark_cache_tag_up_to_date_from_node (& iterator -> cache_tag , basenode );
225
- previndex = 0 ;
226
- curnode = php_dom_first_child_of_container_node (basenode );
227
- } else {
228
- previndex = iterator -> index - 1 ;
229
- curnode = (xmlNodePtr )((php_libxml_node_ptr * )intern -> ptr )-> node ;
230
- }
231
- curnode = dom_get_elements_by_tag_name_ns_raw (
232
- basenode , curnode , objmap -> ns , objmap -> local , objmap -> local_lower , & previndex , iterator -> index );
233
- }
156
+ if (intern -> ptr != NULL ) {
157
+ /* Note: keep legacy behaviour for non-spec mode. */
158
+ /* TODO: make this prettier */
159
+ if (!php_dom_follow_spec_intern (intern ) && (objmap -> handler == & php_dom_obj_map_attributes || objmap -> handler == & php_dom_obj_map_child_nodes )) {
160
+ xmlNodePtr curnode = ((php_libxml_node_ptr * ) intern -> ptr )-> node ;
161
+ curnode = curnode -> next ;
162
+ if (curnode ) {
163
+ php_dom_create_object (curnode , & iterator -> curobj , objmap -> baseobj );
234
164
}
235
165
} else {
236
- curnode = php_dom_libxml_hash_iter (objmap , iterator -> index );
166
+ objmap -> handler -> get_item (objmap , ( zend_long ) iterator -> index , & iterator -> curobj );
237
167
}
238
168
}
239
169
240
- zval_ptr_dtor (& iterator -> curobj );
241
- ZVAL_UNDEF (& iterator -> curobj );
242
-
243
- if (curnode ) {
244
- php_dom_create_object (curnode , & iterator -> curobj , objmap -> baseobj );
245
- }
170
+ zval_ptr_dtor (& garbage );
246
171
}
247
172
/* }}} */
248
173
@@ -261,7 +186,6 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i
261
186
{
262
187
dom_object * intern ;
263
188
dom_nnodemap_object * objmap ;
264
- xmlNodePtr curnode = NULL ;
265
189
php_dom_iterator * iterator ;
266
190
267
191
if (by_ref ) {
@@ -277,26 +201,7 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i
277
201
278
202
intern = Z_DOMOBJ_P (object );
279
203
objmap = (dom_nnodemap_object * )intern -> ptr ;
280
- if (objmap != NULL ) {
281
- if (objmap -> nodetype != XML_ENTITY_NODE &&
282
- objmap -> nodetype != XML_NOTATION_NODE ) {
283
- if (objmap -> nodetype == DOM_NODESET ) {
284
- HashTable * nodeht = Z_ARRVAL_P (& objmap -> baseobj_zv );
285
- zval * entry = zend_hash_index_find (nodeht , 0 );
286
- if (entry ) {
287
- ZVAL_COPY (& iterator -> curobj , entry );
288
- }
289
- } else {
290
- curnode = dom_fetch_first_iteration_item (objmap );
291
- }
292
- } else {
293
- curnode = php_dom_libxml_hash_iter (objmap , 0 );
294
- }
295
- }
296
-
297
- if (curnode ) {
298
- php_dom_create_object (curnode , & iterator -> curobj , objmap -> baseobj );
299
- }
204
+ objmap -> handler -> get_item (objmap , 0 , & iterator -> curobj );
300
205
301
206
return & iterator -> intern ;
302
207
}
0 commit comments