rrichards Tue May 3 18:55:04 2005 EDT Modified files: /php-src/ext/dom php_dom.c Log: Fix bug #32930 (class extending DOMDocument doesn't clone properly) http://cvs.php.net/diff.php/php-src/ext/dom/php_dom.c?r1=1.69&r2=1.70&ty=u Index: php-src/ext/dom/php_dom.c diff -u php-src/ext/dom/php_dom.c:1.69 php-src/ext/dom/php_dom.c:1.70 --- php-src/ext/dom/php_dom.c:1.69 Thu Apr 21 17:11:23 2005 +++ php-src/ext/dom/php_dom.c Tue May 3 18:55:03 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_dom.c,v 1.69 2005/04/21 21:11:23 iliaa Exp $ */ +/* $Id: php_dom.c,v 1.70 2005/05/03 22:55:03 rrichards Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -361,6 +361,7 @@ zend_object_value retval; void *new_object; dom_object *intern; + dom_object *old_object; struct _store_object *obj; zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); @@ -377,6 +378,9 @@ intern->handle = retval.handle; retval.handlers = Z_OBJ_HT_P(zobject); + old_object = (dom_object *) obj->object; + zend_objects_clone_members(&intern->std, retval, &old_object->std, intern->handle TSRMLS_CC); + return retval; } @@ -885,7 +889,7 @@ } -static dom_object* dom_objects_set_class(zend_class_entry *class_type TSRMLS_DC) +static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool hash_copy TSRMLS_DC) { zend_class_entry *base_class; zval *tmp; @@ -908,7 +912,9 @@ ALLOC_HASHTABLE(intern->std.properties); zend_hash_init(intern->std.properties, 0, NULL, ZVAL_PTR_DTOR, 0); - zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + if (hash_copy) { + zend_hash_copy(intern->std.properties, &class_type->default_properties, (copy_ctor_func_t) zval_add_ref, (void *) &tmp, sizeof(zval *)); + } return intern; } @@ -921,7 +927,7 @@ xmlNodePtr node; xmlNodePtr cloned_node; - clone = dom_objects_set_class(intern->std.ce TSRMLS_CC); + clone = dom_objects_set_class(intern->std.ce, 0 TSRMLS_CC); if (instanceof_function(intern->std.ce, dom_node_class_entry TSRMLS_CC)) { node = (xmlNodePtr)dom_object_get_node((dom_object *) object); @@ -949,7 +955,7 @@ zend_object_value retval; dom_object *intern; - intern = dom_objects_set_class(class_type TSRMLS_CC); + intern = dom_objects_set_class(class_type, 1 TSRMLS_CC); retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t)dom_objects_free_storage, dom_objects_clone TSRMLS_CC); intern->handle = retval.handle; @@ -966,7 +972,7 @@ zend_object_value retval; dom_object *intern; - intern = dom_objects_set_class(class_type TSRMLS_CC); + intern = dom_objects_set_class(class_type, 1 TSRMLS_CC); retval.handle = zend_objects_store_put(intern, NULL, (zend_objects_free_object_storage_t)dom_xpath_objects_free_storage, dom_objects_clone TSRMLS_CC); intern->handle = retval.handle; @@ -1022,7 +1028,7 @@ dom_object *intern; dom_nnodemap_object *objmap; - intern = dom_objects_set_class(class_type TSRMLS_CC); + intern = dom_objects_set_class(class_type, 1 TSRMLS_CC); intern->ptr = emalloc(sizeof(dom_nnodemap_object)); objmap = (dom_nnodemap_object *)intern->ptr; objmap->baseobj = NULL;
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php