Skip to content

Commit aa6564c

Browse files
committed
Refactor dom_modern_nodelist_get_index()
1 parent 53f6e5e commit aa6564c

File tree

1 file changed

+40
-19
lines changed

1 file changed

+40
-19
lines changed

ext/dom/nodelist.c

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -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

271294
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
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

Comments
 (0)