rrichards Tue Feb 17 06:13:48 2004 EDT
Modified files:
/php-src/ext/dom dom_iterators.c namednodemap.c node.c nodelist.c
php_dom.c xpath.c
Log:
implement clone functionality to fix segfault
DomNode->clone() creates new doc proxy if document is cloned
remove printf from xpath
fix remaining invalid object state issues
http://cvs.php.net/diff.php/php-src/ext/dom/dom_iterators.c?r1=1.6&r2=1.7&ty=u
Index: php-src/ext/dom/dom_iterators.c
diff -u php-src/ext/dom/dom_iterators.c:1.6 php-src/ext/dom/dom_iterators.c:1.7
--- php-src/ext/dom/dom_iterators.c:1.6 Tue Jan 20 06:35:32 2004
+++ php-src/ext/dom/dom_iterators.c Tue Feb 17 06:13:47 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dom_iterators.c,v 1.6 2004/01/20 11:35:32 rrichards Exp $ */
+/* $Id: dom_iterators.c,v 1.7 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -268,33 +268,35 @@
intern = (dom_object *)zend_object_store_get_object(object TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (objmap->ht == NULL) {
- if (objmap->nodetype == DOM_NODESET) {
- nodeht = HASH_OF(objmap->baseobjptr);
- zend_hash_internal_pointer_reset(nodeht);
- if (zend_hash_get_current_data(nodeht, (void **)
&entry)==SUCCESS) {
- curattr = *entry;
- curattr->refcount++;
- }
- } else {
- nodep = (xmlNode *)dom_object_get_node(objmap->baseobj);
- if (objmap->nodetype == XML_ATTRIBUTE_NODE || objmap->nodetype
== XML_ELEMENT_NODE) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
- curnode = (xmlNodePtr) nodep->properties;
- } else {
- curnode = (xmlNodePtr) nodep->children;
+ if (objmap != NULL) {
+ if (objmap->ht == NULL) {
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ zend_hash_internal_pointer_reset(nodeht);
+ if (zend_hash_get_current_data(nodeht, (void **)
&entry)==SUCCESS) {
+ curattr = *entry;
+ curattr->refcount++;
}
} else {
- if (nodep->type == XML_DOCUMENT_NODE || nodep->type ==
XML_HTML_DOCUMENT_NODE) {
- nodep = xmlDocGetRootElement((xmlDoc *) nodep);
+ nodep = (xmlNode
*)dom_object_get_node(objmap->baseobj);
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE) {
+ curnode = (xmlNodePtr)
nodep->properties;
+ } else {
+ curnode = (xmlNodePtr) nodep->children;
+ }
} else {
- nodep = nodep->children;
+ if (nodep->type == XML_DOCUMENT_NODE ||
nodep->type == XML_HTML_DOCUMENT_NODE) {
+ nodep = xmlDocGetRootElement((xmlDoc
*) nodep);
+ } else {
+ nodep = nodep->children;
+ }
+ curnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &curindex, 0);
}
- curnode = dom_get_elements_by_tag_name_ns_raw(nodep,
objmap->ns, objmap->local, &curindex, 0);
}
+ } else {
+ curnode = php_dom_libxml_hash_iter(objmap->ht, 0);
}
- } else {
- curnode = php_dom_libxml_hash_iter(objmap->ht, 0);
}
if (curnode) {
http://cvs.php.net/diff.php/php-src/ext/dom/namednodemap.c?r1=1.8&r2=1.9&ty=u
Index: php-src/ext/dom/namednodemap.c
diff -u php-src/ext/dom/namednodemap.c:1.8 php-src/ext/dom/namednodemap.c:1.9
--- php-src/ext/dom/namednodemap.c:1.8 Thu Jan 22 16:16:05 2004
+++ php-src/ext/dom/namednodemap.c Tue Feb 17 06:13:47 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: namednodemap.c,v 1.8 2004/01/22 21:16:05 rrichards Exp $ */
+/* $Id: namednodemap.c,v 1.9 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -61,17 +61,20 @@
int count = 0;
objmap = (dom_nnodemap_object *)obj->ptr;
- if (objmap->ht) {
- count = xmlHashSize(objmap->ht);
- } else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- curnode = nodep->properties;
- if (curnode) {
- count++;
- while (curnode->next != NULL) {
+
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ count = xmlHashSize(objmap->ht);
+ } else {
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ curnode = nodep->properties;
+ if (curnode) {
count++;
- curnode = curnode->next;
+ while (curnode->next != NULL) {
+ count++;
+ curnode = curnode->next;
+ }
}
}
}
@@ -110,17 +113,20 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (objmap->ht) {
- if (objmap->nodetype == XML_ENTITY_NODE) {
- itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named);
+
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ if (objmap->nodetype == XML_ENTITY_NODE) {
+ itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht,
named);
+ } else {
+ notep = (xmlNotation *)xmlHashLookup(objmap->ht,
named);
+ itemnode = create_notation(notep->name,
notep->PublicID, notep->SystemID);
+ }
} else {
- notep = (xmlNotation *)xmlHashLookup(objmap->ht, named);
- itemnode = create_notation(notep->name, notep->PublicID,
notep->SystemID);
- }
- } else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- itemnode = (xmlNodePtr)xmlHasProp(nodep, named);
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ itemnode = (xmlNodePtr)xmlHasProp(nodep, named);
+ }
}
}
@@ -178,26 +184,27 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (objmap->ht) {
- if (objmap->nodetype == XML_ENTITY_NODE) {
- itemnode = php_dom_libxml_hash_iter(objmap->ht, index);
+
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ 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 {
- itemnode = php_dom_libxml_notation_iter(objmap->ht,
index);
- }
- } else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- curnode = (xmlNodePtr)nodep->properties;
- count = 0;
- while (count < index && curnode != NULL) {
- count++;
- curnode = (xmlNodePtr)curnode->next;
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ curnode = (xmlNodePtr)nodep->properties;
+ count = 0;
+ while (count < index && curnode != NULL) {
+ count++;
+ curnode = (xmlNodePtr)curnode->next;
+ }
+ itemnode = curnode;
}
- itemnode = curnode;
}
}
- } else {
- RETURN_NULL();
}
if (itemnode) {
@@ -232,17 +239,20 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (objmap->ht) {
- if (objmap->nodetype == XML_ENTITY_NODE) {
- itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht, named);
+
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ if (objmap->nodetype == XML_ENTITY_NODE) {
+ itemnode = (xmlNodePtr)xmlHashLookup(objmap->ht,
named);
+ } else {
+ notep = (xmlNotation *)xmlHashLookup(objmap->ht,
named);
+ itemnode = create_notation(notep->name,
notep->PublicID, notep->SystemID);
+ }
} else {
- notep = (xmlNotation *)xmlHashLookup(objmap->ht, named);
- itemnode = create_notation(notep->name, notep->PublicID,
notep->SystemID);
- }
- } else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- itemnode = (xmlNodePtr)xmlHasNsProp(nodep, named, uri);
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ itemnode = (xmlNodePtr)xmlHasNsProp(nodep, named, uri);
+ }
}
}
http://cvs.php.net/diff.php/php-src/ext/dom/node.c?r1=1.24&r2=1.25&ty=u
Index: php-src/ext/dom/node.c
diff -u php-src/ext/dom/node.c:1.24 php-src/ext/dom/node.c:1.25
--- php-src/ext/dom/node.c:1.24 Mon Feb 16 08:06:33 2004
+++ php-src/ext/dom/node.c Tue Feb 17 06:13:47 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: node.c,v 1.24 2004/02/16 13:06:33 rrichards Exp $ */
+/* $Id: node.c,v 1.25 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1291,9 +1291,13 @@
node = xmlDocCopyNode(n, n->doc, recursive);
+ if (!node) {
+ RETURN_FALSE;
+ }
+
/* When deep is false Element nodes still require the attributes
Following taken from libxml as xmlDocCopyNode doesnt do this */
- if (node && n->type == XML_ELEMENT_NODE && recursive == 0) {
+ if (n->type == XML_ELEMENT_NODE && recursive == 0) {
if (n->nsDef != NULL) {
node->nsDef = xmlCopyNamespaceList(n->nsDef);
}
@@ -1319,8 +1323,9 @@
}
}
- if (!node) {
- RETURN_FALSE;
+ /* If document cloned we want a new document proxy */
+ if (node->doc != n->doc) {
+ intern = NULL;
}
DOM_RET_OBJ(rv, node, &ret, intern);
http://cvs.php.net/diff.php/php-src/ext/dom/nodelist.c?r1=1.10&r2=1.11&ty=u
Index: php-src/ext/dom/nodelist.c
diff -u php-src/ext/dom/nodelist.c:1.10 php-src/ext/dom/nodelist.c:1.11
--- php-src/ext/dom/nodelist.c:1.10 Thu Jan 22 16:16:05 2004
+++ php-src/ext/dom/nodelist.c Tue Feb 17 06:13:47 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: nodelist.c,v 1.10 2004/01/22 21:16:05 rrichards Exp $ */
+/* $Id: nodelist.c,v 1.11 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -55,31 +55,33 @@
HashTable *nodeht;
objmap = (dom_nnodemap_object *)obj->ptr;
- if (objmap->ht) {
- count = xmlHashSize(objmap->ht);
- } else {
- if (objmap->nodetype == DOM_NODESET) {
- nodeht = HASH_OF(objmap->baseobjptr);
- count = zend_hash_num_elements(nodeht);
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ count = xmlHashSize(objmap->ht);
} else {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
- curnode = nodep->children;
- if (curnode) {
- count++;
- while (curnode->next != NULL) {
+ if (objmap->nodetype == DOM_NODESET) {
+ nodeht = HASH_OF(objmap->baseobjptr);
+ count = zend_hash_num_elements(nodeht);
+ } else {
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
+ curnode = nodep->children;
+ if (curnode) {
count++;
- curnode = curnode->next;
+ while (curnode->next != NULL) {
+ count++;
+ curnode =
curnode->next;
+ }
}
- }
- } else {
- if (nodep->type == XML_DOCUMENT_NODE ||
nodep->type == XML_HTML_DOCUMENT_NODE) {
- nodep = xmlDocGetRootElement((xmlDoc
*) nodep);
} else {
- nodep = nodep->children;
+ if (nodep->type == XML_DOCUMENT_NODE
|| nodep->type == XML_HTML_DOCUMENT_NODE) {
+ nodep =
xmlDocGetRootElement((xmlDoc *) nodep);
+ } else {
+ nodep = nodep->children;
+ }
+ curnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1);
}
- curnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, -1);
}
}
}
@@ -118,43 +120,43 @@
intern = (dom_object *)zend_object_store_get_object(id TSRMLS_CC);
objmap = (dom_nnodemap_object *)intern->ptr;
- if (objmap->ht) {
- 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);
- return;
+ if (objmap != NULL) {
+ if (objmap->ht) {
+ 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 {
- nodep = dom_object_get_node(objmap->baseobj);
- if (nodep) {
- if (objmap->nodetype == XML_ATTRIBUTE_NODE ||
objmap->nodetype == XML_ELEMENT_NODE) {
- curnode = nodep->children;
- while (count < index && curnode !=
NULL) {
- count++;
- curnode = curnode->next;
- }
- itemnode = curnode;
- } else {
- if (nodep->type == XML_DOCUMENT_NODE
|| nodep->type == XML_HTML_DOCUMENT_NODE) {
- nodep =
xmlDocGetRootElement((xmlDoc *) nodep);
+ 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);
+ return;
+ }
+ } else {
+ nodep = dom_object_get_node(objmap->baseobj);
+ if (nodep) {
+ if (objmap->nodetype ==
XML_ATTRIBUTE_NODE || objmap->nodetype == XML_ELEMENT_NODE) {
+ curnode = nodep->children;
+ while (count < index &&
curnode != NULL) {
+ count++;
+ curnode =
curnode->next;
+ }
+ itemnode = curnode;
} else {
- nodep = nodep->children;
+ if (nodep->type ==
XML_DOCUMENT_NODE || nodep->type == XML_HTML_DOCUMENT_NODE) {
+ nodep =
xmlDocGetRootElement((xmlDoc *) nodep);
+ } else {
+ nodep =
nodep->children;
+ }
+ itemnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index);
}
- itemnode =
dom_get_elements_by_tag_name_ns_raw(nodep, objmap->ns, objmap->local, &count, index);
}
}
}
}
- } else {
- RETURN_NULL();
}
if (itemnode) {
http://cvs.php.net/diff.php/php-src/ext/dom/php_dom.c?r1=1.52&r2=1.53&ty=u
Index: php-src/ext/dom/php_dom.c
diff -u php-src/ext/dom/php_dom.c:1.52 php-src/ext/dom/php_dom.c:1.53
--- php-src/ext/dom/php_dom.c:1.52 Sun Feb 15 12:07:34 2004
+++ php-src/ext/dom/php_dom.c Tue Feb 17 06:13:47 2004
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_dom.c,v 1.52 2004/02/15 17:07:34 rrichards Exp $ */
+/* $Id: php_dom.c,v 1.53 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -338,6 +338,7 @@
dom_object_handlers.read_property = dom_read_property;
dom_object_handlers.write_property = dom_write_property;
dom_object_handlers.get_property_ptr_ptr = NULL;
+ dom_object_handlers.clone_obj = zend_objects_store_clone_obj;
zend_hash_init(&classes, 0, NULL, NULL, 1);
@@ -720,13 +721,6 @@
}
/* }}} end node_list_unlink */
-/* {{{ dom_objects_clone */
-void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
-{
- /* TODO */
-}
-/* }}} */
-
#if defined(LIBXML_XPATH_ENABLED)
/* {{{ dom_xpath_objects_free_storage */
void dom_xpath_objects_free_storage(void *object TSRMLS_DC)
@@ -821,6 +815,36 @@
return intern;
}
+/* {{{ dom_objects_clone */
+void dom_objects_clone(void *object, void **object_clone TSRMLS_DC)
+{
+ dom_object *intern = (dom_object *) object;
+ dom_object *clone;
+ xmlNodePtr node;
+ xmlNodePtr cloned_node;
+
+ clone = dom_objects_set_class(intern->std.ce TSRMLS_CC);
+
+ if (instanceof_function(intern->std.ce, dom_node_class_entry TSRMLS_CC)) {
+ node = (xmlNodePtr)dom_object_get_node((dom_object *) object);
+ if (node != NULL) {
+ cloned_node = xmlDocCopyNode(node, node->doc, 1);
+ if (cloned_node != NULL) {
+ /* If we cloned a document then we must create new doc
proxy */
+ if (cloned_node->doc == node->doc) {
+ clone->document = intern->document;
+ }
+ php_libxml_increment_doc_ref((php_libxml_node_object
*)clone, cloned_node->doc TSRMLS_CC);
+ php_libxml_increment_node_ptr((php_libxml_node_object
*)clone, cloned_node, NULL TSRMLS_CC);
+ }
+
+ }
+ }
+
+ *object_clone = (void *) clone;
+}
+/* }}} */
+
/* {{{ dom_objects_new */
zend_object_value dom_objects_new(zend_class_entry *class_type TSRMLS_DC)
{
http://cvs.php.net/diff.php/php-src/ext/dom/xpath.c?r1=1.16&r2=1.17&ty=u
Index: php-src/ext/dom/xpath.c
diff -u php-src/ext/dom/xpath.c:1.16 php-src/ext/dom/xpath.c:1.17
--- php-src/ext/dom/xpath.c:1.16 Sun Feb 15 05:54:37 2004
+++ php-src/ext/dom/xpath.c Tue Feb 17 06:13:47 2004
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: xpath.c,v 1.16 2004/02/15 10:54:37 rrichards Exp $ */
+/* $Id: xpath.c,v 1.17 2004/02/17 11:13:47 rrichards Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -85,8 +85,6 @@
if (ctx) {
docp = (xmlDocPtr) ctx->doc;
- } else {
- printf("NONE");
}
ALLOC_ZVAL(*retval);
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php