diff options
author | Dmitry Stogov <dmitry@php.net> | 2010-10-04 07:15:30 +0000 |
---|---|---|
committer | Dmitry Stogov <dmitry@php.net> | 2010-10-04 07:15:30 +0000 |
commit | e8c87c6d21670ced24b98a31a5b81dff6a526ef2 (patch) | |
tree | eda9960a2941fa7c01b775385415514b0c0921a7 /Zend/zend_objects_API.c | |
parent | e1aa908468171956caa3726dde316adf0f7b0cd9 (diff) | |
download | php-git-e8c87c6d21670ced24b98a31a5b81dff6a526ef2.tar.gz |
- Fixed bug #52773 (Proxy objects have an inadequate destroy_object store callback)
- Fixed bug #52774 (Proxy object's store free callback calls zval_ptor_dtor on already freed data)
Diffstat (limited to 'Zend/zend_objects_API.c')
-rw-r--r-- | Zend/zend_objects_API.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 3587e99dd1..b565f6a1d1 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -314,6 +314,10 @@ typedef struct _zend_proxy_object { static zend_object_handlers zend_object_proxy_handlers; +ZEND_API void zend_objects_proxy_destroy(zend_object *object, zend_object_handle handle TSRMLS_DC) +{ +} + ZEND_API void zend_objects_proxy_free_storage(zend_proxy_object *object TSRMLS_DC) { zval_ptr_dtor(&object->object); @@ -336,13 +340,14 @@ ZEND_API zval *zend_object_create_proxy(zval *object, zval *member TSRMLS_DC) zval *retval; pobj->object = object; - pobj->property = member; - zval_add_ref(&pobj->property); zval_add_ref(&pobj->object); + ALLOC_ZVAL(pobj->property); + INIT_PZVAL_COPY(pobj->property, member); + zval_copy_ctor(pobj->property); MAKE_STD_ZVAL(retval); Z_TYPE_P(retval) = IS_OBJECT; - Z_OBJ_HANDLE_P(retval) = zend_objects_store_put(pobj, NULL, (zend_objects_free_object_storage_t) zend_objects_proxy_free_storage, (zend_objects_store_clone_t) zend_objects_proxy_clone TSRMLS_CC); + Z_OBJ_HANDLE_P(retval) = zend_objects_store_put(pobj, (zend_objects_store_dtor_t)zend_objects_proxy_destroy, (zend_objects_free_object_storage_t) zend_objects_proxy_free_storage, (zend_objects_store_clone_t) zend_objects_proxy_clone TSRMLS_CC); Z_OBJ_HT_P(retval) = &zend_object_proxy_handlers; return retval; |