rrichards               Tue May  3 18:55:45 2005 EDT

  Modified files:              (Branch: PHP_5_0)
    /php-src/ext/dom    php_dom.c 
  Log:
  MFH: 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.60.2.6&r2=1.60.2.7&ty=u
Index: php-src/ext/dom/php_dom.c
diff -u php-src/ext/dom/php_dom.c:1.60.2.6 php-src/ext/dom/php_dom.c:1.60.2.7
--- php-src/ext/dom/php_dom.c:1.60.2.6  Wed Feb  9 06:47:12 2005
+++ php-src/ext/dom/php_dom.c   Tue May  3 18:55:45 2005
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_dom.c,v 1.60.2.6 2005/02/09 11:47:12 rrichards Exp $ */
+/* $Id: php_dom.c,v 1.60.2.7 2005/05/03 22:55:45 rrichards Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -360,6 +360,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);
 
@@ -376,6 +377,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;
 }
 
@@ -882,7 +886,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;
@@ -905,7 +909,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;
 }
@@ -918,7 +924,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);
@@ -946,7 +952,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;
@@ -963,7 +969,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;
@@ -1019,7 +1025,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

Reply via email to