Skip to content

Commit 7cdc2d1

Browse files
committed
Shuffle code to ease writing clone handlers
1 parent 99d0a5c commit 7cdc2d1

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

Zend/zend_objects.c

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
/*

Zend/zend_objects.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
ZEND_API zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class_type TSRMLS_DC);
2828
ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handle handle TSRMLS_DC);
2929
ZEND_API zend_object *zend_objects_get_address(zval *object TSRMLS_DC);
30+
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);
3031
ZEND_API zend_object_value zend_objects_clone_obj(zval *object TSRMLS_DC);
3132

3233
#endif /* ZEND_OBJECTS_H */

0 commit comments

Comments
 (0)