From: Tjerk Meesters Date: Thu, 9 Oct 2014 15:32:19 +0000 (+0800) Subject: Merge branch 'PHP-5.6' X-Git-Tag: POST_NATIVE_TLS_MERGE^2~76^2~17 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0a50b250b2538c3640edb7d8ff07c85472823041;p=php Merge branch 'PHP-5.6' * PHP-5.6: Refactored DOMNodeList array dereferencing implementation Conflicts: ext/dom/nodelist.c ext/dom/php_dom.c --- 0a50b250b2538c3640edb7d8ff07c85472823041 diff --cc ext/dom/nodelist.c index 223960c5bc,1a0c811185..15071739d2 --- a/ext/dom/nodelist.c +++ b/ext/dom/nodelist.c @@@ -152,6 -111,10 +111,8 @@@ PHP_FUNCTION(dom_nodelist_item xmlNodePtr itemnode = NULL; dom_nnodemap_object *objmap; + xmlNodePtr nodep, curnode; + int count = 0; - HashTable *nodeht; - zval **entry; if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &id, dom_nodelist_class_entry, &index) == FAILURE) { return; @@@ -163,13 -126,17 +124,17 @@@ objmap = (dom_nnodemap_object *)intern->ptr; if (objmap != NULL) { if (objmap->ht) { - itemnode = dom_nodelist_xml_item(objmap, index); + if (objmap->nodetype == XML_ENTITY_NODE) { + itemnode = php_dom_libxml_hash_iter(objmap->ht, index); + } else { + itemnode = php_dom_libxml_notation_iter(objmap->ht, index); + } } else { if (objmap->nodetype == DOM_NODESET) { - nodeht = HASH_OF(objmap->baseobjptr); - if (zend_hash_index_find(nodeht, index, (void **) &entry)==SUCCESS) { - *return_value = **entry; - zval_copy_ctor(return_value); + HashTable *nodeht = HASH_OF(&objmap->baseobj_zv); + zval *entry = zend_hash_index_find(nodeht, index); + if (entry) { + ZVAL_COPY(return_value, entry); return; } } else if (objmap->baseobj) { diff --cc ext/dom/php_dom.c index cfe6b1232b,ead6983ec2..71c06612db --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@@ -1544,70 -1679,43 +1544,39 @@@ xmlNsPtr dom_get_nsdecl(xmlNode *node, } /* }}} 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 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 *rv, offset_copy; ++ 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; - MAKE_COPY_ZVAL(&offset, &offset_copy); ++ 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); - - Z_DELREF_P(rv); ++ 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; - MAKE_COPY_ZVAL(&member, &offset_copy); ++ 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); + - FREE_ZVAL(length); - + return ret; } /* }}} end dom_nodelist_has_dimension */ #endif /* HAVE_DOM */ diff --cc ext/dom/php_dom.h index 9f8023f67b,6f0d9b80c1..02eb2d9509 --- a/ext/dom/php_dom.h +++ b/ext/dom/php_dom.h @@@ -126,9 -123,8 +126,8 @@@ xmlNode *php_dom_libxml_hash_iter(xmlHa xmlNode *php_dom_libxml_notation_iter(xmlHashTable *ht, int index); zend_object_iterator *php_dom_get_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC); int dom_set_doc_classmap(php_libxml_ref_obj *document, zend_class_entry *basece, zend_class_entry *ce TSRMLS_DC); -zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC); +zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type, zval *rv TSRMLS_DC); int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty TSRMLS_DC); - static int dom_nodelist_fetch_dimension(xmlNodePtr *itemnode, zval *offset, dom_nnodemap_object *objmap, zval *rv TSRMLS_DC); #define REGISTER_DOM_CLASS(ce, name, parent_ce, funcs, entry) \ INIT_CLASS_ENTRY(ce, name, funcs); \