diff options
author | Dmitry Stogov <dmitry@php.net> | 2005-06-07 07:03:28 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2005-06-07 07:03:28 +0000 |
commit | 055e889bbd8a34512396d55577fa5a2c490b6a23 (patch) | |
tree | 75c5ee552528c85e779a065240eff6953315c375 /Zend/zend_objects.c | |
parent | 20d7e52a53f994a420653d017fb1063f5dc76fac (diff) | |
download | php-git-055e889bbd8a34512396d55577fa5a2c490b6a23.tar.gz |
Fixed bug #33243 (ze1_compatibility_mode does not work as expected)
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 30f6297c3d..e4081ecf50 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -111,9 +111,31 @@ ZEND_API zend_object *zend_objects_get_address(zval *zobject TSRMLS_DC) return (zend_object *)zend_object_store_get_object(zobject TSRMLS_CC); } +static void zval_add_ref_or_clone(zval **p) +{ + if (Z_TYPE_PP(p) == IS_OBJECT) { + if (Z_OBJ_HANDLER_PP(p, clone_obj) == NULL) { + zend_error(E_ERROR, "Trying to clone an uncloneable object of class %s", Z_OBJCE_PP(p)->name); + } else { + zval *orig = *p; + + ALLOC_ZVAL(*p); + **p = *orig; + INIT_PZVAL(*p); + (*p)->value.obj = Z_OBJ_HT_PP(p)->clone_obj(*p TSRMLS_CC); + } + } else { + (*p)->refcount++; + } +} + 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_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *)); + if (EG(ze1_compatibility_mode)) { + zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref_or_clone, (void *) NULL /* Not used anymore */, sizeof(zval *)); + } else { + zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *)); + } if (old_object->ce->clone) { zval *new_obj; |