Use OBJ_FLAGS() macro to access object flags (even if they are currently stored together with GC_FLAGS)

This commit is contained in:
Dmitry Stogov 2018-01-22 15:57:00 +03:00
parent 6fb5568b2d
commit b3e22da745
8 changed files with 29 additions and 27 deletions

View file

@ -379,7 +379,7 @@ tail_call:
zend_object_get_gc_t get_gc; zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref; zend_object *obj = (zend_object*)ref;
if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) && if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) { (get_gc = obj->handlers->get_gc) != NULL)) {
int n; int n;
zval *zv, *end; zval *zv, *end;
@ -489,7 +489,7 @@ tail_call:
zend_object_get_gc_t get_gc; zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref; zend_object *obj = (zend_object*)ref;
if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) && if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) { (get_gc = obj->handlers->get_gc) != NULL)) {
int n; int n;
zval *zv, *end; zval *zv, *end;
@ -602,7 +602,7 @@ tail_call:
zend_object_get_gc_t get_gc; zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref; zend_object *obj = (zend_object*)ref;
if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) && if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) { (get_gc = obj->handlers->get_gc) != NULL)) {
int n; int n;
zval *zv, *end; zval *zv, *end;
@ -764,7 +764,7 @@ tail_call:
zend_object_get_gc_t get_gc; zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref; zend_object *obj = (zend_object*)ref;
if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) && if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) { (get_gc = obj->handlers->get_gc) != NULL)) {
int n; int n;
zval *zv, *end; zval *zv, *end;
@ -956,7 +956,7 @@ tail_call:
zend_object_get_gc_t get_gc; zend_object_get_gc_t get_gc;
zend_object *obj = (zend_object*)ref; zend_object *obj = (zend_object*)ref;
if (EXPECTED(!(GC_FLAGS(ref) & IS_OBJ_FREE_CALLED) && if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED) &&
(get_gc = obj->handlers->get_gc) != NULL)) { (get_gc = obj->handlers->get_gc) != NULL)) {
int n; int n;
zval *zv, *end; zval *zv, *end;
@ -1112,9 +1112,9 @@ ZEND_API int zend_gc_collect_cycles(void)
if (GC_TYPE(p) == IS_OBJECT) { if (GC_TYPE(p) == IS_OBJECT) {
zend_object *obj = (zend_object*)p; zend_object *obj = (zend_object*)p;
if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) { if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
GC_TRACE_REF(obj, "calling destructor"); GC_TRACE_REF(obj, "calling destructor");
GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
if (obj->handlers->dtor_obj if (obj->handlers->dtor_obj
&& (obj->handlers->dtor_obj != zend_objects_destroy_object && (obj->handlers->dtor_obj != zend_objects_destroy_object
|| obj->ce->destructor)) { || obj->ce->destructor)) {
@ -1151,8 +1151,8 @@ ZEND_API int zend_gc_collect_cycles(void)
EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj); EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
GC_TYPE(obj) = IS_NULL; GC_TYPE(obj) = IS_NULL;
if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) { if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
if (obj->handlers->free_obj) { if (obj->handlers->free_obj) {
GC_ADDREF(obj); GC_ADDREF(obj);
obj->handlers->free_obj(obj); obj->handlers->free_obj(obj);

View file

@ -495,7 +495,7 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
zval *zv; zval *zv;
uint32_t *ptr; uint32_t *ptr;
ZEND_ASSERT(GC_FLAGS(zobj) & IS_OBJ_USE_GUARDS); ZEND_ASSERT(OBJ_FLAGS(zobj) & IS_OBJ_USE_GUARDS);
zv = zobj->properties_table + zobj->ce->default_properties_count; zv = zobj->properties_table + zobj->ce->default_properties_count;
if (EXPECTED(Z_TYPE_P(zv) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(zv) == IS_STRING)) {
zend_string *str = Z_STR_P(zv); zend_string *str = Z_STR_P(zv);
@ -526,7 +526,7 @@ ZEND_API uint32_t *zend_get_property_guard(zend_object *zobj, zend_string *membe
} }
} else { } else {
ZEND_ASSERT(Z_TYPE_P(zv) == IS_UNDEF); ZEND_ASSERT(Z_TYPE_P(zv) == IS_UNDEF);
GC_FLAGS(zobj) |= IS_OBJ_HAS_GUARDS; OBJ_FLAGS(zobj) |= IS_OBJ_HAS_GUARDS;
ZVAL_STR_COPY(zv, member); ZVAL_STR_COPY(zv, member);
zv->u2.property_guard = 0; zv->u2.property_guard = 0;
return &zv->u2.property_guard; return &zv->u2.property_guard;

View file

@ -35,7 +35,7 @@ ZEND_API void ZEND_FASTCALL zend_object_std_init(zend_object *object, zend_class
object->properties = NULL; object->properties = NULL;
zend_objects_store_put(object); zend_objects_store_put(object);
if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) { if (UNEXPECTED(ce->ce_flags & ZEND_ACC_USE_GUARDS)) {
GC_FLAGS(object) |= IS_OBJ_USE_GUARDS; OBJ_FLAGS(object) |= IS_OBJ_USE_GUARDS;
ZVAL_UNDEF(object->properties_table + object->ce->default_properties_count); ZVAL_UNDEF(object->properties_table + object->ce->default_properties_count);
} }
} }
@ -59,7 +59,7 @@ ZEND_API void zend_object_std_dtor(zend_object *object)
p++; p++;
} while (p != end); } while (p != end);
} }
if (UNEXPECTED(GC_FLAGS(object) & IS_OBJ_HAS_GUARDS)) { if (UNEXPECTED(OBJ_FLAGS(object) & IS_OBJ_HAS_GUARDS)) {
if (EXPECTED(Z_TYPE_P(p) == IS_STRING)) { if (EXPECTED(Z_TYPE_P(p) == IS_STRING)) {
zend_string_release(Z_STR_P(p)); zend_string_release(Z_STR_P(p));
} else { } else {

View file

@ -48,8 +48,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_call_destructors(zend_objects_sto
for (i = 1; i < objects->top; i++) { for (i = 1; i < objects->top; i++) {
zend_object *obj = objects->object_buckets[i]; zend_object *obj = objects->object_buckets[i];
if (IS_OBJ_VALID(obj)) { if (IS_OBJ_VALID(obj)) {
if (!(GC_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) { if (!(OBJ_FLAGS(obj) & IS_OBJ_DESTRUCTOR_CALLED)) {
GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
if (obj->handlers->dtor_obj if (obj->handlers->dtor_obj
&& (obj->handlers->dtor_obj != zend_objects_destroy_object && (obj->handlers->dtor_obj != zend_objects_destroy_object
@ -74,7 +74,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_mark_destructed(zend_objects_stor
zend_object *obj = *obj_ptr; zend_object *obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) { if (IS_OBJ_VALID(obj)) {
GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
} }
obj_ptr++; obj_ptr++;
} while (obj_ptr != end); } while (obj_ptr != end);
@ -98,8 +98,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
obj_ptr--; obj_ptr--;
obj = *obj_ptr; obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) { if (IS_OBJ_VALID(obj)) {
if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) { if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
if (obj->handlers->free_obj && obj->handlers->free_obj != zend_object_std_dtor) { if (obj->handlers->free_obj && obj->handlers->free_obj != zend_object_std_dtor) {
GC_ADDREF(obj); GC_ADDREF(obj);
obj->handlers->free_obj(obj); obj->handlers->free_obj(obj);
@ -113,8 +113,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_free_object_storage(zend_objects_
obj_ptr--; obj_ptr--;
obj = *obj_ptr; obj = *obj_ptr;
if (IS_OBJ_VALID(obj)) { if (IS_OBJ_VALID(obj)) {
if (!(GC_FLAGS(obj) & IS_OBJ_FREE_CALLED)) { if (!(OBJ_FLAGS(obj) & IS_OBJ_FREE_CALLED)) {
GC_FLAGS(obj) |= IS_OBJ_FREE_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_FREE_CALLED;
if (obj->handlers->free_obj) { if (obj->handlers->free_obj) {
GC_ADDREF(obj); GC_ADDREF(obj);
obj->handlers->free_obj(obj); obj->handlers->free_obj(obj);
@ -164,8 +164,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ *
ZEND_ASSERT(IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle])); ZEND_ASSERT(IS_OBJ_VALID(EG(objects_store).object_buckets[object->handle]));
ZEND_ASSERT(GC_REFCOUNT(object) == 0); ZEND_ASSERT(GC_REFCOUNT(object) == 0);
if (!(GC_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) { if (!(OBJ_FLAGS(object) & IS_OBJ_DESTRUCTOR_CALLED)) {
GC_FLAGS(object) |= IS_OBJ_DESTRUCTOR_CALLED; OBJ_FLAGS(object) |= IS_OBJ_DESTRUCTOR_CALLED;
if (object->handlers->dtor_obj if (object->handlers->dtor_obj
&& (object->handlers->dtor_obj != zend_objects_destroy_object && (object->handlers->dtor_obj != zend_objects_destroy_object
@ -181,8 +181,8 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object) /* {{{ *
void *ptr; void *ptr;
EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object); EG(objects_store).object_buckets[handle] = SET_OBJ_INVALID(object);
if (!(GC_FLAGS(object) & IS_OBJ_FREE_CALLED)) { if (!(OBJ_FLAGS(object) & IS_OBJ_FREE_CALLED)) {
GC_FLAGS(object) |= IS_OBJ_FREE_CALLED; OBJ_FLAGS(object) |= IS_OBJ_FREE_CALLED;
if (object->handlers->free_obj) { if (object->handlers->free_obj) {
GC_ADDREF(object); GC_ADDREF(object);
object->handlers->free_obj(object); object->handlers->free_obj(object);

View file

@ -62,7 +62,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_store_del(zend_object *object);
/* Called when the ctor was terminated by an exception */ /* Called when the ctor was terminated by an exception */
static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj) static zend_always_inline void zend_object_store_ctor_failed(zend_object *obj)
{ {
GC_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED; OBJ_FLAGS(obj) |= IS_OBJ_DESTRUCTOR_CALLED;
} }
#define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj #define ZEND_OBJECTS_STORE_HANDLERS 0, zend_object_std_dtor, zend_objects_destroy_object, zend_objects_clone_obj

View file

@ -498,6 +498,8 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) {
#define IS_OBJ_USE_GUARDS (1<<6) #define IS_OBJ_USE_GUARDS (1<<6)
#define IS_OBJ_HAS_GUARDS (1<<7) #define IS_OBJ_HAS_GUARDS (1<<7)
#define OBJ_FLAGS(obj) GC_FLAGS(obj)
/* Recursion protection macros must be used only for arrays and objects */ /* Recursion protection macros must be used only for arrays and objects */
#define GC_IS_RECURSIVE(p) \ #define GC_IS_RECURSIVE(p) \
(GC_FLAGS(p) & GC_PROTECTED) (GC_FLAGS(p) & GC_PROTECTED)

View file

@ -90,7 +90,7 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
if (!Z_ISUNDEF(stmt->database_object_handle) if (!Z_ISUNDEF(stmt->database_object_handle)
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)]) && IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
&& (!(GC_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) { && (!(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) {
while (mysql_more_results(S->H->server)) { while (mysql_more_results(S->H->server)) {
MYSQL_RES *res; MYSQL_RES *res;
if (mysql_next_result(S->H->server) != 0) { if (mysql_next_result(S->H->server) != 0) {

View file

@ -63,7 +63,7 @@ static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data; pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
zend_bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle) zend_bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)]) && IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
&& !(GC_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED); && !(OBJ_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED);
if (S->result) { if (S->result) {
/* free the resource */ /* free the resource */