Skip to content

Commit 53f6e5e

Browse files
committed
Move node list dimension handling to a separate file
1 parent ac039cf commit 53f6e5e

File tree

3 files changed

+55
-54
lines changed

3 files changed

+55
-54
lines changed

ext/dom/nodelist.c

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,4 +249,56 @@ 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)
253+
{
254+
zend_ulong lval;
255+
ZVAL_DEREF(offset);
256+
if (Z_TYPE_P(offset) == IS_LONG) {
257+
*failed = false;
258+
return Z_LVAL_P(offset);
259+
} 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;
265+
} else {
266+
*failed = true;
267+
return 0;
268+
}
269+
}
270+
271+
zval *dom_modern_nodelist_read_dimension(zend_object *object, zval *offset, int type, zval *rv)
272+
{
273+
if (UNEXPECTED(!offset)) {
274+
zend_throw_error(NULL, "Cannot append to %s", ZSTR_VAL(object->ce->name));
275+
return NULL;
276+
}
277+
278+
bool failed;
279+
zend_long lval = dom_modern_nodelist_get_index(offset, &failed);
280+
if (UNEXPECTED(failed)) {
281+
zend_illegal_container_offset(object->ce->name, offset, type);
282+
return NULL;
283+
}
284+
285+
php_dom_nodelist_get_item_into_zval(php_dom_obj_from_obj(object)->ptr, lval, rv);
286+
return rv;
287+
}
288+
289+
int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int check_empty)
290+
{
291+
/* If it exists, it cannot be empty because nodes aren't empty. */
292+
ZEND_IGNORE_VALUE(check_empty);
293+
294+
bool failed;
295+
zend_long lval = dom_modern_nodelist_get_index(member, &failed);
296+
if (UNEXPECTED(failed)) {
297+
zend_illegal_container_offset(object->ce->name, member, BP_VAR_IS);
298+
return 0;
299+
}
300+
301+
return lval >= 0 && lval < php_dom_get_nodelist_length(php_dom_obj_from_obj(object));
302+
}
303+
252304
#endif

ext/dom/php_dom.c

Lines changed: 0 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -656,8 +656,6 @@ static zval *dom_nodemap_read_dimension(zend_object *object, zval *offset, int t
656656
static int dom_nodemap_has_dimension(zend_object *object, zval *member, int check_empty);
657657
static zval *dom_modern_nodemap_read_dimension(zend_object *object, zval *offset, int type, zval *rv);
658658
static int dom_modern_nodemap_has_dimension(zend_object *object, zval *member, int check_empty);
659-
static zval *dom_modern_nodelist_read_dimension(zend_object *object, zval *offset, int type, zval *rv);
660-
static int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int check_empty);
661659
static zend_object *dom_objects_store_clone_obj(zend_object *zobject);
662660

663661
#ifdef LIBXML_XPATH_ENABLED
@@ -2193,58 +2191,6 @@ static int dom_nodelist_has_dimension(zend_object *object, zval *member, int che
21932191
return offset >= 0 && offset < php_dom_get_nodelist_length(php_dom_obj_from_obj(object));
21942192
}
21952193

2196-
static zend_long dom_modern_nodelist_get_index(zval *offset, bool *failed)
2197-
{
2198-
zend_ulong lval;
2199-
ZVAL_DEREF(offset);
2200-
if (Z_TYPE_P(offset) == IS_LONG) {
2201-
*failed = false;
2202-
return Z_LVAL_P(offset);
2203-
} else if (Z_TYPE_P(offset) == IS_DOUBLE) {
2204-
*failed = false;
2205-
return zend_dval_to_lval_safe(Z_DVAL_P(offset));
2206-
} else if (Z_TYPE_P(offset) == IS_STRING && ZEND_HANDLE_NUMERIC(Z_STR_P(offset), lval)) {
2207-
*failed = false;
2208-
return (zend_long) lval;
2209-
} else {
2210-
*failed = true;
2211-
return 0;
2212-
}
2213-
}
2214-
2215-
static zval *dom_modern_nodelist_read_dimension(zend_object *object, zval *offset, int type, zval *rv)
2216-
{
2217-
if (UNEXPECTED(!offset)) {
2218-
zend_throw_error(NULL, "Cannot append to %s", ZSTR_VAL(object->ce->name));
2219-
return NULL;
2220-
}
2221-
2222-
bool failed;
2223-
zend_long lval = dom_modern_nodelist_get_index(offset, &failed);
2224-
if (UNEXPECTED(failed)) {
2225-
zend_illegal_container_offset(object->ce->name, offset, type);
2226-
return NULL;
2227-
}
2228-
2229-
php_dom_nodelist_get_item_into_zval(php_dom_obj_from_obj(object)->ptr, lval, rv);
2230-
return rv;
2231-
}
2232-
2233-
static int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int check_empty)
2234-
{
2235-
/* If it exists, it cannot be empty because nodes aren't empty. */
2236-
ZEND_IGNORE_VALUE(check_empty);
2237-
2238-
bool failed;
2239-
zend_long lval = dom_modern_nodelist_get_index(member, &failed);
2240-
if (UNEXPECTED(failed)) {
2241-
zend_illegal_container_offset(object->ce->name, member, BP_VAR_IS);
2242-
return 0;
2243-
}
2244-
2245-
return lval >= 0 && lval < php_dom_get_nodelist_length(php_dom_obj_from_obj(object));
2246-
}
2247-
22482194
void dom_remove_all_children(xmlNodePtr nodep)
22492195
{
22502196
if (nodep->children) {

ext/dom/php_dom.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@ xmlDocPtr php_dom_create_html_doc(void);
177177
xmlChar *dom_attr_value(const xmlAttr *attr, bool *free);
178178
bool dom_compare_value(const xmlAttr *attr, const xmlChar *value);
179179

180+
zval *dom_modern_nodelist_read_dimension(zend_object *object, zval *offset, int type, zval *rv);
181+
int dom_modern_nodelist_has_dimension(zend_object *object, zval *member, int check_empty);
182+
180183
typedef enum {
181184
DOM_LOAD_STRING = 0,
182185
DOM_LOAD_FILE = 1,

0 commit comments

Comments
 (0)