summaryrefslogtreecommitdiff
path: root/ext/dom/php_dom.c
diff options
context:
space:
mode:
authorTjerk Meesters <datibbaw@php.net>2014-10-09 23:07:12 +0800
committerTjerk Meesters <datibbaw@php.net>2014-10-09 23:07:12 +0800
commit59f39dea66f8de4de240eb01b4553644fdc5b8bd (patch)
tree77611cd8a3cd8ff844347690552d2aa197131d4f /ext/dom/php_dom.c
parent72bd28a5da7bd6e9accfc6442a970a3064b8f76d (diff)
downloadphp-git-59f39dea66f8de4de240eb01b4553644fdc5b8bd.tar.gz
Refactored DOMNodeList array dereferencing implementation
Diffstat (limited to 'ext/dom/php_dom.c')
-rw-r--r--ext/dom/php_dom.c82
1 files changed, 22 insertions, 60 deletions
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 01a0a6c6bb..ead6983ec2 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -1679,66 +1679,18 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
}
/* }}} end dom_get_nsdecl */
-static int dom_nodelist_fetch_dimension(xmlNodePtr *itemnode, zval *offset, dom_nnodemap_object *objmap, zval *rv TSRMLS_DC) /* {{{ */
-{
- convert_to_long(offset);
- long index = Z_LVAL_P(offset);
- HashTable *nodeht;
- zval **entry;
- int ret = 0;
-
- if (objmap->ht) {
- *itemnode = dom_nodelist_xml_item(objmap, index);
- } else {
- if (objmap->nodetype == DOM_NODESET) {
- nodeht = HASH_OF(objmap->baseobjptr);
- if (zend_hash_index_find(nodeht, index, (void **) &entry) == SUCCESS) {
- if (itemnode != NULL && rv != NULL) {
- /* Passed by read_dimension */
- MAKE_COPY_ZVAL(entry, rv);
- }
- ret = 1;
- }
- } else if (objmap->baseobj) {
- if (itemnode == NULL && rv == NULL) {
- /* Passed by has_dimension */
- if (dom_nodelist_baseobj_item(objmap, index)) {
- ret = 1;
- }
- } else {
- *itemnode = dom_nodelist_baseobj_item(objmap, index);
- }
- }
- }
-
- if (rv != NULL && itemnode != NULL) {
- if (*itemnode) {
- ret = 1;
- }
- }
-
- return ret;
-} /* }}} end dom_nodelist_fetch_dimension */
-
zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) /* {{{ */
{
- dom_object *intern;
- xmlNodePtr itemnode = NULL;
- dom_nnodemap_object *objmap;
- zval *rv;
- int found;
+ zval *rv, offset_copy;
- ALLOC_INIT_ZVAL(rv);
-
- intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC);
+ if (!offset) {
+ return NULL;
+ }
- objmap = (dom_nnodemap_object *)intern->ptr;
+ MAKE_COPY_ZVAL(&offset, &offset_copy);
+ convert_to_long(&offset_copy);
- if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC)) {
- if (itemnode) {
- php_dom_create_object(itemnode, &found, rv, objmap->baseobj TSRMLS_CC);
- }
- }
+ zend_call_method_with_1_params(&object, Z_OBJCE_P(object), NULL, "item", &rv, &offset_copy);
Z_DELREF_P(rv);
@@ -1747,13 +1699,23 @@ zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC
int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty TSRMLS_DC)
{
- dom_object *intern;
- dom_nnodemap_object *objmap;
+ zval *length, offset_copy;
+ int ret;
- intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC);
- objmap = (dom_nnodemap_object *)intern->ptr;
+ MAKE_COPY_ZVAL(&member, &offset_copy);
+ convert_to_long(&offset_copy);
+
+ if (Z_LVAL(offset_copy) < 0) {
+ return 0;
+ }
- return dom_nodelist_fetch_dimension(NULL, member, objmap, NULL TSRMLS_CC);
+ length = zend_read_property(Z_OBJCE_P(object), object, "length", sizeof("length") - 1, 0 TSRMLS_CC);
+
+ ret = Z_LVAL(offset_copy) < Z_LVAL_P(length);
+
+ FREE_ZVAL(length);
+
+ return ret;
} /* }}} end dom_nodelist_has_dimension */
#endif /* HAVE_DOM */