Skip to content

Commit 7be3649

Browse files
authored
Cleanup iterator instantiation code (#17358)
Just using object_init_ex() directly makes the code a bit simpler and avoids unnecessary indirections.
1 parent b21c169 commit 7be3649

File tree

7 files changed

+16
-51
lines changed

7 files changed

+16
-51
lines changed

ext/dom/documenttype.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
2424
#include "php_dom.h"
2525
#include "dom_properties.h"
26+
#include "internal_helpers.h"
2627

2728
/* {{{ name string
2829
readonly=yes
@@ -47,7 +48,7 @@ zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
4748
{
4849
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
4950

50-
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
51+
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
5152

5253
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
5354

@@ -68,7 +69,7 @@ zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
6869
{
6970
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
7071

71-
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
72+
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
7273

7374
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;
7475

ext/dom/element.c

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ PHP_METHOD(Dom_Element, removeAttributeNode)
802802
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagname
803803
Since:
804804
*/
805-
static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, bool modern)
805+
static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *iter_ce)
806806
{
807807
dom_object *intern, *namednode;
808808
zend_string *name;
@@ -818,23 +818,19 @@ static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, b
818818

819819
DOM_GET_THIS_INTERN(intern);
820820

821-
if (modern) {
822-
php_dom_create_iterator(return_value, DOM_HTMLCOLLECTION, true);
823-
} else {
824-
php_dom_create_iterator(return_value, DOM_NODELIST, false);
825-
}
821+
object_init_ex(return_value, iter_ce);
826822
namednode = Z_DOMOBJ_P(return_value);
827823
dom_namednode_iter(intern, 0, namednode, NULL, name, NULL);
828824
}
829825

830826
PHP_METHOD(DOMElement, getElementsByTagName)
831827
{
832-
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
828+
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_nodelist_class_entry);
833829
}
834830

835831
PHP_METHOD(Dom_Element, getElementsByTagName)
836832
{
837-
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
833+
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_html_collection_class_entry);
838834
}
839835
/* }}} end dom_element_get_elements_by_tag_name */
840836

@@ -1229,7 +1225,7 @@ PHP_METHOD(Dom_Element, setAttributeNodeNS)
12291225
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagnamens
12301226
Since: DOM Level 2
12311227
*/
1232-
static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS, bool modern)
1228+
static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *iter_ce)
12331229
{
12341230
dom_object *intern, *namednode;
12351231
zend_string *uri, *name;
@@ -1254,23 +1250,19 @@ static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS
12541250

12551251
DOM_GET_THIS_INTERN(intern);
12561252

1257-
if (modern) {
1258-
php_dom_create_iterator(return_value, DOM_HTMLCOLLECTION, true);
1259-
} else {
1260-
php_dom_create_iterator(return_value, DOM_NODELIST, false);
1261-
}
1253+
object_init_ex(return_value, iter_ce);
12621254
namednode = Z_DOMOBJ_P(return_value);
12631255
dom_namednode_iter(intern, 0, namednode, NULL, name, uri);
12641256
}
12651257

12661258
PHP_METHOD(DOMElement, getElementsByTagNameNS)
12671259
{
1268-
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
1260+
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_nodelist_class_entry);
12691261
}
12701262

12711263
PHP_METHOD(Dom_Element, getElementsByTagNameNS)
12721264
{
1273-
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
1265+
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_html_collection_class_entry);
12741266
}
12751267
/* }}} end dom_element_get_elements_by_tag_name_ns */
12761268

ext/dom/node.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval)
281281
{
282282
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
283283

284-
php_dom_create_iterator(retval, DOM_NODELIST, php_dom_follow_spec_intern(obj));
284+
object_init_ex(retval, dom_get_nodelist_ce(php_dom_follow_spec_intern(obj)));
285285
dom_object *intern = Z_DOMOBJ_P(retval);
286286
dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
287287

@@ -415,7 +415,7 @@ zend_result dom_node_attributes_read(dom_object *obj, zval *retval)
415415
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
416416

417417
if (nodep->type == XML_ELEMENT_NODE) {
418-
php_dom_create_iterator(retval, DOM_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
418+
object_init_ex(retval, dom_get_namednodemap_ce(php_dom_follow_spec_intern(obj)));
419419
dom_object *intern = Z_DOMOBJ_P(retval);
420420
dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
421421
} else {

ext/dom/parentnode/css_selectors.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zv
245245
zend_array_destroy(list);
246246
RETURN_THROWS();
247247
} else {
248-
php_dom_create_iterator(return_value, DOM_NODELIST, true);
248+
object_init_ex(return_value, dom_modern_nodelist_class_entry);
249249
dom_object *ret_obj = Z_DOMOBJ_P(return_value);
250250
dom_nnodemap_object *mapptr = (dom_nnodemap_object *) ret_obj->ptr;
251251
ZVAL_ARR(&mapptr->baseobj_zv, list);

ext/dom/php_dom.c

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,27 +1623,6 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type)
16231623
return &intern->std;
16241624
}
16251625

1626-
void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type, bool modern) /* {{{ */
1627-
{
1628-
zend_class_entry *ce;
1629-
1630-
if (iterator_type == DOM_NAMEDNODEMAP) {
1631-
ce = dom_get_namednodemap_ce(modern);
1632-
} else if (iterator_type == DOM_HTMLCOLLECTION) {
1633-
/* This only exists in modern DOM. */
1634-
ZEND_ASSERT(modern);
1635-
ce = dom_html_collection_class_entry;
1636-
} else if (iterator_type == DOM_DTD_NAMEDNODEMAP) {
1637-
ce = dom_get_dtd_namednodemap_ce(modern);
1638-
} else {
1639-
ZEND_ASSERT(iterator_type == DOM_NODELIST);
1640-
ce = dom_get_nodelist_ce(modern);
1641-
}
1642-
1643-
object_init_ex(return_value, ce);
1644-
}
1645-
/* }}} */
1646-
16471626
static zend_always_inline zend_class_entry *dom_get_element_ce(const xmlNode *node, bool modern)
16481627
{
16491628
if (modern) {

ext/dom/php_dom.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,6 @@ typedef struct {
109109
dom_object dom;
110110
} dom_object_namespace_node;
111111

112-
typedef enum dom_iterator_type {
113-
DOM_NODELIST,
114-
DOM_NAMEDNODEMAP,
115-
DOM_DTD_NAMEDNODEMAP,
116-
DOM_HTMLCOLLECTION,
117-
} dom_iterator_type;
118-
119112
struct php_dom_libxml_ns_mapper;
120113
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
121114

@@ -151,7 +144,6 @@ int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
151144
bool dom_has_feature(zend_string *feature, zend_string *version);
152145
bool dom_node_is_read_only(const xmlNode *node);
153146
bool dom_node_children_valid(const xmlNode *node);
154-
void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type, bool modern);
155147
void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xmlHashTablePtr ht, zend_string *local, zend_string *ns);
156148
xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID);
157149
xmlNode *php_dom_libxml_hash_iter(dom_nnodemap_object *objmap, int index);

ext/dom/xpath.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "php_dom.h"
2525
#include "namespace_compat.h"
2626
#include "private_data.h"
27+
#include "internal_helpers.h"
2728

2829
#define PHP_DOM_XPATH_QUERY 0
2930
#define PHP_DOM_XPATH_EVALUATE 1
@@ -371,7 +372,7 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type, bool modern)
371372
} else {
372373
ZVAL_EMPTY_ARRAY(&retval);
373374
}
374-
php_dom_create_iterator(return_value, DOM_NODELIST, modern);
375+
object_init_ex(return_value, dom_get_nodelist_ce(modern));
375376
nodeobj = Z_DOMOBJ_P(return_value);
376377
dom_xpath_iter(&retval, nodeobj);
377378
break;

0 commit comments

Comments
 (0)