DOMNodeList::count() cannot return false

Refactor the implementation to make this obvious, and make use
of early returns.
This commit is contained in:
Nikita Popov 2021-07-16 16:22:12 +02:00
parent d66854bece
commit f089e8afbd
3 changed files with 48 additions and 45 deletions

View file

@ -31,31 +31,30 @@
* Since:
*/
/* {{{ length int
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
Since:
*/
int dom_nodelist_length_read(dom_object *obj, zval *retval)
static int get_nodelist_length(dom_object *obj)
{
dom_nnodemap_object *objmap;
xmlNodePtr nodep, curnode;
int count = 0;
HashTable *nodeht;
dom_nnodemap_object *objmap = (dom_nnodemap_object *) obj->ptr;
if (!objmap) {
return 0;
}
objmap = (dom_nnodemap_object *)obj->ptr;
if (objmap != NULL) {
if (objmap->ht) {
count = xmlHashSize(objmap->ht);
} else {
return xmlHashSize(objmap->ht);
}
if (objmap->nodetype == DOM_NODESET) {
nodeht = HASH_OF(&objmap->baseobj_zv);
count = zend_hash_num_elements(nodeht);
} else {
nodep = dom_object_get_node(objmap->baseobj);
if (nodep) {
HashTable *nodeht = HASH_OF(&objmap->baseobj_zv);
return zend_hash_num_elements(nodeht);
}
xmlNodePtr nodep = dom_object_get_node(objmap->baseobj);
if (!nodep) {
return 0;
}
int count = 0;
if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
curnode = nodep->children;
xmlNodePtr curnode = nodep->children;
if (curnode) {
count++;
while (curnode->next != NULL) {
@ -69,15 +68,21 @@ int dom_nodelist_length_read(dom_object *obj, zval *retval)
} else {
nodep = nodep->children;
}
curnode = dom_get_elements_by_tag_name_ns_raw(
dom_get_elements_by_tag_name_ns_raw(
nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
}
}
}
}
return count;
}
ZVAL_LONG(retval, count);
/* {{{ length int
readonly=yes
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
Since:
*/
int dom_nodelist_length_read(dom_object *obj, zval *retval)
{
ZVAL_LONG(retval, get_nodelist_length(obj));
return SUCCESS;
}
@ -94,9 +99,7 @@ PHP_METHOD(DOMNodeList, count)
}
intern = Z_DOMOBJ_P(id);
if(dom_nodelist_length_read(intern, return_value) == FAILURE) {
RETURN_FALSE;
}
RETURN_LONG(get_nodelist_length(intern));
}
/* }}} end dom_nodelist_count */

View file

@ -225,7 +225,7 @@ class DOMNodeList implements IteratorAggregate, Countable
/** @readonly */
public int $length;
/** @return int|false */
/** @return int */
public function count() {}
public function getIterator(): Iterator {}

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead.
* Stub hash: f9bcfaa9c0ed58949c4ee58fbf1833359010be7d */
* Stub hash: ba5090af41bb2cb6307a636c2e34cf324f785d61 */
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_dom_import_simplexml, 0, 1, DOMElement, 1)
ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)