diff options
Diffstat (limited to 'Zend/zend_objects_API.h')
| -rw-r--r-- | Zend/zend_objects_API.h | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/Zend/zend_objects_API.h b/Zend/zend_objects_API.h index 0bb51c162d..2ebaa74360 100644 --- a/Zend/zend_objects_API.h +++ b/Zend/zend_objects_API.h @@ -49,30 +49,30 @@ typedef struct _zend_objects_store { /* Global store handling functions */ BEGIN_EXTERN_C() -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_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown); -ZEND_API void zend_objects_store_destroy(zend_objects_store *objects); +ZEND_API void ZEND_FASTCALL zend_objects_store_init(zend_objects_store *objects, uint32_t init_size); +ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_store *objects); +ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_store *objects); +ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_store *objects, zend_bool fast_shutdown); +ZEND_API void ZEND_FASTCALL zend_objects_store_destroy(zend_objects_store *objects); /* Store API functions */ -ZEND_API void zend_objects_store_put(zend_object *object); -ZEND_API void zend_objects_store_del(zend_object *object); +ZEND_API void ZEND_FASTCALL zend_objects_store_put(zend_object *object); +ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object); /* Called when the ctor was terminated by an exception */ static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj) { - GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; + GC_ADD_FLAGS(obj, IS_OBJ_DESTRUCTOR_CALLED); } #define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj -ZEND_API zend_object_handlers *zend_get_std_object_handlers(void); +ZEND_API const zend_object_handlers * ZEND_FASTCALL 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) { + if (GC_DELREF(obj) == 0) { zend_objects_store_del(obj); } else if (UNEXPECTED(GC_MAY_LEAK((zend_refcounted*)obj))) { gc_possible_root((zend_refcounted*)obj); @@ -86,6 +86,17 @@ static zend_always_inline size_t zend_object_properties_size(zend_class_entry *c ((ce->ce_flags & ZEND_ACC_USE_GUARDS) ? 0 : 1)); } +/* Allocates object type and zeros it, but not the properties. + * Properties MUST be initialized using object_properties_init(). */ +static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_entry *ce) { + void *obj = emalloc(obj_size + zend_object_properties_size(ce)); + /* Subtraction of sizeof(zval) is necessary, because zend_object_properties_size() may be + * -sizeof(zval), if the object has no properties. */ + memset(obj, 0, obj_size - sizeof(zval)); + return obj; +} + + #endif /* ZEND_OBJECTS_H */ /* |
