summaryrefslogtreecommitdiff
path: root/Zend/zend_objects.c
diff options
context:
space:
mode:
authorMark A. Hershberger <mah@debian.(none)>2009-03-25 00:34:37 -0400
committerMark A. Hershberger <mah@debian.(none)>2009-03-25 00:34:37 -0400
commit10f5b47dc7c1cf2b9a00991629f43652710322d3 (patch)
tree3b727a16f652b8042d573e90f003868ffb3b56c7 /Zend/zend_objects.c
parent0e920280a2e04b110827bb766b9f29e3d581c4ee (diff)
downloadphp-upstream/5.0.5.tar.gz
Imported Upstream version 5.0.5upstream/5.0.5
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r--Zend/zend_objects.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c
index 2c920b378..fb80df3c3 100644
--- a/Zend/zend_objects.c
+++ b/Zend/zend_objects.c
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_objects.c,v 1.47.2.1 2004/09/06 19:16:35 helly Exp $ */
+/* $Id: zend_objects.c,v 1.47.2.4 2005/08/04 08:46:53 dmitry Exp $ */
#include "zend.h"
#include "zend_globals.h"
@@ -111,9 +111,33 @@ 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 && !PZVAL_IS_REF(*p)) {
+ TSRMLS_FETCH();
+
+ 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(orig 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;
zval *clone_func_name;