mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Cleanup iterator instantiation code (#17358)
Just using object_init_ex() directly makes the code a bit simpler and avoids unnecessary indirections.
This commit is contained in:
@@ -23,6 +23,7 @@
|
|||||||
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
|
#if defined(HAVE_LIBXML) && defined(HAVE_DOM)
|
||||||
#include "php_dom.h"
|
#include "php_dom.h"
|
||||||
#include "dom_properties.h"
|
#include "dom_properties.h"
|
||||||
|
#include "internal_helpers.h"
|
||||||
|
|
||||||
/* {{{ name string
|
/* {{{ name string
|
||||||
readonly=yes
|
readonly=yes
|
||||||
@@ -47,7 +48,7 @@ zend_result dom_documenttype_entities_read(dom_object *obj, zval *retval)
|
|||||||
{
|
{
|
||||||
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
|
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
|
||||||
|
|
||||||
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
|
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
|
||||||
|
|
||||||
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
|
xmlHashTable *entityht = (xmlHashTable *) dtdptr->entities;
|
||||||
|
|
||||||
@@ -68,7 +69,7 @@ zend_result dom_documenttype_notations_read(dom_object *obj, zval *retval)
|
|||||||
{
|
{
|
||||||
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
|
DOM_PROP_NODE(xmlDtdPtr, dtdptr, obj);
|
||||||
|
|
||||||
php_dom_create_iterator(retval, DOM_DTD_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
|
object_init_ex(retval, dom_get_dtd_namednodemap_ce(php_dom_follow_spec_intern(obj)));
|
||||||
|
|
||||||
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;
|
xmlHashTable *notationht = (xmlHashTable *) dtdptr->notations;
|
||||||
|
|
||||||
|
|||||||
@@ -802,7 +802,7 @@ PHP_METHOD(Dom_Element, removeAttributeNode)
|
|||||||
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagname
|
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagname
|
||||||
Since:
|
Since:
|
||||||
*/
|
*/
|
||||||
static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, bool modern)
|
static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *iter_ce)
|
||||||
{
|
{
|
||||||
dom_object *intern, *namednode;
|
dom_object *intern, *namednode;
|
||||||
zend_string *name;
|
zend_string *name;
|
||||||
@@ -818,23 +818,19 @@ static void dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAMETERS, b
|
|||||||
|
|
||||||
DOM_GET_THIS_INTERN(intern);
|
DOM_GET_THIS_INTERN(intern);
|
||||||
|
|
||||||
if (modern) {
|
object_init_ex(return_value, iter_ce);
|
||||||
php_dom_create_iterator(return_value, DOM_HTMLCOLLECTION, true);
|
|
||||||
} else {
|
|
||||||
php_dom_create_iterator(return_value, DOM_NODELIST, false);
|
|
||||||
}
|
|
||||||
namednode = Z_DOMOBJ_P(return_value);
|
namednode = Z_DOMOBJ_P(return_value);
|
||||||
dom_namednode_iter(intern, 0, namednode, NULL, name, NULL);
|
dom_namednode_iter(intern, 0, namednode, NULL, name, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(DOMElement, getElementsByTagName)
|
PHP_METHOD(DOMElement, getElementsByTagName)
|
||||||
{
|
{
|
||||||
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
|
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_nodelist_class_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Dom_Element, getElementsByTagName)
|
PHP_METHOD(Dom_Element, getElementsByTagName)
|
||||||
{
|
{
|
||||||
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
|
dom_element_get_elements_by_tag_name(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_html_collection_class_entry);
|
||||||
}
|
}
|
||||||
/* }}} end dom_element_get_elements_by_tag_name */
|
/* }}} end dom_element_get_elements_by_tag_name */
|
||||||
|
|
||||||
@@ -1229,7 +1225,7 @@ PHP_METHOD(Dom_Element, setAttributeNodeNS)
|
|||||||
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagnamens
|
Modern spec URL: https://dom.spec.whatwg.org/#concept-getelementsbytagnamens
|
||||||
Since: DOM Level 2
|
Since: DOM Level 2
|
||||||
*/
|
*/
|
||||||
static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS, bool modern)
|
static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS, zend_class_entry *iter_ce)
|
||||||
{
|
{
|
||||||
dom_object *intern, *namednode;
|
dom_object *intern, *namednode;
|
||||||
zend_string *uri, *name;
|
zend_string *uri, *name;
|
||||||
@@ -1254,23 +1250,19 @@ static void dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAMETERS
|
|||||||
|
|
||||||
DOM_GET_THIS_INTERN(intern);
|
DOM_GET_THIS_INTERN(intern);
|
||||||
|
|
||||||
if (modern) {
|
object_init_ex(return_value, iter_ce);
|
||||||
php_dom_create_iterator(return_value, DOM_HTMLCOLLECTION, true);
|
|
||||||
} else {
|
|
||||||
php_dom_create_iterator(return_value, DOM_NODELIST, false);
|
|
||||||
}
|
|
||||||
namednode = Z_DOMOBJ_P(return_value);
|
namednode = Z_DOMOBJ_P(return_value);
|
||||||
dom_namednode_iter(intern, 0, namednode, NULL, name, uri);
|
dom_namednode_iter(intern, 0, namednode, NULL, name, uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(DOMElement, getElementsByTagNameNS)
|
PHP_METHOD(DOMElement, getElementsByTagNameNS)
|
||||||
{
|
{
|
||||||
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, false);
|
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_nodelist_class_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
PHP_METHOD(Dom_Element, getElementsByTagNameNS)
|
PHP_METHOD(Dom_Element, getElementsByTagNameNS)
|
||||||
{
|
{
|
||||||
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, true);
|
dom_element_get_elements_by_tag_name_ns(INTERNAL_FUNCTION_PARAM_PASSTHRU, dom_html_collection_class_entry);
|
||||||
}
|
}
|
||||||
/* }}} end dom_element_get_elements_by_tag_name_ns */
|
/* }}} end dom_element_get_elements_by_tag_name_ns */
|
||||||
|
|
||||||
|
|||||||
@@ -281,7 +281,7 @@ zend_result dom_node_child_nodes_read(dom_object *obj, zval *retval)
|
|||||||
{
|
{
|
||||||
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
|
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
|
||||||
|
|
||||||
php_dom_create_iterator(retval, DOM_NODELIST, php_dom_follow_spec_intern(obj));
|
object_init_ex(retval, dom_get_nodelist_ce(php_dom_follow_spec_intern(obj)));
|
||||||
dom_object *intern = Z_DOMOBJ_P(retval);
|
dom_object *intern = Z_DOMOBJ_P(retval);
|
||||||
dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
|
dom_namednode_iter(obj, XML_ELEMENT_NODE, intern, NULL, NULL, NULL);
|
||||||
|
|
||||||
@@ -415,7 +415,7 @@ zend_result dom_node_attributes_read(dom_object *obj, zval *retval)
|
|||||||
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
|
DOM_PROP_NODE(xmlNodePtr, nodep, obj);
|
||||||
|
|
||||||
if (nodep->type == XML_ELEMENT_NODE) {
|
if (nodep->type == XML_ELEMENT_NODE) {
|
||||||
php_dom_create_iterator(retval, DOM_NAMEDNODEMAP, php_dom_follow_spec_intern(obj));
|
object_init_ex(retval, dom_get_namednodemap_ce(php_dom_follow_spec_intern(obj)));
|
||||||
dom_object *intern = Z_DOMOBJ_P(retval);
|
dom_object *intern = Z_DOMOBJ_P(retval);
|
||||||
dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
|
dom_namednode_iter(obj, XML_ATTRIBUTE_NODE, intern, NULL, NULL, NULL);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -245,7 +245,7 @@ void dom_parent_node_query_selector_all(xmlNodePtr thisp, dom_object *intern, zv
|
|||||||
zend_array_destroy(list);
|
zend_array_destroy(list);
|
||||||
RETURN_THROWS();
|
RETURN_THROWS();
|
||||||
} else {
|
} else {
|
||||||
php_dom_create_iterator(return_value, DOM_NODELIST, true);
|
object_init_ex(return_value, dom_modern_nodelist_class_entry);
|
||||||
dom_object *ret_obj = Z_DOMOBJ_P(return_value);
|
dom_object *ret_obj = Z_DOMOBJ_P(return_value);
|
||||||
dom_nnodemap_object *mapptr = (dom_nnodemap_object *) ret_obj->ptr;
|
dom_nnodemap_object *mapptr = (dom_nnodemap_object *) ret_obj->ptr;
|
||||||
ZVAL_ARR(&mapptr->baseobj_zv, list);
|
ZVAL_ARR(&mapptr->baseobj_zv, list);
|
||||||
|
|||||||
@@ -1623,27 +1623,6 @@ zend_object *dom_nnodemap_objects_new(zend_class_entry *class_type)
|
|||||||
return &intern->std;
|
return &intern->std;
|
||||||
}
|
}
|
||||||
|
|
||||||
void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type, bool modern) /* {{{ */
|
|
||||||
{
|
|
||||||
zend_class_entry *ce;
|
|
||||||
|
|
||||||
if (iterator_type == DOM_NAMEDNODEMAP) {
|
|
||||||
ce = dom_get_namednodemap_ce(modern);
|
|
||||||
} else if (iterator_type == DOM_HTMLCOLLECTION) {
|
|
||||||
/* This only exists in modern DOM. */
|
|
||||||
ZEND_ASSERT(modern);
|
|
||||||
ce = dom_html_collection_class_entry;
|
|
||||||
} else if (iterator_type == DOM_DTD_NAMEDNODEMAP) {
|
|
||||||
ce = dom_get_dtd_namednodemap_ce(modern);
|
|
||||||
} else {
|
|
||||||
ZEND_ASSERT(iterator_type == DOM_NODELIST);
|
|
||||||
ce = dom_get_nodelist_ce(modern);
|
|
||||||
}
|
|
||||||
|
|
||||||
object_init_ex(return_value, ce);
|
|
||||||
}
|
|
||||||
/* }}} */
|
|
||||||
|
|
||||||
static zend_always_inline zend_class_entry *dom_get_element_ce(const xmlNode *node, bool modern)
|
static zend_always_inline zend_class_entry *dom_get_element_ce(const xmlNode *node, bool modern)
|
||||||
{
|
{
|
||||||
if (modern) {
|
if (modern) {
|
||||||
|
|||||||
@@ -109,13 +109,6 @@ typedef struct {
|
|||||||
dom_object dom;
|
dom_object dom;
|
||||||
} dom_object_namespace_node;
|
} dom_object_namespace_node;
|
||||||
|
|
||||||
typedef enum dom_iterator_type {
|
|
||||||
DOM_NODELIST,
|
|
||||||
DOM_NAMEDNODEMAP,
|
|
||||||
DOM_DTD_NAMEDNODEMAP,
|
|
||||||
DOM_HTMLCOLLECTION,
|
|
||||||
} dom_iterator_type;
|
|
||||||
|
|
||||||
struct php_dom_libxml_ns_mapper;
|
struct php_dom_libxml_ns_mapper;
|
||||||
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
|
typedef struct php_dom_libxml_ns_mapper php_dom_libxml_ns_mapper;
|
||||||
|
|
||||||
@@ -151,7 +144,6 @@ int dom_hierarchy(xmlNodePtr parent, xmlNodePtr child);
|
|||||||
bool dom_has_feature(zend_string *feature, zend_string *version);
|
bool dom_has_feature(zend_string *feature, zend_string *version);
|
||||||
bool dom_node_is_read_only(const xmlNode *node);
|
bool dom_node_is_read_only(const xmlNode *node);
|
||||||
bool dom_node_children_valid(const xmlNode *node);
|
bool dom_node_children_valid(const xmlNode *node);
|
||||||
void php_dom_create_iterator(zval *return_value, dom_iterator_type iterator_type, bool modern);
|
|
||||||
void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xmlHashTablePtr ht, zend_string *local, zend_string *ns);
|
void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xmlHashTablePtr ht, zend_string *local, zend_string *ns);
|
||||||
xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID);
|
xmlNodePtr create_notation(const xmlChar *name, const xmlChar *ExternalID, const xmlChar *SystemID);
|
||||||
xmlNode *php_dom_libxml_hash_iter(dom_nnodemap_object *objmap, int index);
|
xmlNode *php_dom_libxml_hash_iter(dom_nnodemap_object *objmap, int index);
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
#include "php_dom.h"
|
#include "php_dom.h"
|
||||||
#include "namespace_compat.h"
|
#include "namespace_compat.h"
|
||||||
#include "private_data.h"
|
#include "private_data.h"
|
||||||
|
#include "internal_helpers.h"
|
||||||
|
|
||||||
#define PHP_DOM_XPATH_QUERY 0
|
#define PHP_DOM_XPATH_QUERY 0
|
||||||
#define PHP_DOM_XPATH_EVALUATE 1
|
#define PHP_DOM_XPATH_EVALUATE 1
|
||||||
@@ -371,7 +372,7 @@ static void php_xpath_eval(INTERNAL_FUNCTION_PARAMETERS, int type, bool modern)
|
|||||||
} else {
|
} else {
|
||||||
ZVAL_EMPTY_ARRAY(&retval);
|
ZVAL_EMPTY_ARRAY(&retval);
|
||||||
}
|
}
|
||||||
php_dom_create_iterator(return_value, DOM_NODELIST, modern);
|
object_init_ex(return_value, dom_get_nodelist_ce(modern));
|
||||||
nodeobj = Z_DOMOBJ_P(return_value);
|
nodeobj = Z_DOMOBJ_P(return_value);
|
||||||
dom_xpath_iter(&retval, nodeobj);
|
dom_xpath_iter(&retval, nodeobj);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user