From c081ce628f0d76d44784d7bb8e06428b06142ac0 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 3 Jan 2014 11:08:10 +0800 Subject: Bump year --- Zend/zend_objects_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index b5dd48f798..f7a6b0b4c3 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -2,7 +2,7 @@ +----------------------------------------------------------------------+ | Zend Engine | +----------------------------------------------------------------------+ - | Copyright (c) 1998-2013 Zend Technologies Ltd. (http://www.zend.com) | + | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) | +----------------------------------------------------------------------+ | This source file is subject to version 2.00 of the Zend license, | | that is bundled with this package in the file LICENSE, and is | -- cgit v1.2.1 From f4cfaf36e23ca47da3e352e1c60909104c059647 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 10 Feb 2014 10:04:30 +0400 Subject: Use better data structures (incomplete) --- Zend/zend_objects_API.c | 239 ++++++++++++++++++------------------------------ 1 file changed, 90 insertions(+), 149 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index f7a6b0b4c3..04de616f44 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -25,15 +25,25 @@ #include "zend_API.h" #include "zend_objects_API.h" -#define ZEND_DEBUG_OBJECTS 0 +#define FREE_BUCKET 1 + +#define IS_VALID(o) (!(((zend_uintptr_t)(o)) & FREE_BUCKET)) + +#define GET_BUCKET_NUMBER(o) (((zend_uintptr_t)(o)) >> 1) + +#define SET_BUCKET_NUMBER(o, n) do { \ + (o) = (((zend_uintptr_t)(n)) << 1) | FREE_BUCKET); \ + } while (0) + + ZEND_API void zend_objects_store_init(zend_objects_store *objects, zend_uint init_size) { - objects->object_buckets = (zend_object_store_bucket *) emalloc(init_size * sizeof(zend_object_store_bucket)); + objects->object_buckets = (zend_object **) emalloc(init_size * sizeof(zend_object*)); objects->top = 1; /* Skip 0 so that handles are true */ objects->size = init_size; objects->free_list_head = -1; - memset(&objects->object_buckets[0], 0, sizeof(zend_object_store_bucket)); + memset(&objects->object_buckets[0], 0, sizeof(zend_object*)); } ZEND_API void zend_objects_store_destroy(zend_objects_store *objects) @@ -47,21 +57,17 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS zend_uint i = 1; for (i = 1; i < objects->top ; i++) { - if (objects->object_buckets[i].valid) { - struct _store_object *obj = &objects->object_buckets[i].bucket.obj; - - if (!objects->object_buckets[i].destructor_called) { - objects->object_buckets[i].destructor_called = 1; - if (obj->dtor && obj->object) { - obj->refcount++; - obj->dtor(obj->object, i TSRMLS_CC); - obj = &objects->object_buckets[i].bucket.obj; - obj->refcount--; - - if (obj->refcount == 0) { - /* in case gc_collect_cycle is triggered before free_storage */ - GC_REMOVE_ZOBJ_FROM_BUFFER(obj); - } + zend_object *obj = objects->object_buckets[i]; + + if (IS_VALID(obj)) { + if (!(obj->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { + obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; + obj->gc.refcount++; + obj->handlers->dtor_obj(obj TSRMLS_CC); + obj->gc.refcount--; + + if (obj->gc.refcount == 0) { + gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); } } } @@ -76,8 +82,10 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSR return; } for (i = 1; i < objects->top ; i++) { - if (objects->object_buckets[i].valid) { - objects->object_buckets[i].destructor_called = 1; + zend_object *obj = objects->object_buckets[i]; + + if (IS_VALID(obj)) { + obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; } } } @@ -87,14 +95,13 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects zend_uint i = 1; for (i = 1; i < objects->top ; i++) { - if (objects->object_buckets[i].valid) { - struct _store_object *obj = &objects->object_buckets[i].bucket.obj; - - GC_REMOVE_ZOBJ_FROM_BUFFER(obj); + zend_object *obj = objects->object_buckets[i]; - objects->object_buckets[i].valid = 0; - if (obj->free_storage) { - obj->free_storage(obj->object TSRMLS_CC); + if (IS_VALID(obj)) { + gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); +//??? objects->object_buckets[i].valid = 0; + if (obj->handlers->free_obj) { + obj->handlers->free_obj(obj TSRMLS_CC); } /* Not adding to free list as we are shutting down anyway */ } @@ -104,63 +111,22 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects /* Store objects API */ -ZEND_API zend_object_handle zend_objects_store_put(void *object, zend_objects_store_dtor_t dtor, zend_objects_free_object_storage_t free_storage, zend_objects_store_clone_t clone TSRMLS_DC) +ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) { - zend_object_handle handle; - struct _store_object *obj; + int handle; if (EG(objects_store).free_list_head != -1) { handle = EG(objects_store).free_list_head; - EG(objects_store).free_list_head = EG(objects_store).object_buckets[handle].bucket.free_list.next; + EG(objects_store).free_list_head = GET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); } else { if (EG(objects_store).top == EG(objects_store).size) { EG(objects_store).size <<= 1; - EG(objects_store).object_buckets = (zend_object_store_bucket *) erealloc(EG(objects_store).object_buckets, EG(objects_store).size * sizeof(zend_object_store_bucket)); + EG(objects_store).object_buckets = (zend_object **) erealloc(EG(objects_store).object_buckets, EG(objects_store).size * sizeof(zend_object*)); } handle = EG(objects_store).top++; } - obj = &EG(objects_store).object_buckets[handle].bucket.obj; - EG(objects_store).object_buckets[handle].destructor_called = 0; - EG(objects_store).object_buckets[handle].valid = 1; - EG(objects_store).object_buckets[handle].apply_count = 0; - - obj->refcount = 1; - GC_OBJ_INIT(obj); - obj->object = object; - obj->dtor = dtor?dtor:(zend_objects_store_dtor_t)zend_objects_destroy_object; - obj->free_storage = free_storage; - obj->clone = clone; - obj->handlers = NULL; - -#if ZEND_DEBUG_OBJECTS - fprintf(stderr, "Allocated object id #%d\n", handle); -#endif - return handle; -} - -ZEND_API zend_uint zend_objects_store_get_refcount(zval *object TSRMLS_DC) -{ - zend_object_handle handle = Z_OBJ_HANDLE_P(object); - - return EG(objects_store).object_buckets[handle].bucket.obj.refcount; -} - -ZEND_API void zend_objects_store_add_ref(zval *object TSRMLS_DC) -{ - zend_object_handle handle = Z_OBJ_HANDLE_P(object); - - EG(objects_store).object_buckets[handle].bucket.obj.refcount++; -#if ZEND_DEBUG_OBJECTS - fprintf(stderr, "Increased refcount of object id #%d\n", handle); -#endif -} - -/* - * Add a reference to an objects store entry given the object handle. - */ -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++; + object->handle = handle; + EG(objects_store).object_buckets[handle] = object; } #define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST() \ @@ -168,22 +134,11 @@ ZEND_API void zend_objects_store_add_ref_by_handle(zend_object_handle handle TSR EG(objects_store).free_list_head = handle; \ EG(objects_store).object_buckets[handle].valid = 0; -ZEND_API void zend_objects_store_del_ref(zval *zobject TSRMLS_DC) -{ - zend_object_handle handle; - - handle = Z_OBJ_HANDLE_P(zobject); - - Z_ADDREF_P(zobject); - zend_objects_store_del_ref_by_handle_ex(handle, Z_OBJ_HT_P(zobject) TSRMLS_CC); - Z_DELREF_P(zobject); - - GC_ZOBJ_CHECK_POSSIBLE_ROOT(zobject); -} - /* * Delete a reference to an objects store entry given the object handle. */ +//??? +#if 0 ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, const zend_object_handlers *handlers TSRMLS_DC) /* {{{ */ { struct _store_object *obj; @@ -220,7 +175,7 @@ ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, obj = &EG(objects_store).object_buckets[handle].bucket.obj; if (obj->refcount == 1) { - GC_REMOVE_ZOBJ_FROM_BUFFER(obj); +//??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); if (obj->free_storage) { zend_try { obj->free_storage(obj->object TSRMLS_CC); @@ -235,33 +190,29 @@ ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, obj->refcount--; -#if ZEND_DEBUG_OBJECTS - if (obj->refcount == 0) { - fprintf(stderr, "Deallocated object id #%d\n", handle); - } else { - fprintf(stderr, "Decreased refcount of object id #%d\n", handle); - } -#endif if (failure) { zend_bailout(); } } +#endif /* }}} */ -ZEND_API zend_object_value zend_objects_store_clone_obj(zval *zobject TSRMLS_DC) +//??? +#if 0 +ZEND_API zend_object *zend_objects_store_clone_obj(zval *zobject TSRMLS_DC) { - zend_object_value retval; - void *new_object; - struct _store_object *obj; - zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); + zend_object *obj, *new_object; +//??? struct _store_object *obj; +//??? zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); - obj = &EG(objects_store).object_buckets[handle].bucket.obj; +//??? obj = &EG(objects_store).object_buckets[handle].bucket.obj; - if (obj->clone == NULL) { - zend_error(E_CORE_ERROR, "Trying to clone uncloneable object of class %s", Z_OBJCE_P(zobject)->name); - } +//??? if (obj->clone == NULL) { +//??? zend_error(E_CORE_ERROR, "Trying to clone uncloneable object of class %s", Z_OBJCE_P(zobject)->name); +//??? } - obj->clone(obj->object, &new_object TSRMLS_CC); + obj = Z_OBJ_P(zobject); + new_object = obj->handlers->clone_obj(obj TSRMLS_CC); obj = &EG(objects_store).object_buckets[handle].bucket.obj; retval.handle = zend_objects_store_put(new_object, obj->dtor, obj->free_storage, obj->clone TSRMLS_CC); @@ -270,21 +221,7 @@ ZEND_API zend_object_value zend_objects_store_clone_obj(zval *zobject TSRMLS_DC) return retval; } - -ZEND_API void *zend_object_store_get_object(const zval *zobject TSRMLS_DC) -{ - zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); - - return EG(objects_store).object_buckets[handle].bucket.obj.object; -} - -/* - * Retrieve an entry from the objects store given the object handle. - */ -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; -} +#endif /* zend_object_store_set_object: * It is ONLY valid to call this function from within the constructor of an @@ -293,15 +230,19 @@ ZEND_API void *zend_object_store_get_object_by_handle(zend_object_handle handle * from the constructor function. You MUST NOT use this function for any other * weird games, or call it at any other time after the object is constructed. * */ +//??? +#if 0 ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC) { zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); EG(objects_store).object_buckets[handle].bucket.obj.object = object; } - +#endif /* Called when the ctor was terminated by an exception */ +//??? +#if 0 ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC) { zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); @@ -310,17 +251,18 @@ ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC) obj_bucket->bucket.obj.handlers = Z_OBJ_HT_P(zobject);; obj_bucket->destructor_called = 1; } - +#endif /* Proxy objects workings */ typedef struct _zend_proxy_object { - zval *object; - zval *property; + zend_object std; + zval object; + zval property; } 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_destroy(zend_object *object TSRMLS_DC) { } @@ -336,35 +278,34 @@ ZEND_API void zend_objects_proxy_clone(zend_proxy_object *object, zend_proxy_obj *object_clone = emalloc(sizeof(zend_proxy_object)); (*object_clone)->object = object->object; (*object_clone)->property = object->property; - zval_add_ref(&(*object_clone)->property); - zval_add_ref(&(*object_clone)->object); + Z_ADDREF_P(&(*object_clone)->property); + Z_ADDREF_P(&(*object_clone)->object); } -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 TSRMLS_DC) { - zend_proxy_object *pobj = emalloc(sizeof(zend_proxy_object)); - zval *retval; - - pobj->object = object; - 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, (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; + zend_proxy_object *obj = emalloc(sizeof(zend_proxy_object)); + + obj->std.gc.refcount = 1; + obj->std.gc.u.v.type = IS_OBJECT; + obj->std.gc.u.v.buffer = 0; + obj->std.ce = NULL; + obj->std.properties = NULL; + obj->std.guards = NULL; + obj->std.handlers = &zend_object_proxy_handlers; + + ZVAL_COPY(&obj->object, object); + ZVAL_DUP(&obj->property, member); - return retval; + return (zend_object*)obj; } -ZEND_API void zend_object_proxy_set(zval **property, zval *value TSRMLS_DC) +ZEND_API void zend_object_proxy_set(zval *property, zval *value TSRMLS_DC) { - zend_proxy_object *probj = zend_object_store_get_object(*property TSRMLS_CC); + zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); - if (Z_OBJ_HT_P(probj->object) && Z_OBJ_HT_P(probj->object)->write_property) { - Z_OBJ_HT_P(probj->object)->write_property(probj->object, probj->property, value, 0 TSRMLS_CC); + if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->write_property) { + Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, 0 TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot write property of object - no write handler defined"); } @@ -372,10 +313,10 @@ ZEND_API void zend_object_proxy_set(zval **property, zval *value TSRMLS_DC) ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC) { - zend_proxy_object *probj = zend_object_store_get_object(property TSRMLS_CC); + zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); - if (Z_OBJ_HT_P(probj->object) && Z_OBJ_HT_P(probj->object)->read_property) { - return Z_OBJ_HT_P(probj->object)->read_property(probj->object, probj->property, BP_VAR_R, 0 TSRMLS_CC); + if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { + return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, 0 TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); } -- cgit v1.2.1 From be82a077769641331ee5914c60df44ba3f862aff Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 12 Feb 2014 18:08:11 +0400 Subject: Use better data structures (incomplete) --- Zend/zend_objects_API.c | 105 +++++++++++++++--------------------------------- 1 file changed, 33 insertions(+), 72 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 04de616f44..4480512f39 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -23,19 +23,7 @@ #include "zend_globals.h" #include "zend_variables.h" #include "zend_API.h" -#include "zend_objects_API.h" - -#define FREE_BUCKET 1 - -#define IS_VALID(o) (!(((zend_uintptr_t)(o)) & FREE_BUCKET)) - -#define GET_BUCKET_NUMBER(o) (((zend_uintptr_t)(o)) >> 1) - -#define SET_BUCKET_NUMBER(o, n) do { \ - (o) = (((zend_uintptr_t)(n)) << 1) | FREE_BUCKET); \ - } while (0) - - +#include "zend_objects_API.h" ZEND_API void zend_objects_store_init(zend_objects_store *objects, zend_uint init_size) { @@ -99,7 +87,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects if (IS_VALID(obj)) { gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); -//??? objects->object_buckets[i].valid = 0; + objects->object_buckets[i] = SET_INVALID(obj); if (obj->handlers->free_obj) { obj->handlers->free_obj(obj TSRMLS_CC); } @@ -129,72 +117,55 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) EG(objects_store).object_buckets[handle] = object; } -#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; \ - EG(objects_store).object_buckets[handle].valid = 0; +#define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle) \ + SET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \ + EG(objects_store).free_list_head = handle; -/* - * Delete a reference to an objects store entry given the object handle. - */ -//??? -#if 0 -ZEND_API void zend_objects_store_del_ref_by_handle_ex(zend_object_handle handle, const zend_object_handlers *handlers TSRMLS_DC) /* {{{ */ +ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ { - struct _store_object *obj; - int failure = 0; - - if (!EG(objects_store).object_buckets) { - return; - } - - 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) { - if (handlers && !obj->handlers) { - obj->handlers = handlers; - } + if (EG(objects_store).object_buckets && + IS_VALID(EG(objects_store).object_buckets[object->handle])) { + if (object->gc.refcount == 0) { + int failure = 0; + + if (!(object->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { + object->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; + + if (object->handlers->dtor_obj) { + object->gc.refcount++; zend_try { - obj->dtor(obj->object, handle TSRMLS_CC); + object->handlers->dtor_obj(object TSRMLS_CC); } zend_catch { failure = 1; } zend_end_try(); + object->gc.refcount--; } } - /* re-read the object from the object store as the store might have been reallocated in the dtor */ - obj = &EG(objects_store).object_buckets[handle].bucket.obj; - - if (obj->refcount == 1) { + if (object->gc.refcount == 0) { //??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); - if (obj->free_storage) { + if (object->handlers->free_obj) { zend_try { - obj->free_storage(obj->object TSRMLS_CC); + object->handlers->free_obj(object TSRMLS_CC); } zend_catch { failure = 1; } zend_end_try(); } - ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(); + ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(object->handle); } + + if (failure) { + zend_bailout(); + } + } else { + object->gc.refcount--; } } - - obj->refcount--; - - if (failure) { - zend_bailout(); - } } -#endif /* }}} */ //??? @@ -230,28 +201,18 @@ ZEND_API zend_object *zend_objects_store_clone_obj(zval *zobject TSRMLS_DC) * from the constructor function. You MUST NOT use this function for any other * weird games, or call it at any other time after the object is constructed. * */ -//??? -#if 0 -ZEND_API void zend_object_store_set_object(zval *zobject, void *object TSRMLS_DC) +ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object TSRMLS_DC) { - zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); - - EG(objects_store).object_buckets[handle].bucket.obj.object = object; + EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(zobject)] = object; } -#endif /* Called when the ctor was terminated by an exception */ -//??? -#if 0 ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC) { - zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); - zend_object_store_bucket *obj_bucket = &EG(objects_store).object_buckets[handle]; - - obj_bucket->bucket.obj.handlers = Z_OBJ_HT_P(zobject);; - obj_bucket->destructor_called = 1; + zend_object *obj = Z_OBJ_P(zobject); + + obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; } -#endif /* Proxy objects workings */ typedef struct _zend_proxy_object { -- cgit v1.2.1 From 110e01a21eef8827a0c449f23139e25a9e32e181 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 18 Feb 2014 22:35:54 +0400 Subject: Fixed object destruction --- Zend/zend_objects_API.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 4480512f39..f617e92da6 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -147,6 +147,8 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ } if (object->gc.refcount == 0) { + zend_uint handle = object->handle; + //??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); if (object->handlers->free_obj) { zend_try { @@ -155,7 +157,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ failure = 1; } zend_end_try(); } - ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(object->handle); + ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle); } if (failure) { -- cgit v1.2.1 From b917458490ece8d418caee5b6e43db9f7567cb72 Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 20 Feb 2014 15:39:46 +0800 Subject: Fixed segfault (Zend/tests/026.phpt now pass) --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index f617e92da6..5bef2d4973 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -129,7 +129,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ */ if (EG(objects_store).object_buckets && IS_VALID(EG(objects_store).object_buckets[object->handle])) { - if (object->gc.refcount == 0) { + if (object->gc.refcount == 1) { int failure = 0; if (!(object->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { @@ -146,7 +146,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ } } - if (object->gc.refcount == 0) { + if (object->gc.refcount == 1) { zend_uint handle = object->handle; //??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); -- cgit v1.2.1 From cc15eb500ed9c47412b41ee461cf7b4f00701ead Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Thu, 20 Feb 2014 16:21:41 +0800 Subject: Fixed segfault in Zend/tests/008.phpt --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 5bef2d4973..8e406ec715 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -55,7 +55,7 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS obj->gc.refcount--; if (obj->gc.refcount == 0) { - gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); + GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC); } } } @@ -86,7 +86,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects zend_object *obj = objects->object_buckets[i]; if (IS_VALID(obj)) { - gc_remove_zval_from_buffer((zend_refcounted*)obj TSRMLS_CC); + GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC); objects->object_buckets[i] = SET_INVALID(obj); if (obj->handlers->free_obj) { obj->handlers->free_obj(obj TSRMLS_CC); -- cgit v1.2.1 From 51d7c4828a8025c4fedf7b38380d17f7a2464256 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 21 Feb 2014 15:48:56 +0400 Subject: Fixed tests/run-test/test009.phpt --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 8e406ec715..6f80771ce6 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -129,7 +129,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ */ if (EG(objects_store).object_buckets && IS_VALID(EG(objects_store).object_buckets[object->handle])) { - if (object->gc.refcount == 1) { + if (object->gc.refcount == 0) { int failure = 0; if (!(object->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { @@ -146,7 +146,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ } } - if (object->gc.refcount == 1) { + if (object->gc.refcount == 0) { zend_uint handle = object->handle; //??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); -- cgit v1.2.1 From 1c3ba95bb547f8d9b0bd0496238a76ef6a706b07 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 27 Feb 2014 15:40:13 +0400 Subject: Refactored read_property() and read_dimension() handlers --- Zend/zend_objects_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 6f80771ce6..a4a5055b70 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -279,7 +279,7 @@ ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC) zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { - return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, 0 TSRMLS_CC); + return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, 0, NULL TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); } -- cgit v1.2.1 From b7938ab1bd765897bd6f08a48a8aea494a961ea9 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 19 Mar 2014 17:00:28 +0400 Subject: Refactored GC (incomplete) --- Zend/zend_objects_API.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index a4a5055b70..77b7ee103a 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -53,10 +53,6 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS obj->gc.refcount++; obj->handlers->dtor_obj(obj TSRMLS_CC); obj->gc.refcount--; - - if (obj->gc.refcount == 0) { - GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC); - } } } } @@ -86,7 +82,6 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects zend_object *obj = objects->object_buckets[i]; if (IS_VALID(obj)) { - GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC); objects->object_buckets[i] = SET_INVALID(obj); if (obj->handlers->free_obj) { obj->handlers->free_obj(obj TSRMLS_CC); @@ -121,6 +116,17 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) SET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \ EG(objects_store).free_list_head = handle; +ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC) /* {{{ */ +{ + int handle = object->handle; + + if (object->handlers->free_obj) { + object->handlers->free_obj(object TSRMLS_CC); + } + ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle); +} +/* }}} */ + ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ { /* Make sure we hold a reference count during the destructor call @@ -149,7 +155,6 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ if (object->gc.refcount == 0) { zend_uint handle = object->handle; -//??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj); if (object->handlers->free_obj) { zend_try { object->handlers->free_obj(object TSRMLS_CC); @@ -251,7 +256,7 @@ ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS obj->std.gc.refcount = 1; obj->std.gc.u.v.type = IS_OBJECT; - obj->std.gc.u.v.buffer = 0; + obj->std.gc.u.v.gc_info = 0; obj->std.ce = NULL; obj->std.properties = NULL; obj->std.guards = NULL; -- cgit v1.2.1 From 5db78476e310bef25c6e0a9f0c4c07d6f2532a15 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 19 Mar 2014 23:50:50 +0400 Subject: Mark objects that are going to be deleted --- Zend/zend_objects_API.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 77b7ee103a..f0db534cc3 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -120,6 +120,7 @@ ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC) /* {{{ */ { int handle = object->handle; + EG(objects_store).object_buckets[handle] = SET_INVALID(object); if (object->handlers->free_obj) { object->handlers->free_obj(object TSRMLS_CC); } @@ -155,6 +156,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ if (object->gc.refcount == 0) { zend_uint handle = object->handle; + EG(objects_store).object_buckets[handle] = SET_INVALID(object); if (object->handlers->free_obj) { zend_try { object->handlers->free_obj(object TSRMLS_CC); -- cgit v1.2.1 From ea85451b65b904d0670c4011c819a15431720432 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 28 Mar 2014 02:11:22 +0400 Subject: Refactored data structures to keep zend_object* instead of a whole zval in some places --- Zend/zend_objects_API.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index f0db534cc3..be215ed086 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -216,10 +216,8 @@ ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object TS } /* Called when the ctor was terminated by an exception */ -ZEND_API void zend_object_store_ctor_failed(zval *zobject TSRMLS_DC) +ZEND_API void zend_object_store_ctor_failed(zend_object *obj TSRMLS_DC) { - zend_object *obj = Z_OBJ_P(zobject); - obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; } -- cgit v1.2.1 From d8099d0468426dbee59f540048376653535270ce Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 2 Apr 2014 14:34:44 +0400 Subject: Changed data layout to allow more efficient operations --- Zend/zend_objects_API.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index be215ed086..a65b4a993e 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -48,11 +48,11 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS zend_object *obj = objects->object_buckets[i]; if (IS_VALID(obj)) { - if (!(obj->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { - obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; - obj->gc.refcount++; + if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) { + GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; + GC_REFCOUNT(obj)++; obj->handlers->dtor_obj(obj TSRMLS_CC); - obj->gc.refcount--; + GC_REFCOUNT(obj)--; } } } @@ -69,7 +69,7 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSR zend_object *obj = objects->object_buckets[i]; if (IS_VALID(obj)) { - obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; + GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; } } } @@ -136,24 +136,24 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ */ if (EG(objects_store).object_buckets && IS_VALID(EG(objects_store).object_buckets[object->handle])) { - if (object->gc.refcount == 0) { + if (GC_REFCOUNT(object) == 0) { int failure = 0; - if (!(object->gc.u.v.flags & IS_OBJ_DESTRUCTOR_CALLED)) { - object->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; + if (!(GC_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) { + GC_FLAGS(object) |= IS_OBJ_DESTRUCTOR_CALLED; if (object->handlers->dtor_obj) { - object->gc.refcount++; + GC_REFCOUNT(object)++; zend_try { object->handlers->dtor_obj(object TSRMLS_CC); } zend_catch { failure = 1; } zend_end_try(); - object->gc.refcount--; + GC_REFCOUNT(object)--; } } - if (object->gc.refcount == 0) { + if (GC_REFCOUNT(object) == 0) { zend_uint handle = object->handle; EG(objects_store).object_buckets[handle] = SET_INVALID(object); @@ -171,7 +171,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ zend_bailout(); } } else { - object->gc.refcount--; + GC_REFCOUNT(object)--; } } } @@ -218,7 +218,7 @@ ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object TS /* Called when the ctor was terminated by an exception */ ZEND_API void zend_object_store_ctor_failed(zend_object *obj TSRMLS_DC) { - obj->gc.u.v.flags |= IS_OBJ_DESTRUCTOR_CALLED; + GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; } /* Proxy objects workings */ @@ -254,9 +254,8 @@ ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS { zend_proxy_object *obj = emalloc(sizeof(zend_proxy_object)); - obj->std.gc.refcount = 1; - obj->std.gc.u.v.type = IS_OBJECT; - obj->std.gc.u.v.gc_info = 0; + GC_REFCOUNT(obj) = 1; + GC_TYPE_INFO(obj) = IS_OBJECT; obj->std.ce = NULL; obj->std.properties = NULL; obj->std.guards = NULL; -- cgit v1.2.1 From 7402af380b3a700dda0e89470770fde15bd56204 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 9 Apr 2014 01:50:15 +0400 Subject: Fixed destruction of objects and iterators on unclean request shutdown and GC (few cases are still unfixed). Now we destroy objects it two steps. At first - object properties of all objects and only then the objects their selves. --- Zend/zend_objects_API.c | 72 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 48 insertions(+), 24 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index a65b4a993e..541b2a465f 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -42,12 +42,12 @@ ZEND_API void zend_objects_store_destroy(zend_objects_store *objects) ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TSRMLS_DC) { - zend_uint i = 1; + zend_uint i; for (i = 1; i < objects->top ; i++) { zend_object *obj = objects->object_buckets[i]; - if (IS_VALID(obj)) { + if (IS_OBJ_VALID(obj)) { if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) { GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; GC_REFCOUNT(obj)++; @@ -68,7 +68,7 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSR for (i = 1; i < objects->top ; i++) { zend_object *obj = objects->object_buckets[i]; - if (IS_VALID(obj)) { + if (IS_OBJ_VALID(obj)) { GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; } } @@ -76,17 +76,33 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSR ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects TSRMLS_DC) { - zend_uint i = 1; + zend_uint i; + /* Free object properties but don't free object their selves */ for (i = 1; i < objects->top ; i++) { zend_object *obj = objects->object_buckets[i]; - if (IS_VALID(obj)) { - objects->object_buckets[i] = SET_INVALID(obj); - if (obj->handlers->free_obj) { - obj->handlers->free_obj(obj TSRMLS_CC); + if (IS_OBJ_VALID(obj)) { + if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) { + GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED; + if (obj->handlers->free_obj) { + GC_REFCOUNT(obj)++; + obj->handlers->free_obj(obj TSRMLS_CC); + GC_REFCOUNT(obj)--; + } } + } + } + + /* Now free objects theirselves */ + for (i = 1; i < objects->top ; i++) { + zend_object *obj = objects->object_buckets[i]; + + if (IS_OBJ_VALID(obj)) { /* Not adding to free list as we are shutting down anyway */ + void *ptr = ((char*)obj) - obj->handlers->offset; + GC_REMOVE_FROM_BUFFER(obj); + efree(ptr); } } } @@ -100,7 +116,7 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) if (EG(objects_store).free_list_head != -1) { handle = EG(objects_store).free_list_head; - EG(objects_store).free_list_head = GET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); + EG(objects_store).free_list_head = GET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle]); } else { if (EG(objects_store).top == EG(objects_store).size) { EG(objects_store).size <<= 1; @@ -113,17 +129,16 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) } #define ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle) \ - SET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \ + SET_OBJ_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \ EG(objects_store).free_list_head = handle; ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC) /* {{{ */ { - int handle = object->handle; + zend_uint handle = object->handle; + void *ptr = ((char*)object) - object->handlers->offset; - EG(objects_store).object_buckets[handle] = SET_INVALID(object); - if (object->handlers->free_obj) { - object->handlers->free_obj(object TSRMLS_CC); - } + GC_REMOVE_FROM_BUFFER(object); + efree(ptr); ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle); } /* }}} */ @@ -135,7 +150,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ when the refcount reaches 0 a second time */ if (EG(objects_store).object_buckets && - IS_VALID(EG(objects_store).object_buckets[object->handle])) { + IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle])) { if (GC_REFCOUNT(object) == 0) { int failure = 0; @@ -155,15 +170,24 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ if (GC_REFCOUNT(object) == 0) { zend_uint handle = object->handle; - - EG(objects_store).object_buckets[handle] = SET_INVALID(object); - if (object->handlers->free_obj) { - zend_try { - object->handlers->free_obj(object TSRMLS_CC); - } zend_catch { - failure = 1; - } zend_end_try(); + void *ptr; + + EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object); + if (!(GC_FLAGS(object) & IS_OBJ_FREE_CALLED)) { + GC_FLAGS(object) |= IS_OBJ_FREE_CALLED; + if (object->handlers->free_obj) { + zend_try { + GC_REFCOUNT(object)++; + object->handlers->free_obj(object TSRMLS_CC); + GC_REFCOUNT(object)++; + } zend_catch { + failure = 1; + } zend_end_try(); + } } + ptr = ((char*)object) - object->handlers->offset; + GC_REMOVE_FROM_BUFFER(object); + efree(ptr); ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle); } -- cgit v1.2.1 From d8a0c6c6ab5d8855b322d00bb3dcb4d8b8da90e9 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 10 Apr 2014 00:22:13 +0400 Subject: typo --- Zend/zend_objects_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 541b2a465f..ae89317099 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -179,7 +179,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ zend_try { GC_REFCOUNT(object)++; object->handlers->free_obj(object TSRMLS_CC); - GC_REFCOUNT(object)++; + GC_REFCOUNT(object)--; } zend_catch { failure = 1; } zend_end_try(); -- cgit v1.2.1 From 050d7e38ad4163e7fa65e26724d3516ce7b33601 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 15 Apr 2014 15:40:40 +0400 Subject: Cleanup (1-st round) --- Zend/zend_objects_API.c | 26 -------------------------- 1 file changed, 26 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index ae89317099..3d97aaaf7a 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -201,32 +201,6 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ } /* }}} */ -//??? -#if 0 -ZEND_API zend_object *zend_objects_store_clone_obj(zval *zobject TSRMLS_DC) -{ - zend_object *obj, *new_object; -//??? struct _store_object *obj; -//??? zend_object_handle handle = Z_OBJ_HANDLE_P(zobject); - -//??? obj = &EG(objects_store).object_buckets[handle].bucket.obj; - -//??? if (obj->clone == NULL) { -//??? zend_error(E_CORE_ERROR, "Trying to clone uncloneable object of class %s", Z_OBJCE_P(zobject)->name); -//??? } - - obj = Z_OBJ_P(zobject); - new_object = obj->handlers->clone_obj(obj TSRMLS_CC); - obj = &EG(objects_store).object_buckets[handle].bucket.obj; - - retval.handle = zend_objects_store_put(new_object, obj->dtor, obj->free_storage, obj->clone TSRMLS_CC); - retval.handlers = Z_OBJ_HT_P(zobject); - EG(objects_store).object_buckets[handle].bucket.obj.handlers = retval.handlers; - - return retval; -} -#endif - /* 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 -- cgit v1.2.1 From e96073b1e40c4999dee70db684721a582ea5e055 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Thu, 17 Apr 2014 15:40:45 +0400 Subject: Moved zend_literal->cache_slot right into zval. It should be accessed using Z_CACHE_SLOT() macro. zend_literal structure is removed. API functions that accepted pointer to zend_literal now accept pointer to zval or cache_slot directly. Calls of such functiond that now accept cache_slot need to be changed to pass -1 instead of NULL. --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 3d97aaaf7a..285a752c2b 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -270,7 +270,7 @@ ZEND_API void zend_object_proxy_set(zval *property, zval *value TSRMLS_DC) zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->write_property) { - Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, 0 TSRMLS_CC); + Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, -1 TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot write property of object - no write handler defined"); } @@ -281,7 +281,7 @@ ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC) zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { - return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, 0, NULL TSRMLS_CC); + return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, -1, NULL TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); } -- cgit v1.2.1 From 5864ce8a447b718d0912cb073afe87eddc47b2e8 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 22 Apr 2014 17:46:34 +0400 Subject: Fixed compilation warnings --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 285a752c2b..bd6673c0bb 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -276,12 +276,12 @@ ZEND_API void zend_object_proxy_set(zval *property, zval *value TSRMLS_DC) } } -ZEND_API zval* zend_object_proxy_get(zval *property TSRMLS_DC) +ZEND_API zval* zend_object_proxy_get(zval *property, zval *rv TSRMLS_DC) { zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { - return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, -1, NULL TSRMLS_CC); + return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, -1, rv TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); } -- cgit v1.2.1 From d85e39cf4ab0e4c7c1ccd2a05741c4e2dc14d34b Mon Sep 17 00:00:00 2001 From: Xinchen Hui Date: Fri, 16 May 2014 19:11:38 +0800 Subject: Fixed invalid read in ext/pdo/tests/pdo_025.phpt(pgsql) --- Zend/zend_objects_API.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index bd6673c0bb..01a403f66c 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -79,7 +79,7 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects zend_uint i; /* Free object properties but don't free object their selves */ - for (i = 1; i < objects->top ; i++) { + for (i = objects->top - 1; i > 0 ; i--) { zend_object *obj = objects->object_buckets[i]; if (IS_OBJ_VALID(obj)) { -- cgit v1.2.1 From 2ed8a170456c085491670a9beb62d4a6cac0903b Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Mon, 7 Jul 2014 20:54:31 +0400 Subject: Refactored run_time_cache usage in object handlers --- Zend/zend_objects_API.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 01a403f66c..c1b2f3ba6e 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -270,7 +270,7 @@ ZEND_API void zend_object_proxy_set(zval *property, zval *value TSRMLS_DC) zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->write_property) { - Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, -1 TSRMLS_CC); + Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, NULL TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot write property of object - no write handler defined"); } @@ -281,7 +281,7 @@ ZEND_API zval* zend_object_proxy_get(zval *property, zval *rv TSRMLS_DC) zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { - return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, -1, rv TSRMLS_CC); + return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, NULL, rv TSRMLS_CC); } else { zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); } -- cgit v1.2.1 From 6f9f0bf2056f0dc17d9bcc6dd3b7d28ac878c6fc Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Mon, 25 Aug 2014 19:28:33 +0200 Subject: master renames phase 2 --- Zend/zend_objects_API.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index c1b2f3ba6e..50930df20d 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -25,7 +25,7 @@ #include "zend_API.h" #include "zend_objects_API.h" -ZEND_API void zend_objects_store_init(zend_objects_store *objects, zend_uint init_size) +ZEND_API void zend_objects_store_init(zend_objects_store *objects, uint32_t init_size) { objects->object_buckets = (zend_object **) emalloc(init_size * sizeof(zend_object*)); objects->top = 1; /* Skip 0 so that handles are true */ @@ -42,7 +42,7 @@ ZEND_API void zend_objects_store_destroy(zend_objects_store *objects) ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TSRMLS_DC) { - zend_uint i; + uint32_t i; for (i = 1; i < objects->top ; i++) { zend_object *obj = objects->object_buckets[i]; @@ -60,7 +60,7 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSRMLS_DC) { - zend_uint i; + uint32_t i; if (!objects->object_buckets) { return; @@ -76,7 +76,7 @@ ZEND_API void zend_objects_store_mark_destructed(zend_objects_store *objects TSR ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects TSRMLS_DC) { - zend_uint i; + uint32_t i; /* Free object properties but don't free object their selves */ for (i = objects->top - 1; i > 0 ; i--) { @@ -134,7 +134,7 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC) ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC) /* {{{ */ { - zend_uint handle = object->handle; + uint32_t handle = object->handle; void *ptr = ((char*)object) - object->handlers->offset; GC_REMOVE_FROM_BUFFER(object); @@ -169,7 +169,7 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */ } if (GC_REFCOUNT(object) == 0) { - zend_uint handle = object->handle; + uint32_t handle = object->handle; void *ptr; EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object); -- cgit v1.2.1 From 116c5ecda1bc276c421b9598a9c8cd845f7efe84 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 9 Oct 2014 14:01:08 +0200 Subject: Remove proxy object implementation --- Zend/zend_objects_API.c | 96 ------------------------------------------------- 1 file changed, 96 deletions(-) (limited to 'Zend/zend_objects_API.c') diff --git a/Zend/zend_objects_API.c b/Zend/zend_objects_API.c index 50930df20d..04dd82b6a0 100644 --- a/Zend/zend_objects_API.c +++ b/Zend/zend_objects_API.c @@ -219,107 +219,11 @@ ZEND_API void zend_object_store_ctor_failed(zend_object *obj TSRMLS_DC) GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; } -/* Proxy objects workings */ -typedef struct _zend_proxy_object { - zend_object std; - zval object; - zval property; -} zend_proxy_object; - -static zend_object_handlers zend_object_proxy_handlers; - -ZEND_API void zend_objects_proxy_destroy(zend_object *object TSRMLS_DC) -{ -} - -ZEND_API void zend_objects_proxy_free_storage(zend_proxy_object *object TSRMLS_DC) -{ - zval_ptr_dtor(&object->object); - zval_ptr_dtor(&object->property); - efree(object); -} - -ZEND_API void zend_objects_proxy_clone(zend_proxy_object *object, zend_proxy_object **object_clone TSRMLS_DC) -{ - *object_clone = emalloc(sizeof(zend_proxy_object)); - (*object_clone)->object = object->object; - (*object_clone)->property = object->property; - Z_ADDREF_P(&(*object_clone)->property); - Z_ADDREF_P(&(*object_clone)->object); -} - -ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS_DC) -{ - zend_proxy_object *obj = emalloc(sizeof(zend_proxy_object)); - - GC_REFCOUNT(obj) = 1; - GC_TYPE_INFO(obj) = IS_OBJECT; - obj->std.ce = NULL; - obj->std.properties = NULL; - obj->std.guards = NULL; - obj->std.handlers = &zend_object_proxy_handlers; - - ZVAL_COPY(&obj->object, object); - ZVAL_DUP(&obj->property, member); - - return (zend_object*)obj; -} - -ZEND_API void zend_object_proxy_set(zval *property, zval *value TSRMLS_DC) -{ - zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); - - if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->write_property) { - Z_OBJ_HT(probj->object)->write_property(&probj->object, &probj->property, value, NULL TSRMLS_CC); - } else { - zend_error(E_WARNING, "Cannot write property of object - no write handler defined"); - } -} - -ZEND_API zval* zend_object_proxy_get(zval *property, zval *rv TSRMLS_DC) -{ - zend_proxy_object *probj = (zend_proxy_object*)Z_OBJ_P(property); - - if (Z_OBJ_HT(probj->object) && Z_OBJ_HT(probj->object)->read_property) { - return Z_OBJ_HT(probj->object)->read_property(&probj->object, &probj->property, BP_VAR_R, NULL, rv TSRMLS_CC); - } else { - zend_error(E_WARNING, "Cannot read property of object - no read handler defined"); - } - - return NULL; -} - ZEND_API zend_object_handlers *zend_get_std_object_handlers(void) { return &std_object_handlers; } -static zend_object_handlers zend_object_proxy_handlers = { - ZEND_OBJECTS_STORE_HANDLERS, - - NULL, /* read_property */ - NULL, /* write_property */ - NULL, /* read dimension */ - NULL, /* write_dimension */ - NULL, /* get_property_ptr_ptr */ - zend_object_proxy_get, /* get */ - zend_object_proxy_set, /* set */ - NULL, /* has_property */ - NULL, /* unset_property */ - NULL, /* has_dimension */ - NULL, /* unset_dimension */ - NULL, /* get_properties */ - NULL, /* get_method */ - NULL, /* call_method */ - NULL, /* get_constructor */ - NULL, /* get_class_entry */ - NULL, /* get_class_name */ - NULL, /* compare_objects */ - NULL, /* cast_object */ - NULL, /* count_elements */ -}; - - /* * Local variables: * tab-width: 4 -- cgit v1.2.1