mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
DOMNodeList::count() cannot return false
Refactor the implementation to make this obvious, and make use of early returns.
This commit is contained in:
parent
d66854bece
commit
f089e8afbd
3 changed files with 48 additions and 45 deletions
|
@ -31,6 +31,50 @@
|
||||||
* Since:
|
* Since:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static int get_nodelist_length(dom_object *obj)
|
||||||
|
{
|
||||||
|
dom_nnodemap_object *objmap = (dom_nnodemap_object *) obj->ptr;
|
||||||
|
if (!objmap) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objmap->ht) {
|
||||||
|
return xmlHashSize(objmap->ht);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objmap->nodetype == DOM_NODESET) {
|
||||||
|
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) {
|
||||||
|
xmlNodePtr curnode = nodep->children;
|
||||||
|
if (curnode) {
|
||||||
|
count++;
|
||||||
|
while (curnode->next != NULL) {
|
||||||
|
count++;
|
||||||
|
curnode = curnode->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
|
||||||
|
nodep = xmlDocGetRootElement((xmlDoc *) nodep);
|
||||||
|
} else {
|
||||||
|
nodep = nodep->children;
|
||||||
|
}
|
||||||
|
dom_get_elements_by_tag_name_ns_raw(
|
||||||
|
nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
/* {{{ length int
|
/* {{{ length int
|
||||||
readonly=yes
|
readonly=yes
|
||||||
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
|
URL: http://www.w3.org/TR/2003/WD-DOM-Level-3-Core-20030226/DOM3-Core.html#ID-203510337
|
||||||
|
@ -38,46 +82,7 @@ Since:
|
||||||
*/
|
*/
|
||||||
int dom_nodelist_length_read(dom_object *obj, zval *retval)
|
int dom_nodelist_length_read(dom_object *obj, zval *retval)
|
||||||
{
|
{
|
||||||
dom_nnodemap_object *objmap;
|
ZVAL_LONG(retval, get_nodelist_length(obj));
|
||||||
xmlNodePtr nodep, curnode;
|
|
||||||
int count = 0;
|
|
||||||
HashTable *nodeht;
|
|
||||||
|
|
||||||
objmap = (dom_nnodemap_object *)obj->ptr;
|
|
||||||
if (objmap != NULL) {
|
|
||||||
if (objmap->ht) {
|
|
||||||
count = xmlHashSize(objmap->ht);
|
|
||||||
} else {
|
|
||||||
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) {
|
|
||||||
if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
|
|
||||||
curnode = nodep->children;
|
|
||||||
if (curnode) {
|
|
||||||
count++;
|
|
||||||
while (curnode->next != NULL) {
|
|
||||||
count++;
|
|
||||||
curnode = curnode->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
|
|
||||||
nodep = xmlDocGetRootElement((xmlDoc *) nodep);
|
|
||||||
} else {
|
|
||||||
nodep = nodep->children;
|
|
||||||
}
|
|
||||||
curnode = dom_get_elements_by_tag_name_ns_raw(
|
|
||||||
nodep, (char *) objmap->ns, (char *) objmap->local, &count, -1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ZVAL_LONG(retval, count);
|
|
||||||
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 */
|
||||||
|
|
||||||
|
|
|
@ -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 {}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue