Object cloning

From: Date: Wed, 16 Jul 2003 16:34:17 +0000
Subject: Object cloning
Groups: php.internals 
Request: Send a blank email to internals+get-3448@lists.php.net to get a copy of this message
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:helly@php.net

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 */
« previous php.internals (#3448) next »