From 15259a0a6c86e78001cff8cd8d73d8892bfa6bfb Mon Sep 17 00:00:00 2001 From: Niels Dossche <7771979+nielsdos@users.noreply.github.com> Date: Tue, 2 Apr 2024 23:29:52 +0200 Subject: [PATCH] Factor out common "first container's child" code --- ext/dom/dom_iterators.c | 13 ++----------- ext/dom/nodelist.c | 12 ++---------- ext/dom/php_dom.h | 10 ++++++++++ 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/ext/dom/dom_iterators.c b/ext/dom/dom_iterators.c index 8efadf9b156..06674472d7b 100644 --- a/ext/dom/dom_iterators.c +++ b/ext/dom/dom_iterators.c @@ -180,11 +180,7 @@ static void php_dom_iterator_move_forward(zend_object_iterator *iter) /* {{{ */ if (php_dom_is_cache_tag_stale_from_node(&iterator->cache_tag, basenode)) { php_dom_mark_cache_tag_up_to_date_from_node(&iterator->cache_tag, basenode); previndex = 0; - if (basenode->type == XML_DOCUMENT_NODE || basenode->type == XML_HTML_DOCUMENT_NODE) { - curnode = xmlDocGetRootElement((xmlDoc *) basenode); - } else { - curnode = basenode->children; - } + curnode = php_dom_first_child_of_container_node(basenode); } else { previndex = iter->index - 1; curnode = (xmlNodePtr)((php_libxml_node_ptr *)intern->ptr)->node; @@ -264,12 +260,7 @@ zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, i curnode = (xmlNodePtr) basep->children; } } else { - xmlNodePtr nodep = basep; - if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { - nodep = xmlDocGetRootElement((xmlDoc *) nodep); - } else { - nodep = nodep->children; - } + xmlNodePtr nodep = php_dom_first_child_of_container_node(basep); curnode = dom_get_elements_by_tag_name_ns_raw( basep, nodep, objmap->ns, objmap->local, objmap->local_lower, &curindex, 0); } diff --git a/ext/dom/nodelist.c b/ext/dom/nodelist.c index a178b110dc7..0a0ab32e5c2 100644 --- a/ext/dom/nodelist.c +++ b/ext/dom/nodelist.c @@ -93,11 +93,7 @@ int php_dom_get_nodelist_length(dom_object *obj) } } else { xmlNodePtr basep = nodep; - if (nodep->type == XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) { - nodep = xmlDocGetRootElement((xmlDoc *) nodep); - } else { - nodep = nodep->children; - } + nodep = php_dom_first_child_of_container_node(basep); dom_get_elements_by_tag_name_ns_raw( basep, nodep, objmap->ns, objmap->local, objmap->local_lower, &count, INT_MAX - 1 /* because of <= */); } @@ -189,11 +185,7 @@ void php_dom_nodelist_get_item_into_zval(dom_nnodemap_object *objmap, zend_long itemnode = nodep; } else { if (restart) { - if (basep->type == XML_DOCUMENT_NODE || basep->type == XML_HTML_DOCUMENT_NODE) { - nodep = xmlDocGetRootElement((xmlDoc*) basep); - } else { - nodep = basep->children; - } + nodep = php_dom_first_child_of_container_node(basep); } itemnode = dom_get_elements_by_tag_name_ns_raw(basep, nodep, objmap->ns, objmap->local, objmap->local_lower, &count, relative_index); } diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h index 9a5bdcbe663..e64695f07b1 100644 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@ -275,6 +275,16 @@ static zend_always_inline bool php_dom_follow_spec_node(const xmlNode *node) return false; } +/* Returns the first child of a container node (e.g. elements, fragments, documents, ...). */ +static zend_always_inline xmlNodePtr php_dom_first_child_of_container_node(xmlNodePtr parent) +{ + if (parent->type == XML_DOCUMENT_NODE || parent->type == XML_HTML_DOCUMENT_NODE) { + return xmlDocGetRootElement((xmlDoc *) parent); + } else { + return parent->children; + } +} + PHP_MINIT_FUNCTION(dom); PHP_MSHUTDOWN_FUNCTION(dom); PHP_MINFO_FUNCTION(dom);