]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.6'
authorTjerk Meesters <datibbaw@php.net>
Thu, 9 Oct 2014 15:32:19 +0000 (23:32 +0800)
committerTjerk Meesters <datibbaw@php.net>
Thu, 9 Oct 2014 15:32:19 +0000 (23:32 +0800)
* PHP-5.6:
  Refactored DOMNodeList array dereferencing implementation

Conflicts:
ext/dom/nodelist.c
ext/dom/php_dom.c

1  2 
ext/dom/nodelist.c
ext/dom/php_dom.c
ext/dom/php_dom.h

index 223960c5bc078345f95d3ac0319fc5c8f989aef6,1a0c8111853bf880192c6626ed7fb26e84d1fcdf..15071739d212089568f57b9cb2b94c086ef1fe42
@@@ -152,6 -111,10 +111,8 @@@ PHP_FUNCTION(dom_nodelist_item
        xmlNodePtr itemnode = NULL;
  
        dom_nnodemap_object *objmap;
 -      HashTable *nodeht;
 -      zval **entry;
+       xmlNodePtr nodep, curnode;
+       int count = 0;
  
        if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", &id, dom_nodelist_class_entry, &index) == FAILURE) {
                return;
                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) {
index cfe6b1232bafbbc72d46efd62b4aa28d6cd3c2ef,ead6983ec2b25e646eb088f6ebae993cfdf6a551..71c06612db80e9f1d6f7cf1928bfac92d295bdb3
@@@ -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 */
index 9f8023f67bc1454617686445dd1ec4bfd1f6e4d6,6f0d9b80c1d776cf39e105fd8e4462117c38b0d7..02eb2d9509a0cab64a1acf576c1b691014f9c146
@@@ -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); \