Skip to content

Instantly share code, notes, and snippets.

@datibbaw
Last active August 29, 2015 14:07
Show Gist options
  • Save datibbaw/0abee3137865be480444 to your computer and use it in GitHub Desktop.
Save datibbaw/0abee3137865be480444 to your computer and use it in GitHub Desktop.
diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c
index 01a0a6c..d8167ad 100644
--- a/ext/dom/php_dom.c
+++ b/ext/dom/php_dom.c
@@ -1681,43 +1681,42 @@ xmlNsPtr dom_get_nsdecl(xmlNode *node, xmlChar *localName) {
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);
+ long index;
+ zval offset_copy;
HashTable *nodeht;
zval **entry;
- int ret = 0;
+ xmlNodePtr tmp = NULL;
+
+ convert_to_long_copy(offset, offset_copy);
+ index = Z_LVAL_P(offset);
+ if (offset == &offset_copy) {
+ zval_dtor(offset);
+ }
if (objmap->ht) {
- *itemnode = dom_nodelist_xml_item(objmap, index);
+ tmp = 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) {
+ if (zend_hash_index_find(nodeht, index, (void **)&entry) == SUCCESS) {
+ if (itemnode && rv) {
/* Passed by read_dimension */
MAKE_COPY_ZVAL(entry, rv);
+ *itemnode = NULL;
}
- ret = 1;
+ return SUCCESS;
}
} 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);
- }
+ tmp = dom_nodelist_baseobj_item(objmap, index);
}
}
- if (rv != NULL && itemnode != NULL) {
- if (*itemnode) {
- ret = 1;
- }
+ if (itemnode) {
+ *itemnode = tmp;
}
- return ret;
+ return tmp ? SUCCESS : FAILURE;
} /* }}} end dom_nodelist_fetch_dimension */
zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC) /* {{{ */
@@ -1728,13 +1727,17 @@ zval *dom_nodelist_read_dimension(zval *object, zval *offset, int type TSRMLS_DC
zval *rv;
int found;
+ if (!offset) {
+ return NULL;
+ }
+
ALLOC_INIT_ZVAL(rv);
intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC)) {
+ if (dom_nodelist_fetch_dimension(&itemnode, offset, objmap, rv TSRMLS_CC) == SUCCESS) {
if (itemnode) {
php_dom_create_object(itemnode, &found, rv, objmap->baseobj TSRMLS_CC);
}
@@ -1753,7 +1756,7 @@ int dom_nodelist_has_dimension(zval *object, zval *member, int check_empty TSRML
intern = (dom_object *) zend_object_store_get_object(object TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- return dom_nodelist_fetch_dimension(NULL, member, objmap, NULL TSRMLS_CC);
+ return dom_nodelist_fetch_dimension(NULL, member, objmap, NULL TSRMLS_CC) == SUCCESS ? 1 : 0;
} /* }}} end dom_nodelist_has_dimension */
#endif /* HAVE_DOM */
diff --git a/ext/dom/php_dom.h b/ext/dom/php_dom.h
index eb35aa0..d6a1729 100644
--- a/ext/dom/php_dom.h
+++ b/ext/dom/php_dom.h
@@ -151,11 +151,9 @@ entry = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC);
#define convert_to_copy_master(orig, copy, lower_type, upper_type) \
if (Z_TYPE_P(orig) != IS_##upper_type) { \
- if (Z_REFCOUNT_P(orig) > 1) { \
- copy = *orig; \
- zval_copy_ctor(&copy); \
- orig = © \
- } \
+ copy = *orig; \
+ zval_copy_ctor(&copy); \
+ orig = © \
convert_to_##lower_type(orig); \
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment