ref = emalloc(tree_size);
zend_ast_tree_copy(ast, GC_AST(ref));
GC_SET_REFCOUNT(ref, 1);
- GC_TYPE_INFO(ref) = IS_CONSTANT_AST;
+ GC_TYPE_INFO(ref) = GC_CONSTANT_AST;
return ref;
}
zend_object *obj = (zend_object*)p;
EG(objects_store).object_buckets[obj->handle] = SET_OBJ_INVALID(obj);
- GC_TYPE_INFO(obj) = IS_NULL |
+ GC_TYPE_INFO(obj) = GC_NULL |
(GC_TYPE_INFO(obj) & ~GC_TYPE_MASK);
/* Modify current before calling free_obj (bug #78811: free_obj() can cause the root buffer (with current) to be reallocated.) */
current->ref = GC_MAKE_GARBAGE(((char*)obj) - obj->handlers->offset);
} else if (GC_TYPE(p) == IS_ARRAY) {
zend_array *arr = (zend_array*)p;
- GC_TYPE_INFO(arr) = IS_NULL |
+ GC_TYPE_INFO(arr) = GC_NULL |
(GC_TYPE_INFO(arr) & ~GC_TYPE_MASK);
/* GC may destroy arrays with rc>1. This is valid and safe. */
#define GC_MAY_LEAK(ref) \
((GC_TYPE_INFO(ref) & \
- (GC_INFO_MASK | (GC_COLLECTABLE << GC_FLAGS_SHIFT))) == \
- (GC_COLLECTABLE << GC_FLAGS_SHIFT))
+ (GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))) == 0)
static zend_always_inline void gc_check_possible_root(zend_refcounted *ref)
{
- if (EXPECTED(GC_TYPE_INFO(ref) == IS_REFERENCE)) {
+ if (EXPECTED(GC_TYPE_INFO(ref) == GC_REFERENCE)) {
zval *zv = &((zend_reference*)ref)->val;
if (!Z_COLLECTABLE_P(zv)) {
static zend_always_inline void _zend_hash_init_int(HashTable *ht, uint32_t nSize, dtor_func_t pDestructor, zend_bool persistent)
{
GC_SET_REFCOUNT(ht, 1);
- GC_TYPE_INFO(ht) = IS_ARRAY | (persistent ? (GC_PERSISTENT << GC_FLAGS_SHIFT) : (GC_COLLECTABLE << GC_FLAGS_SHIFT));
+ GC_TYPE_INFO(ht) = GC_ARRAY | (persistent ? ((GC_PERSISTENT|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT) : 0);
HT_FLAGS(ht) = HASH_FLAG_UNINITIALIZED;
ht->nTableMask = HT_MIN_MASK;
HT_SET_DATA_ADDR(ht, &uninitialized_bucket);
/* break possible cycles */
GC_REMOVE_FROM_BUFFER(ht);
- GC_TYPE_INFO(ht) = IS_NULL /*???| (GC_WHITE << 16)*/;
+ GC_TYPE_INFO(ht) = GC_NULL /*???| (GC_WHITE << 16)*/;
if (ht->nNumUsed) {
/* In some rare cases destructors of regular arrays may be changed */
ALLOC_HASHTABLE(target);
GC_SET_REFCOUNT(target, 1);
- GC_TYPE_INFO(target) = IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(target) = GC_ARRAY;
target->pDestructor = ZVAL_PTR_DTOR;
static zend_always_inline void _zend_object_std_init(zend_object *object, zend_class_entry *ce)
{
GC_SET_REFCOUNT(object, 1);
- GC_TYPE_INFO(object) = IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(object) = GC_OBJECT;
object->ce = ce;
object->properties = NULL;
zend_objects_store_put(object);
#define ZSTR_ALLOCA_ALLOC(str, _len, use_heap) do { \
(str) = (zend_string *)do_alloca(ZEND_MM_ALIGNED_SIZE_EX(_ZSTR_STRUCT_SIZE(_len), 8), (use_heap)); \
GC_SET_REFCOUNT(str, 1); \
- GC_TYPE_INFO(str) = IS_STRING; \
+ GC_TYPE_INFO(str) = GC_STRING; \
ZSTR_H(str) = 0; \
ZSTR_LEN(str) = _len; \
} while (0)
zend_string *ret = (zend_string *)pemalloc(ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(len)), persistent);
GC_SET_REFCOUNT(ret, 1);
- GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(ret) = GC_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
ZSTR_H(ret) = 0;
ZSTR_LEN(ret) = len;
return ret;
zend_string *ret = (zend_string *)safe_pemalloc(n, m, ZEND_MM_ALIGNED_SIZE(_ZSTR_STRUCT_SIZE(l)), persistent);
GC_SET_REFCOUNT(ret, 1);
- GC_TYPE_INFO(ret) = IS_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(ret) = GC_STRING | ((persistent ? IS_STR_PERSISTENT : 0) << GC_FLAGS_SHIFT);
ZSTR_H(ret) = 0;
ZSTR_LEN(ret) = (n * m) + l;
return ret;
#define Z_GC_TYPE_INFO_P(zval_p) Z_GC_TYPE_INFO(*(zval_p))
/* zval_gc_flags(zval.value->gc.u.type_info) (common flags) */
-#define GC_COLLECTABLE (1<<4)
+#define GC_NOT_COLLECTABLE (1<<4)
#define GC_PROTECTED (1<<5) /* used for recursion detection */
#define GC_IMMUTABLE (1<<6) /* can't be changed in place */
#define GC_PERSISTENT (1<<7) /* allocated using malloc */
#define GC_PERSISTENT_LOCAL (1<<8) /* persistent, but thread-local */
-#define GC_ARRAY (IS_ARRAY | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
-#define GC_OBJECT (IS_OBJECT | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
+#define GC_NULL (IS_NULL | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
+#define GC_STRING (IS_STRING | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
+#define GC_ARRAY IS_ARRAY
+#define GC_OBJECT IS_OBJECT
+#define GC_RESOURCE (IS_RESOURCE | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
+#define GC_REFERENCE (IS_REFERENCE | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
+#define GC_CONSTANT_AST (IS_CONSTANT_AST | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
/* zval.u1.v.type_flags */
#define IS_TYPE_REFCOUNTED (1<<0)
(zend_resource *) emalloc(sizeof(zend_resource)); \
zval *__z; \
GC_SET_REFCOUNT(_res, 1); \
- GC_TYPE_INFO(_res) = IS_RESOURCE; \
+ GC_TYPE_INFO(_res) = GC_RESOURCE; \
_res->handle = (h); \
_res->type = (t); \
_res->ptr = (p); \
(zend_resource *) malloc(sizeof(zend_resource)); \
zval *__z; \
GC_SET_REFCOUNT(_res, 1); \
- GC_TYPE_INFO(_res) = IS_RESOURCE | \
+ GC_TYPE_INFO(_res) = GC_RESOURCE | \
(GC_PERSISTENT << GC_FLAGS_SHIFT); \
_res->handle = (h); \
_res->type = (t); \
zend_reference *_ref = \
(zend_reference *) emalloc(sizeof(zend_reference)); \
GC_SET_REFCOUNT(_ref, 1); \
- GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ GC_TYPE_INFO(_ref) = GC_REFERENCE; \
_ref->sources.ptr = NULL; \
Z_REF_P(z) = _ref; \
Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \
zend_reference *_ref = \
(zend_reference *) emalloc(sizeof(zend_reference)); \
GC_SET_REFCOUNT(_ref, 1); \
- GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ GC_TYPE_INFO(_ref) = GC_REFERENCE; \
ZVAL_COPY_VALUE(&_ref->val, r); \
_ref->sources.ptr = NULL; \
Z_REF_P(z) = _ref; \
zend_reference *_ref = \
(zend_reference *) emalloc(sizeof(zend_reference)); \
GC_SET_REFCOUNT(_ref, (refcount)); \
- GC_TYPE_INFO(_ref) = IS_REFERENCE; \
+ GC_TYPE_INFO(_ref) = GC_REFERENCE; \
ZVAL_COPY_VALUE(&_ref->val, _z); \
_ref->sources.ptr = NULL; \
Z_REF_P(_z) = _ref; \
zend_reference *_ref = \
(zend_reference *) malloc(sizeof(zend_reference)); \
GC_SET_REFCOUNT(_ref, 1); \
- GC_TYPE_INFO(_ref) = IS_REFERENCE | \
+ GC_TYPE_INFO(_ref) = GC_REFERENCE | \
(GC_PERSISTENT << GC_FLAGS_SHIFT); \
ZVAL_COPY_VALUE(&_ref->val, r); \
_ref->sources.ptr = NULL; \
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
GC_SET_REFCOUNT(ref, 2);
- GC_TYPE_INFO(ref) = IS_REFERENCE;
+ GC_TYPE_INFO(ref) = GC_REFERENCE;
ZVAL_COPY_VALUE(&ref->val, value);
ref->sources.ptr = NULL;
Z_REF_P(value) = ref;
if (UNEXPECTED(!Z_ISREF_P(value))) {
zend_reference *ref = (zend_reference*)emalloc(sizeof(zend_reference));
GC_SET_REFCOUNT(ref, 2);
- GC_TYPE_INFO(ref) = IS_REFERENCE;
+ GC_TYPE_INFO(ref) = GC_REFERENCE;
ZVAL_COPY_VALUE(&ref->val, value);
ref->sources.ptr = NULL;
Z_REF_P(value) = ref;
static zend_always_inline void zend_ffi_object_init(zend_object *object, zend_class_entry *ce) /* {{{ */
{
GC_SET_REFCOUNT(object, 1);
- GC_TYPE_INFO(object) = IS_OBJECT | ((GC_COLLECTABLE | IS_OBJ_DESTRUCTOR_CALLED) << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(object) = GC_OBJECT | (IS_OBJ_DESTRUCTOR_CALLED << GC_FLAGS_SHIFT);
object->ce = ce;
object->properties = NULL;
zend_objects_store_put(object);
STRTAB_COLLISION(s) = *hash_slot;
*hash_slot = STRTAB_STR_TO_POS(&ZCSG(interned_strings), s);
GC_SET_REFCOUNT(s, 1);
- GC_TYPE_INFO(s) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(s) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
ZSTR_H(s) = h;
ZSTR_LEN(s) = ZSTR_LEN(str);
memcpy(ZSTR_VAL(s), ZSTR_VAL(str), ZSTR_LEN(s) + 1);
|.endmacro
|.macro IF_GC_MAY_NOT_LEAK, ptr, tmp_reg, label
-| mov tmp_reg, dword [ptr + 4]
-| and tmp_reg, (GC_INFO_MASK | (GC_COLLECTABLE << GC_FLAGS_SHIFT))
-| cmp tmp_reg, (GC_COLLECTABLE << GC_FLAGS_SHIFT)
+| test dword [ptr + 4],(GC_INFO_MASK | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
| jne label
|.endmacro
memcpy(ret, str, size);
/* String wasn't interned but we will use it as interned anyway */
GC_SET_REFCOUNT(ret, 1);
- GC_TYPE_INFO(ret) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERSISTENT | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(ret) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERSISTENT | IS_STR_PERMANENT) << GC_FLAGS_SHIFT);
}
} else {
ret = str;
#define zend_set_str_gc_flags(str) do { \
if (file_cache_only) { \
- GC_TYPE_INFO(str) = IS_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT); \
+ GC_TYPE_INFO(str) = GC_STRING | (IS_STR_INTERNED << GC_FLAGS_SHIFT); \
} else { \
- GC_TYPE_INFO(str) = IS_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT); \
+ GC_TYPE_INFO(str) = GC_STRING | ((IS_STR_INTERNED | IS_STR_PERMANENT) << GC_FLAGS_SHIFT); \
} \
} while (0)
ptr = zend_shared_memdup_put_free(attributes, sizeof(HashTable));
GC_SET_REFCOUNT(ptr, 2);
- GC_TYPE_INFO(ptr) = IS_ARRAY | (IS_ARRAY_IMMUTABLE << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(ptr) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
}
return ptr;
op_array->static_variables = zend_shared_memdup_put_free(op_array->static_variables, sizeof(HashTable));
/* make immutable array */
GC_SET_REFCOUNT(op_array->static_variables, 2);
- GC_TYPE_INFO(op_array->static_variables) = IS_ARRAY | (IS_ARRAY_IMMUTABLE << GC_FLAGS_SHIFT);
+ GC_TYPE_INFO(op_array->static_variables) = GC_ARRAY | ((IS_ARRAY_IMMUTABLE|GC_NOT_COLLECTABLE) << GC_FLAGS_SHIFT);
}
ZEND_MAP_PTR_INIT(op_array->static_variables_ptr, &op_array->static_variables);