From f096990ea0fd02e2a006abfeea19251a6ad4a564 Mon Sep 17 00:00:00 2001 From: Andrei Zmievski Date: Fri, 21 Apr 2006 16:36:38 +0000 Subject: [PATCH] Add: * zend_objects_store_add_ref_by_handle() * zend_objects_store_del_ref_by_handle() * zend_objects_store_get_object_by_handle() --- Zend/zend_objects_API.c | 25 +++++++++++++++++++++---- Zend/zend_objects_API.h | 3 +++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index e795d1fa1f..0a35ad8fd3 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -135,6 +135,11 @@ ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC) #endif } +ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSRMLS_DC) +{ + EG(objects_store).object_buckets[handle].bucket.obj.refcount++; +} + #define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST() \ EG(objects_store).object_buckets[handle].bucket.free_list.next = EG(objects_store).free_list_head; \ EG(objects_store).free_list_head = handle; \ @@ -143,28 +148,35 @@ ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC) ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC) { zend_object_handle handle; + + handle = Z_OBJ_HANDLE_P(zobject); + + zobject->refcount++; + zend_objects_store_del_ref_by_handle(handle TSRMLS_CC); + zobject->refcount--; +} + +ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC) +{ struct _store_object *obj; if (!EG(objects_store).object_buckets) { return; } - handle = Z_OBJ_HANDLE_P(zobject); obj = &EG(objects_store).object_buckets[handle].bucket.obj; /* Make sure we hold a reference count during the destructor call otherwise, when the destructor ends the storage might be freed when the refcount reaches 0 a second time - */ + */ if (EG(objects_store).object_buckets[handle].valid) { if (obj->refcount == 1) { if (!EG(objects_store).object_buckets[handle].destructor_called) { EG(objects_store).object_buckets[handle].destructor_called = 1; if (obj->dtor) { - zobject->refcount++; obj->dtor(obj->object, handle TSRMLS_CC); - zobject->refcount--; } } if (obj->refcount == 1) { @@ -215,6 +227,11 @@ ZEND_API void *zend_object_store_get_object(zval *zobject TSRMLS_DC) return EG(objects_store).object_buckets[handle].bucket.obj.object; } +ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle TSRMLS_DC) +{ + return EG(objects_store).object_buckets[handle].bucket.obj.object; +} + /* zend_object_store_set_object: * It is ONLY valid to call this function from within the constructor of an * overloaded object. Its purpose is to set the object pointer for the object diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index e3e2412b52..f465f2c46a 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -64,8 +64,11 @@ ZEND_API zend_object_handle zend_objects_store_put(void *object, zend_objects_st ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC); ZEND_API void zend_objects_store_del_ref(zval *object TSRMLS_DC); +ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSRMLS_DC); +ZEND_API void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC); ZEND_API zend_object_value zend_objects_store_clone_obj(zval *object TSRMLS_DC); ZEND_API void *zend_object_store_get_object(zval *object TSRMLS_DC); +ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle TSRMLS_DC); /* See comment in zend_objects_API.c before you use this */ ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC); ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC); -- 2.50.1