Skip to content

Commit bb3d445

Browse files
committed
Change GC_COLLECTABLE flag into GC_NOT_COLLECTABLE to simplify GC_MAY_LEAK() check
1 parent 18f2ef0 commit bb3d445

14 files changed

+36
-34
lines changed

Zend/zend_ast.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -846,7 +846,7 @@ ZEND_API zend_ast_ref * ZEND_FASTCALL zend_ast_copy(zend_ast *ast)
846846
ref = emalloc(tree_size);
847847
zend_ast_tree_copy(ast, GC_AST(ref));
848848
GC_SET_REFCOUNT(ref, 1);
849-
GC_TYPE_INFO(ref) = IS_CONSTANT_AST;
849+
GC_TYPE_INFO(ref) = GC_CONSTANT_AST;
850850
return ref;
851851
}
852852

Zend/zend_gc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ ZEND_API int zend_gc_collect_cycles(void)
15741574
zend_object *obj = (zend_object*)p;
15751575

15761576
EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
1577-
GC_TYPE_INFO(obj) = IS_NULL |
1577+
GC_TYPE_INFO(obj) = GC_NULL |
15781578
(GC_TYPE_INFO(obj) & ~GC_TYPE_MASK);
15791579
/* Modify current before calling free_obj (bug #78811: free_obj() can cause the root buffer (with current) to be reallocated.) */
15801580
current->ref = GC_MAKE_GARBAGE(((char*)obj) - obj->handlers->offset);
@@ -1589,7 +1589,7 @@ ZEND_API int zend_gc_collect_cycles(void)
15891589
} else if (GC_TYPE(p) == IS_ARRAY) {
15901590
zend_array *arr = (zend_array*)p;
15911591

1592-
GC_TYPE_INFO(arr) = IS_NULL |
1592+
GC_TYPE_INFO(arr) = GC_NULL |
15931593
(GC_TYPE_INFO(arr) & ~GC_TYPE_MASK);
15941594

15951595
/* GC may destroy arrays with rc>1. This is valid and safe. */

Zend/zend_gc.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,11 @@ END_EXTERN_C()
6666

6767
#define GC_MAY_LEAK(ref) \
6868
((GC_TYPE_INFO(ref) & \
69-
(GC_INFO_MASK | (GC_COLLECTABLE << GC_FLAGS_SHIFT))) == \
70-
(GC_COLLECTABLE << GC_FLAGS_SHIFT))
69+
(GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))) == 0)
7170

7271
static zend_always_inline void gc_check_possible_root(zend_refcounted *ref)
7372
{
74-
if (EXPECTED(GC_TYPE_INFO(ref) == IS_REFERENCE)) {
73+
if (EXPECTED(GC_TYPE_INFO(ref) == GC_REFERENCE)) {
7574
zval *zv = &((zend_reference*)ref)->val;
7675

7776
if (!Z_COLLECTABLE_P(zv)) {

Zend/zend_hash.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ ZEND_API const HashTable zend_empty_array = {
249249
static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
250250
{
251251
GC_SET_REFCOUNT(ht, 1);
252-
GC_TYPE_INFO(ht) = IS_ARRAY | (persistent ? (GC_PERSISTENT << GC_FLAGS_SHIFT) : (GC_COLLECTABLE << GC_FLAGS_SHIFT));
252+
GC_TYPE_INFO(ht) = GC_ARRAY | (persistent ? ((GC_PERSISTENT|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT) : 0);
253253
HT_FLAGS(ht) = HASH_FLAG_UNINITIALIZED;
254254
ht->nTableMask = HT_MIN_MASK;
255255
HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
@@ -1618,7 +1618,7 @@ ZEND_API void ZEND_FASTCALL zend_array_destroy(HashTable *ht)
16181618

16191619
/* break possible cycles */
16201620
GC_REMOVE_FROM_BUFFER(ht);
1621-
GC_TYPE_INFO(ht) = IS_NULL /*???| (GC_WHITE << 16)*/;
1621+
GC_TYPE_INFO(ht) = GC_NULL /*???| (GC_WHITE << 16)*/;
16221622

16231623
if (ht->nNumUsed) {
16241624
/* In some rare cases destructors of regular arrays may be changed */
@@ -2071,7 +2071,7 @@ ZEND_API HashTable* ZEND_FASTCALL zend_array_dup(HashTable *source)
20712071

20722072
ALLOC_HASHTABLE(target);
20732073
GC_SET_REFCOUNT(target, 1);
2074-
GC_TYPE_INFO(target) = IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
2074+
GC_TYPE_INFO(target) = GC_ARRAY;
20752075

20762076
target->pDestructor = ZVAL_PTR_DTOR;
20772077

Zend/zend_objects.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
static zend_always_inline void _zend_object_std_init(zend_object *object, zend_class_entry *ce)
3030
{
3131
GC_SET_REFCOUNT(object, 1);
32-
GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
32+
GC_TYPE_INFO(object) = GC_OBJECT;
3333
object->ce = ce;
3434
object->properties = NULL;
3535
zend_objects_store_put(object);

Zend/zend_string.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ END_EXTERN_C()
8686
#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \
8787
(str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \
8888
GC_SET_REFCOUNT(str, 1); \
89-
GC_TYPE_INFO(str) = IS_STRING; \
89+
GC_TYPE_INFO(str) = GC_STRING; \
9090
ZSTR_H(str) = 0; \
9191
ZSTR_LEN(str) = _len; \
9292
} while (0)
@@ -141,7 +141,7 @@ static zend_always_inline zend_string *zend_string_alloc(size_t len, int persist
141141
zend_string *ret = (zend_string *)pemalloc(ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent);
142142

143143
GC_SET_REFCOUNT(ret, 1);
144-
GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
144+
GC_TYPE_INFO(ret) = GC_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
145145
ZSTR_H(ret) = 0;
146146
ZSTR_LEN(ret) = len;
147147
return ret;
@@ -152,7 +152,7 @@ static zend_always_inline zend_string *zend_string_safe_alloc(size_t n, size_t m
152152
zend_string *ret = (zend_string *)safe_pemalloc(n, m, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(l)), persistent);
153153

154154
GC_SET_REFCOUNT(ret, 1);
155-
GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
155+
GC_TYPE_INFO(ret) = GC_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
156156
ZSTR_H(ret) = 0;
157157
ZSTR_LEN(ret) = (n * m) + l;
158158
return ret;

Zend/zend_types.h

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -653,14 +653,19 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
653653
#define Z_GC_TYPE_INFO_P(zval_p) Z_GC_TYPE_INFO(*(zval_p))
654654

655655
/* zval_gc_flags(zval.value->gc.u.type_info) (common flags) */
656-
#define GC_COLLECTABLE (1<<4)
656+
#define GC_NOT_COLLECTABLE (1<<4)
657657
#define GC_PROTECTED (1<<5) /* used for recursion detection */
658658
#define GC_IMMUTABLE (1<<6) /* can't be changed in place */
659659
#define GC_PERSISTENT (1<<7) /* allocated using malloc */
660660
#define GC_PERSISTENT_LOCAL (1<<8) /* persistent, but thread-local */
661661

662-
#define GC_ARRAY (IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
663-
#define GC_OBJECT (IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
662+
#define GC_NULL (IS_NULL | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
663+
#define GC_STRING (IS_STRING | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
664+
#define GC_ARRAY IS_ARRAY
665+
#define GC_OBJECT IS_OBJECT
666+
#define GC_RESOURCE (IS_RESOURCE | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
667+
#define GC_REFERENCE (IS_REFERENCE | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
668+
#define GC_CONSTANT_AST (IS_CONSTANT_AST | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
664669

665670
/* zval.u1.v.type_flags */
666671
#define IS_TYPE_REFCOUNTED (1<<0)
@@ -974,7 +979,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
974979
(zend_resource *) emalloc(sizeof(zend_resource)); \
975980
zval *__z; \
976981
GC_SET_REFCOUNT(_res, 1); \
977-
GC_TYPE_INFO(_res) = IS_RESOURCE; \
982+
GC_TYPE_INFO(_res) = GC_RESOURCE; \
978983
_res->handle = (h); \
979984
_res->type = (t); \
980985
_res->ptr = (p); \
@@ -988,7 +993,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
988993
(zend_resource *) malloc(sizeof(zend_resource)); \
989994
zval *__z; \
990995
GC_SET_REFCOUNT(_res, 1); \
991-
GC_TYPE_INFO(_res) = IS_RESOURCE | \
996+
GC_TYPE_INFO(_res) = GC_RESOURCE | \
992997
(GC_PERSISTENT << GC_FLAGS_SHIFT); \
993998
_res->handle = (h); \
994999
_res->type = (t); \
@@ -1008,7 +1013,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
10081013
zend_reference *_ref = \
10091014
(zend_reference *) emalloc(sizeof(zend_reference)); \
10101015
GC_SET_REFCOUNT(_ref, 1); \
1011-
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
1016+
GC_TYPE_INFO(_ref) = GC_REFERENCE; \
10121017
_ref->sources.ptr = NULL; \
10131018
Z_REF_P(z) = _ref; \
10141019
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
@@ -1018,7 +1023,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
10181023
zend_reference *_ref = \
10191024
(zend_reference *) emalloc(sizeof(zend_reference)); \
10201025
GC_SET_REFCOUNT(_ref, 1); \
1021-
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
1026+
GC_TYPE_INFO(_ref) = GC_REFERENCE; \
10221027
ZVAL_COPY_VALUE(&_ref->val, r); \
10231028
_ref->sources.ptr = NULL; \
10241029
Z_REF_P(z) = _ref; \
@@ -1030,7 +1035,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
10301035
zend_reference *_ref = \
10311036
(zend_reference *) emalloc(sizeof(zend_reference)); \
10321037
GC_SET_REFCOUNT(_ref, (refcount)); \
1033-
GC_TYPE_INFO(_ref) = IS_REFERENCE; \
1038+
GC_TYPE_INFO(_ref) = GC_REFERENCE; \
10341039
ZVAL_COPY_VALUE(&_ref->val, _z); \
10351040
_ref->sources.ptr = NULL; \
10361041
Z_REF_P(_z) = _ref; \
@@ -1041,7 +1046,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) {
10411046
zend_reference *_ref = \
10421047
(zend_reference *) malloc(sizeof(zend_reference)); \
10431048
GC_SET_REFCOUNT(_ref, 1); \
1044-
GC_TYPE_INFO(_ref) = IS_REFERENCE | \
1049+
GC_TYPE_INFO(_ref) = GC_REFERENCE | \
10451050
(GC_PERSISTENT << GC_FLAGS_SHIFT); \
10461051
ZVAL_COPY_VALUE(&_ref->val, r); \
10471052
_ref->sources.ptr = NULL; \

Zend/zend_vm_def.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8250,7 +8250,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, UNUSED, REF)
82508250
if (UNEXPECTED(!Z_ISREF_P(value))) {
82518251
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
82528252
GC_SET_REFCOUNT(ref, 2);
8253-
GC_TYPE_INFO(ref) = IS_REFERENCE;
8253+
GC_TYPE_INFO(ref) = GC_REFERENCE;
82548254
ZVAL_COPY_VALUE(&ref->val, value);
82558255
ref->sources.ptr = NULL;
82568256
Z_REF_P(value) = ref;

Zend/zend_vm_execute.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45113,7 +45113,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_UNUSED_HAN
4511345113
if (UNEXPECTED(!Z_ISREF_P(value))) {
4511445114
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
4511545115
GC_SET_REFCOUNT(ref, 2);
45116-
GC_TYPE_INFO(ref) = IS_REFERENCE;
45116+
GC_TYPE_INFO(ref) = GC_REFERENCE;
4511745117
ZVAL_COPY_VALUE(&ref->val, value);
4511845118
ref->sources.ptr = NULL;
4511945119
Z_REF_P(value) = ref;

ext/ffi/ffi.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ static zend_always_inline void zend_ffi_type_dtor(zend_ffi_type *type) /* {{{ */
231231
static zend_always_inline void zend_ffi_object_init(zend_object *object, zend_class_entry *ce) /* {{{ */
232232
{
233233
GC_SET_REFCOUNT(object, 1);
234-
GC_TYPE_INFO(object) = IS_OBJECT | ((GC_COLLECTABLE | IS_OBJ_DESTRUCTOR_CALLED) << GC_FLAGS_SHIFT);
234+
GC_TYPE_INFO(object) = GC_OBJECT | (IS_OBJ_DESTRUCTOR_CALLED << GC_FLAGS_SHIFT);
235235
object->ce = ce;
236236
object->properties = NULL;
237237
zend_objects_store_put(object);

ext/opcache/ZendAccelerator.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ zend_string* ZEND_FASTCALL accel_new_interned_string(zend_string *str)
507507
STRTAB_COLLISION(s) = *hash_slot;
508508
*hash_slot = STRTAB_STR_TO_POS(&ZCSG(interned_strings), s);
509509
GC_SET_REFCOUNT(s, 1);
510-
GC_TYPE_INFO(s) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
510+
GC_TYPE_INFO(s) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
511511
ZSTR_H(s) = h;
512512
ZSTR_LEN(s) = ZSTR_LEN(str);
513513
memcpy(ZSTR_VAL(s), ZSTR_VAL(str), ZSTR_LEN(s) + 1);

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,9 +1253,7 @@ static void* dasm_labels[zend_lb_MAX];
12531253
|.endmacro
12541254

12551255
|.macro IF_GC_MAY_NOT_LEAK, ptr, tmp_reg, label
1256-
| mov tmp_reg, dword [ptr + 4]
1257-
| and tmp_reg, (GC_INFO_MASK | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
1258-
| cmp tmp_reg, (GC_COLLECTABLE << GC_FLAGS_SHIFT)
1256+
| test dword [ptr + 4],(GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
12591257
| jne label
12601258
|.endmacro
12611259

ext/opcache/zend_file_cache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ static void *zend_file_cache_unserialize_interned(zend_string *str, int in_shm)
280280
memcpy(ret, str, size);
281281
/* String wasn't interned but we will use it as interned anyway */
282282
GC_SET_REFCOUNT(ret, 1);
283-
GC_TYPE_INFO(ret) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERSISTENT | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
283+
GC_TYPE_INFO(ret) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERSISTENT | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
284284
}
285285
} else {
286286
ret = str;

ext/opcache/zend_persist.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,9 @@
3737

3838
#define zend_set_str_gc_flags(str) do { \
3939
if (file_cache_only) { \
40-
GC_TYPE_INFO(str) = IS_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT); \
40+
GC_TYPE_INFO(str) = GC_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT); \
4141
} else { \
42-
GC_TYPE_INFO(str) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT); \
42+
GC_TYPE_INFO(str) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT); \
4343
} \
4444
} while (0)
4545

@@ -286,7 +286,7 @@ static HashTable *zend_persist_attributes(HashTable *attributes)
286286

287287
ptr = zend_shared_memdup_put_free(attributes, sizeof(HashTable));
288288
GC_SET_REFCOUNT(ptr, 2);
289-
GC_TYPE_INFO(ptr) = IS_ARRAY | (IS_ARRAY_IMMUTABLE << GC_FLAGS_SHIFT);
289+
GC_TYPE_INFO(ptr) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
290290
}
291291

292292
return ptr;
@@ -456,7 +456,7 @@ static void zend_persist_op_array_ex(zend_op_array *op_array, zend_persistent_sc
456456
op_array->static_variables = zend_shared_memdup_put_free(op_array->static_variables, sizeof(HashTable));
457457
/* make immutable array */
458458
GC_SET_REFCOUNT(op_array->static_variables, 2);
459-
GC_TYPE_INFO(op_array->static_variables) = IS_ARRAY | (IS_ARRAY_IMMUTABLE << GC_FLAGS_SHIFT);
459+
GC_TYPE_INFO(op_array->static_variables) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
460460
}
461461
ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);
462462

0 commit comments

Comments
 (0)