diff options
author | Tjerk Meesters <datibbaw@php.net> | 2014-10-09 23:32:19 +0800 |
---|---|---|
committer | Tjerk Meesters <datibbaw@php.net> | 2014-10-09 23:32:19 +0800 |
commit | 0a50b250b2538c3640edb7d8ff07c85472823041 (patch) | |
tree | 663b25da2f5643d7d75c49a032aab0398d6dd4bf /ext/dom/php_dom.c | |
parent | 2f099478a3c5509e4063002b3256bde380739e3d (diff) | |
parent | 59f39dea66f8de4de240eb01b4553644fdc5b8bd (diff) | |
download | php-git-0a50b250b2538c3640edb7d8ff07c85472823041.tar.gz |
Merge branch 'PHP-5.6'
* PHP-5.6:
Refactored DOMNodeList array dereferencing implementation
Conflicts:
ext/dom/nodelist.c
ext/dom/php_dom.c
Diffstat (limited to 'ext/dom/php_dom.c')
-rw-r--r-- | ext/dom/php_dom.c | 71 |
1 files changed, 20 insertions, 51 deletions
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index cfe6b1232b..71c06612db 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -1544,70 +1544,39 @@ 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) /* {{{ */ +zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type, zval *rv TSRMLS_DC) /* {{{ */ { - long index = zval_get_long(offset); - HashTable *nodeht; - int ret = 0; - - if (objmap->ht) { - *itemnode = dom_nodelist_xml_item(objmap, index); - } else { - if (objmap->nodetype == DOM_NODESET) { - nodeht = HASH_OF(&objmap->baseobj_zv); - zval *entry = zend_hash_index_find(nodeht, index); - if (entry) { - if (itemnode != NULL && rv != NULL) { - /* Passed by read_dimension */ - ZVAL_COPY(rv, entry); - } - 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); - } - } - } + zval offset_copy; - if (rv != NULL && itemnode != NULL) { - if (*itemnode) { - ret = 1; - } + if (!offset) { + return NULL; } - return ret; -} /* }}} end dom_nodelist_fetch_dimension */ - -zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type, zval *rv TSRMLS_DC) /* {{{ */ -{ - dom_object *intern = Z_DOMOBJ_P(object); - xmlNodePtr itemnode = NULL; - dom_nnodemap_object *objmap = (dom_nnodemap_object *)intern->ptr; + ZVAL_COPY(&offset_copy, offset); + convert_to_long(&offset_copy); - if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC)) { - if (itemnode) { - php_dom_create_object(itemnode, rv, objmap->baseobj TSRMLS_CC); - } - } + zend_call_method_with_1_params(object, Z_OBJCE_P(object), NULL, "item", rv, &offset_copy); return rv; } /* }}} end dom_nodelist_read_dimension */ 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 = Z_DOMOBJ_P(object); - objmap = (dom_nnodemap_object *)intern->ptr; + ZVAL_COPY(&offset_copy, member); + 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); + + return ret; } /* }}} end dom_nodelist_has_dimension */ #endif /* HAVE_DOM */ |