Skip to content

Commit f089e8a

Browse files
committed
DOMNodeList::count() cannot return false
Refactor the implementation to make this obvious, and make use of early returns.
1 parent d66854b commit f089e8a

File tree

3 files changed

+48
-45
lines changed

3 files changed

+48
-45
lines changed

ext/dom/nodelist.c

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -31,53 +31,58 @@
3131
* Since:
3232
*/
3333

34+
static int get_nodelist_length(dom_object *obj)
35+
{
36+
dom_nnodemap_object *objmap = (dom_nnodemap_object *) obj->ptr;
37+
if (!objmap) {
38+
return 0;
39+
}
40+
41+
if (objmap->ht) {
42+
return xmlHashSize(objmap->ht);
43+
}
44+
45+
if (objmap->nodetype == DOM_NODESET) {
46+
HashTable *nodeht = HASH_OF(&objmap->baseobj_zv);
47+
return zend_hash_num_elements(nodeht);
48+
}
49+
50+
xmlNodePtr nodep = dom_object_get_node(objmap->baseobj);
51+
if (!nodep) {
52+
return 0;
53+
}
54+
55+
int count = 0;
56+
if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
57+
xmlNodePtr curnode = nodep->children;
58+
if (curnode) {
59+
count++;
60+
while (curnode->next != NULL) {
61+
count++;
62+
curnode = curnode->next;
63+
}
64+
}
65+
} else {
66+
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
67+
nodep = xmlDocGetRootElement((xmlDoc *) nodep);
68+
} else {
69+
nodep = nodep->children;
70+
}
71+
dom_get_elements_by_tag_name_ns_raw(
72+
nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
73+
}
74+
75+
return count;
76+
}
77+
3478
/* {{{ length int
3579
readonly=yes
3680
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
3781
Since:
3882
*/
3983
int dom_nodelist_length_read(dom_object *obj, zval *retval)
4084
{
41-
dom_nnodemap_object *objmap;
42-
xmlNodePtr nodep, curnode;
43-
int count = 0;
44-
HashTable *nodeht;
45-
46-
objmap = (dom_nnodemap_object *)obj->ptr;
47-
if (objmap != NULL) {
48-
if (objmap->ht) {
49-
count = xmlHashSize(objmap->ht);
50-
} else {
51-
if (objmap->nodetype == DOM_NODESET) {
52-
nodeht = HASH_OF(&objmap->baseobj_zv);
53-
count = zend_hash_num_elements(nodeht);
54-
} else {
55-
nodep = dom_object_get_node(objmap->baseobj);
56-
if (nodep) {
57-
if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
58-
curnode = nodep->children;
59-
if (curnode) {
60-
count++;
61-
while (curnode->next != NULL) {
62-
count++;
63-
curnode = curnode->next;
64-
}
65-
}
66-
} else {
67-
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
68-
nodep = xmlDocGetRootElement((xmlDoc *) nodep);
69-
} else {
70-
nodep = nodep->children;
71-
}
72-
curnode = dom_get_elements_by_tag_name_ns_raw(
73-
nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
74-
}
75-
}
76-
}
77-
}
78-
}
79-
80-
ZVAL_LONG(retval, count);
85+
ZVAL_LONG(retval, get_nodelist_length(obj));
8186
return SUCCESS;
8287
}
8388

@@ -94,9 +99,7 @@ PHP_METHOD(DOMNodeList, count)
9499
}
95100

96101
intern = Z_DOMOBJ_P(id);
97-
if(dom_nodelist_length_read(intern, return_value) == FAILURE) {
98-
RETURN_FALSE;
99-
}
102+
RETURN_LONG(get_nodelist_length(intern));
100103
}
101104
/* }}} end dom_nodelist_count */
102105

ext/dom/php_dom.stub.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ class DOMNodeList implements IteratorAggregate, Countable
225225
/** @readonly */
226226
public int $length;
227227

228-
/** @return int|false */
228+
/** @return int */
229229
public function count() {}
230230

231231
public function getIterator(): Iterator {}

ext/dom/php_dom_arginfo.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: f9bcfaa9c0ed58949c4ee58fbf1833359010be7d */
2+
* Stub hash: ba5090af41bb2cb6307a636c2e34cf324f785d61 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_dom_import_simplexml, 0, 1, DOMElement, 1)
55
ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)

0 commit comments

Comments
 (0)