@@ -249,23 +249,46 @@ ZEND_METHOD(DOMNodeList, getIterator)
249
249
zend_create_internal_iterator_zval (return_value , ZEND_THIS );
250
250
}
251
251
252
- static zend_long dom_modern_nodelist_get_index (zval * offset , bool * failed )
252
+ enum dom_nodelist_dimension_index_type {
253
+ DOM_NODELIST_DIM_ILLEGAL ,
254
+ DOM_NODELIST_DIM_STRING ,
255
+ DOM_NODELIST_DIM_LONG ,
256
+ };
257
+
258
+ typedef struct _dom_nodelist_dimension_index {
259
+ union {
260
+ zend_long lval ;
261
+ zend_string * str ;
262
+ };
263
+ enum dom_nodelist_dimension_index_type type ;
264
+ } dom_nodelist_dimension_index ;
265
+
266
+ static dom_nodelist_dimension_index dom_modern_nodelist_get_index (zval * offset )
253
267
{
254
- zend_ulong lval ;
268
+ dom_nodelist_dimension_index ret ;
269
+
255
270
ZVAL_DEREF (offset );
271
+
256
272
if (Z_TYPE_P (offset ) == IS_LONG ) {
257
- * failed = false ;
258
- return Z_LVAL_P (offset );
273
+ ret . type = DOM_NODELIST_DIM_LONG ;
274
+ ret . lval = Z_LVAL_P (offset );
259
275
} else if (Z_TYPE_P (offset ) == IS_DOUBLE ) {
260
- * failed = false;
261
- return zend_dval_to_lval_safe (Z_DVAL_P (offset ));
262
- } else if (Z_TYPE_P (offset ) == IS_STRING && ZEND_HANDLE_NUMERIC (Z_STR_P (offset ), lval )) {
263
- * failed = false;
264
- return (zend_long ) lval ;
276
+ ret .type = DOM_NODELIST_DIM_LONG ;
277
+ ret .lval = zend_dval_to_lval_safe (Z_DVAL_P (offset ));
278
+ } else if (Z_TYPE_P (offset ) == IS_STRING ) {
279
+ zend_ulong lval ;
280
+ if (ZEND_HANDLE_NUMERIC (Z_STR_P (offset ), lval )) {
281
+ ret .type = DOM_NODELIST_DIM_LONG ;
282
+ ret .lval = (zend_long ) lval ;
283
+ } else {
284
+ ret .type = DOM_NODELIST_DIM_STRING ;
285
+ ret .str = Z_STR_P (offset );
286
+ }
265
287
} else {
266
- * failed = true;
267
- return 0 ;
288
+ ret .type = DOM_NODELIST_DIM_ILLEGAL ;
268
289
}
290
+
291
+ return ret ;
269
292
}
270
293
271
294
zval * dom_modern_nodelist_read_dimension (zend_object * object , zval * offset , int type , zval * rv )
@@ -275,14 +298,13 @@ zval *dom_modern_nodelist_read_dimension(zend_object *object, zval *offset, int
275
298
return NULL ;
276
299
}
277
300
278
- bool failed ;
279
- zend_long lval = dom_modern_nodelist_get_index (offset , & failed );
280
- if (UNEXPECTED (failed )) {
301
+ dom_nodelist_dimension_index index = dom_modern_nodelist_get_index (offset );
302
+ if (UNEXPECTED (index .type == DOM_NODELIST_DIM_ILLEGAL || index .type == DOM_NODELIST_DIM_STRING )) {
281
303
zend_illegal_container_offset (object -> ce -> name , offset , type );
282
304
return NULL ;
283
305
}
284
306
285
- php_dom_nodelist_get_item_into_zval (php_dom_obj_from_obj (object )-> ptr , lval , rv );
307
+ php_dom_nodelist_get_item_into_zval (php_dom_obj_from_obj (object )-> ptr , index . lval , rv );
286
308
return rv ;
287
309
}
288
310
@@ -291,14 +313,13 @@ int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int che
291
313
/* If it exists, it cannot be empty because nodes aren't empty. */
292
314
ZEND_IGNORE_VALUE (check_empty );
293
315
294
- bool failed ;
295
- zend_long lval = dom_modern_nodelist_get_index (member , & failed );
296
- if (UNEXPECTED (failed )) {
316
+ dom_nodelist_dimension_index index = dom_modern_nodelist_get_index (member );
317
+ if (UNEXPECTED (index .type == DOM_NODELIST_DIM_ILLEGAL || index .type == DOM_NODELIST_DIM_STRING )) {
297
318
zend_illegal_container_offset (object -> ce -> name , member , BP_VAR_IS );
298
319
return 0 ;
299
320
}
300
321
301
- return lval >= 0 && lval < php_dom_get_nodelist_length (php_dom_obj_from_obj (object ));
322
+ return index . lval >= 0 && index . lval < php_dom_get_nodelist_length (php_dom_obj_from_obj (object ));
302
323
}
303
324
304
325
#endif
0 commit comments