@@ -106,21 +106,8 @@ ZEND_API zend_object *zend_objects_get_address(zval *zobject TSRMLS_DC)
106106 return (zend_object * )zend_object_store_get_object (zobject TSRMLS_CC );
107107}
108108
109- ZEND_API zend_object_value zend_objects_clone_obj ( zval * zobject TSRMLS_DC )
109+ 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 )
110110{
111- zend_object_value retval ;
112- zend_object * old_object ;
113- zend_object * new_object ;
114- zend_object_handle handle = Z_OBJ_HANDLE_P (zobject );
115-
116- /* assume that create isn't overwritten, so when clone depends on the
117- * overwritten one then it must itself be overwritten */
118- old_object = zend_objects_get_address (zobject TSRMLS_CC );
119- retval = zend_objects_new (& new_object , old_object -> ce TSRMLS_CC );
120-
121- ALLOC_HASHTABLE (new_object -> properties );
122- zend_hash_init (new_object -> properties , 0 , NULL , ZVAL_PTR_DTOR , 0 );
123-
124111 if (old_object -> ce -> clone ) {
125112 zval * old_obj ;
126113 zval * new_obj ;
@@ -133,7 +120,7 @@ ZEND_API zend_object_value zend_objects_clone_obj(zval *zobject TSRMLS_DC)
133120
134121 MAKE_STD_ZVAL (new_obj );
135122 new_obj -> type = IS_OBJECT ;
136- new_obj -> value .obj = retval ;
123+ new_obj -> value .obj = new_obj_val ;
137124 zval_copy_ctor (new_obj );
138125
139126 MAKE_STD_ZVAL (old_obj );
@@ -160,8 +147,26 @@ ZEND_API zend_object_value zend_objects_clone_obj(zval *zobject TSRMLS_DC)
160147 } else {
161148 zend_hash_copy (new_object -> properties , old_object -> properties , (copy_ctor_func_t ) zval_add_ref , (void * ) NULL /* Not used anymore */ , sizeof (zval * ));
162149 }
150+ }
163151
164- return retval ;
152+ ZEND_API zend_object_value zend_objects_clone_obj (zval * zobject TSRMLS_DC )
153+ {
154+ zend_object_value new_obj_val ;
155+ zend_object * old_object ;
156+ zend_object * new_object ;
157+ zend_object_handle handle = Z_OBJ_HANDLE_P (zobject );
158+
159+ /* assume that create isn't overwritten, so when clone depends on the
160+ * overwritten one then it must itself be overwritten */
161+ old_object = zend_objects_get_address (zobject TSRMLS_CC );
162+ new_obj_val = zend_objects_new (& new_object , old_object -> ce TSRMLS_CC );
163+
164+ ALLOC_HASHTABLE (new_object -> properties );
165+ zend_hash_init (new_object -> properties , 0 , NULL , ZVAL_PTR_DTOR , 0 );
166+
167+ zend_objects_clone_members (new_object , new_obj_val , old_object , handle TSRMLS_CC );
168+
169+ return new_obj_val ;
165170}
166171
167172/*
0 commit comments