diff options
author | Andi Gutmans <andi@php.net> | 2001-08-16 14:04:04 +0000 |
---|---|---|
committer | Andi Gutmans <andi@php.net> | 2001-08-16 14:04:04 +0000 |
commit | ea48c0c46acc1d7ca6e9fb5cc078f0393b4e63ac (patch) | |
tree | f927a3dd4705d0ecb3a53021ac02b0a393755388 /Zend/zend_objects.c | |
parent | 351048297185f37175170cf3ac970bac94f915da (diff) | |
download | php-git-ea48c0c46acc1d7ca6e9fb5cc078f0393b4e63ac.tar.gz |
- Fix a bug in method calls.
- Try to get the old copying behavior of objects to work (doesn't work yet).
Diffstat (limited to 'Zend/zend_objects.c')
-rw-r--r-- | Zend/zend_objects.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 38348df54c..8c82e3a31e 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -9,7 +9,8 @@ static zend_object_handlers zoh = { NULL, zend_objects_add_ref, zend_objects_del_ref, - zend_objects_delete_obj + zend_objects_delete_obj, + zend_objects_clone_obj }; void zend_objects_init(zend_objects *objects, zend_uint init_size) @@ -50,7 +51,7 @@ zend_object_value zend_objects_new(zend_object **object, zend_class_entry *class (*object)->ce = class_type; retval.handle = handle; - retval.handlers = zoh; + retval.handlers = &zoh; #if ZEND_DEBUG_OBJECTS fprintf(stderr, "Allocated object id #%d\n", handle); #endif @@ -125,3 +126,27 @@ void zend_objects_del_ref(zend_object_handle handle) } #endif } + +zend_object_value zend_objects_clone_obj(zend_object_handle handle) +{ + zend_object_value retval; + zend_object *old_object; + zend_object *new_object; + + TSRMLS_FETCH(); + + if (!EG(objects).object_buckets[handle].valid) { + zend_error(E_ERROR, "Trying to clone invalid object"); + } + + old_object = &EG(objects).object_buckets[handle].bucket.obj.object; + retval = zend_objects_new(&new_object, old_object->ce); + ALLOC_HASHTABLE(new_object->properties); + zend_hash_init(new_object->properties, 0, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_copy(new_object->properties, old_object->properties, (copy_ctor_func_t) zval_add_ref, (void *) NULL /* Not used anymore */, sizeof(zval *)); + +#if ZEND_DEBUG_OBJECTS + fprintf(stderr, "Allocated object id #%d\n", handle); +#endif + return retval; +} |