@@ -249,23 +249,46 @@ ZEND_METHOD(DOMNodeList, getIterator)
249249 zend_create_internal_iterator_zval (return_value , ZEND_THIS );
250250}
251251
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 )
253267{
254- zend_ulong lval ;
268+ dom_nodelist_dimension_index ret ;
269+
255270 ZVAL_DEREF (offset );
271+
256272 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 );
259275 } 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+ }
265287 } else {
266- * failed = true;
267- return 0 ;
288+ ret .type = DOM_NODELIST_DIM_ILLEGAL ;
268289 }
290+
291+ return ret ;
269292}
270293
271294zval * 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
275298 return NULL ;
276299 }
277300
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 )) {
281303 zend_illegal_container_offset (object -> ce -> name , offset , type );
282304 return NULL ;
283305 }
284306
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 );
286308 return rv ;
287309}
288310
@@ -291,14 +313,13 @@ int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int che
291313 /* If it exists, it cannot be empty because nodes aren't empty. */
292314 ZEND_IGNORE_VALUE (check_empty );
293315
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 )) {
297318 zend_illegal_container_offset (object -> ce -> name , member , BP_VAR_IS );
298319 return 0 ;
299320 }
300321
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 ));
302323}
303324
304325#endif
0 commit comments