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: * Since:
*/ */
/* {{{ length int static int get_nodelist_length(dom_object *obj)
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)
{ {
dom_nnodemap_object *objmap; dom_nnodemap_object *objmap = (dom_nnodemap_object *) obj->ptr;
xmlNodePtr nodep, curnode; if (!objmap) {
int count = 0; return 0;
HashTable *nodeht; }
objmap = (dom_nnodemap_object *)obj->ptr;
if (objmap != NULL) {
if (objmap->ht) { if (objmap->ht) {
count = xmlHashSize(objmap->ht); return xmlHashSize(objmap->ht);
} else { }
if (objmap->nodetype == DOM_NODESET) { if (objmap->nodetype == DOM_NODESET) {
nodeht = HASH_OF(&objmap->baseobj_zv); HashTable *nodeht = HASH_OF(&objmap->baseobj_zv);
count = zend_hash_num_elements(nodeht); return zend_hash_num_elements(nodeht);
} else { }
nodep = dom_object_get_node(objmap->baseobj);
if (nodep) { 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) { if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
curnode = nodep->children; xmlNodePtr curnode = nodep->children;
if (curnode) { if (curnode) {
count++; count++;
while (curnode->next != NULL) { while (curnode->next != NULL) {
@ -69,15 +68,21 @@ int dom_nodelist_length_read(dom_object *obj, zval *retval)
} else { } else {
nodep = nodep->children; 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); nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
} }
}
}
}
}
ZVAL_LONG(retval, count); return 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; return SUCCESS;
} }
@ -94,9 +99,7 @@ PHP_METHOD(DOMNodeList, count)
} }
intern = Z_DOMOBJ_P(id); intern = Z_DOMOBJ_P(id);
if(dom_nodelist_length_read(intern, return_value) == FAILURE) { RETURN_LONG(get_nodelist_length(intern));
RETURN_FALSE;
}
} }
/* }}} end dom_nodelist_count */ /* }}} end dom_nodelist_count */

View file

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

View file

@ -1,5 +1,5 @@
/* This is a generated file, edit the .stub.php file instead. /* 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_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_dom_import_simplexml, 0, 1, DOMElement, 1)
ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0) ZEND_ARG_TYPE_INFO(0, node, IS_OBJECT, 0)