diff options
Diffstat (limited to 'Zend/zend_objects_API.h')
| -rw-r--r-- | Zend/zend_objects_API.h | 93 |
1 files changed, 46 insertions, 47 deletions
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index ed7148f7f5..dbdb02f984 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -23,72 +23,71 @@ #define ZEND_OBJECTS_API_H #include "zend.h" +#include "zend_compile.h" -typedef void (*zend_objects_store_dtor_t)(void *object, zend_object_handle handle TSRMLS_DC); -typedef void (*zend_objects_free_object_storage_t)(void *object TSRMLS_DC); -typedef void (*zend_objects_store_clone_t)(void *object, void **object_clone TSRMLS_DC); - -typedef struct _zend_object_store_bucket { - zend_bool destructor_called; - zend_bool valid; - zend_uchar apply_count; - union _store_bucket { - struct _store_object { - void *object; - zend_objects_store_dtor_t dtor; - zend_objects_free_object_storage_t free_storage; - zend_objects_store_clone_t clone; - const zend_object_handlers *handlers; - zend_uint refcount; - gc_root_buffer *buffered; - } obj; - struct { - int next; - } free_list; - } bucket; -} zend_object_store_bucket; +#define OBJ_BUCKET_INVALID (1<<0) + +#define IS_OBJ_VALID(o) (!(((zend_uintptr_t)(o)) & OBJ_BUCKET_INVALID)) + +#define SET_OBJ_INVALID(o) ((zend_object*)((((zend_uintptr_t)(o)) | OBJ_BUCKET_INVALID))) + +#define GET_OBJ_BUCKET_NUMBER(o) (((zend_intptr_t)(o)) >> 1) + +#define SET_OBJ_BUCKET_NUMBER(o, n) do { \ + (o) = (zend_object*)((((zend_uintptr_t)(n)) << 1) | OBJ_BUCKET_INVALID); \ + } while (0) + + +#define OBJ_RELEASE(obj) zend_object_release(obj) typedef struct _zend_objects_store { - zend_object_store_bucket *object_buckets; - zend_uint top; - zend_uint size; + zend_object **object_buckets; + uint32_t top; + uint32_t size; int free_list_head; } zend_objects_store; /* Global store handling functions */ BEGIN_EXTERN_C() -ZEND_API void zend_objects_store_init(zend_objects_store *objects, zend_uint init_size); -ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TSRMLS_DC); -ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSRMLS_DC); +ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init_size); +ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects); +ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects); ZEND_API void zend_objects_store_destroy(zend_objects_store *objects); /* Store API functions */ -ZEND_API zend_object_handle zend_objects_store_put(void *object, zend_objects_store_dtor_t dtor, zend_objects_free_object_storage_t storage, zend_objects_store_clone_t clone TSRMLS_DC); - -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_ex(zend_object_handle handle, const zend_object_handlers *handlers TSRMLS_DC); -static zend_always_inline void zend_objects_store_del_ref_by_handle(zend_object_handle handle TSRMLS_DC) { - zend_objects_store_del_ref_by_handle_ex(handle, NULL TSRMLS_CC); -} -ZEND_API zend_uint zend_objects_store_get_refcount(zval *object TSRMLS_DC); -ZEND_API zend_object_value zend_objects_store_clone_obj(zval *object TSRMLS_DC); -ZEND_API void *zend_object_store_get_object(const zval *object TSRMLS_DC); -ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle TSRMLS_DC); +ZEND_API void zend_objects_store_put(zend_object *object); +ZEND_API void zend_objects_store_del(zend_object *object); +ZEND_API void zend_objects_store_free(zend_object *object); + /* 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); +ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object); +ZEND_API void zend_object_store_ctor_failed(zend_object *object); -ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects TSRMLS_DC); +ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects); -#define ZEND_OBJECTS_STORE_HANDLERS zend_objects_store_add_ref, zend_objects_store_del_ref, zend_objects_store_clone_obj +#define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj -ZEND_API zval *zend_object_create_proxy(zval *object, zval *member TSRMLS_DC); +ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member); ZEND_API zend_object_handlers *zend_get_std_object_handlers(void); END_EXTERN_C() +static zend_always_inline void zend_object_release(zend_object *obj) +{ + if (--GC_REFCOUNT(obj) == 0) { + zend_objects_store_del(obj); + } else if (UNEXPECTED(!GC_INFO(obj))) { + gc_possible_root((zend_refcounted*)obj); + } +} + +static zend_always_inline size_t zend_object_properties_size(zend_class_entry *ce) +{ + return sizeof(zval) * + (ce->default_properties_count - + ((ce->ce_flags & ZEND_ACC_USE_GUARDS) ? 0 : 1)); +} + #endif /* ZEND_OBJECTS_H */ /* |
