Hello Zeev & Andi,

  to simplify object cloning i would appreciate the attached patch.
With this patch it would be much easier to write clone handlers that inherit
the default behavior correctly and are also sitll capable of dealing with the
__clone() method.

  

-- 
Best regards,
 Marcus                          mailto:[EMAIL PROTECTED]
Index: Zend/zend_objects.c
===================================================================
RCS file: /repository/ZendEngine2/zend_objects.c,v
retrieving revision 1.34
diff -u -p -r1.34 zend_objects.c
--- Zend/zend_objects.c 2 Jul 2003 23:58:47 -0000       1.34
+++ Zend/zend_objects.c 16 Jul 2003 16:31:14 -0000
@@ -106,21 +106,8 @@ ZEND_API zend_object *zend_objects_get_a
        return (zend_object *)zend_object_store_get_object(zobject TSRMLS_CC);
 }
 
-ZEND_API zend_object_value zend_objects_clone_obj(zval *zobject TSRMLS_DC)
+ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object_value 
new_obj_val, zend_object *old_object, zend_object_handle handle TSRMLS_DC)
 {
-       zend_object_value retval;
-       zend_object *old_object;
-       zend_object *new_object;
-       zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
-
-       /* assume that create isn't overwritten, so when clone depends on the 
-        * overwritten one then it must itself be overwritten */
-       old_object = zend_objects_get_address(zobject TSRMLS_CC);
-       retval = zend_objects_new(&new_object, old_object->ce TSRMLS_CC);
-
-       ALLOC_HASHTABLE(new_object->properties);
-       zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0);
-
        if (old_object->ce->clone) {
                zval *old_obj;
                zval *new_obj;
@@ -133,7 +120,7 @@ ZEND_API zend_object_value zend_objects_
 
                MAKE_STD_ZVAL(new_obj);
                new_obj->type = IS_OBJECT;
-               new_obj->value.obj = retval;
+               new_obj->value.obj = new_obj_val;
                zval_copy_ctor(new_obj);
 
                MAKE_STD_ZVAL(old_obj);
@@ -160,8 +147,26 @@ ZEND_API zend_object_value zend_objects_
        } else {
                zend_hash_copy(new_object->properties, old_object->properties, 
(copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *));
        }
+}
+
+ZEND_API zend_object_value zend_objects_clone_obj(zval *zobject TSRMLS_DC)
+{
+       zend_object_value new_obj_val;
+       zend_object *old_object;
+       zend_object *new_object;
+       zend_object_handle handle = Z_OBJ_HANDLE_P(zobject);
+
+       /* assume that create isn't overwritten, so when clone depends on the 
+        * overwritten one then it must itself be overwritten */
+       old_object = zend_objects_get_address(zobject TSRMLS_CC);
+       new_obj_val = zend_objects_new(&new_object, old_object->ce TSRMLS_CC);
+
+       ALLOC_HASHTABLE(new_object->properties);
+       zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0);
+
+       zend_objects_clone_members(new_object, new_obj_val, old_object, handle 
TSRMLS_CC);
 
-       return retval;
+       return new_obj_val;
 }
 
 /*
Index: Zend/zend_objects.h
===================================================================
RCS file: /repository/ZendEngine2/zend_objects.h,v
retrieving revision 1.18
diff -u -p -r1.18 zend_objects.h
--- Zend/zend_objects.h 10 Jun 2003 20:03:25 -0000      1.18
+++ Zend/zend_objects.h 16 Jul 2003 16:31:14 -0000
@@ -27,6 +27,7 @@
 ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_entry 
*class_type TSRMLS_DC);
 ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handle 
handle TSRMLS_DC);
 ZEND_API zend_object *zend_objects_get_address(zval *object TSRMLS_DC);
+ZEND_API void zend_objects_clone_members(zend_object *new_object, zend_object_value 
new_obj_val, zend_object *old_object, zend_object_handle handle TSRMLS_DC);
 ZEND_API zend_object_value zend_objects_clone_obj(zval *object TSRMLS_DC);
 
 #endif /* ZEND_OBJECTS_H */
-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to