Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 22 additions & 27 deletions Zend/zend_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -1345,54 +1345,49 @@ static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint3
Z_TYPE_INFO_P(z) = _IS_ERROR; \
} while (0)

#define Z_REFCOUNT_P(pz) zval_refcount_p(pz)
#define Z_SET_REFCOUNT_P(pz, rc) zval_set_refcount_p(pz, rc)
#define Z_ADDREF_P(pz) zval_addref_p(pz)
#define Z_DELREF_P(pz) zval_delref_p(pz)

#define Z_REFCOUNT(z) Z_REFCOUNT_P(&(z))
#define Z_SET_REFCOUNT(z, rc) Z_SET_REFCOUNT_P(&(z), rc)
#define Z_ADDREF(z) Z_ADDREF_P(&(z))
#define Z_DELREF(z) Z_DELREF_P(&(z))

#define Z_TRY_ADDREF_P(pz) do { \
zval *_pz = (pz); \
if (Z_REFCOUNTED_P(_pz)) { \
Z_ADDREF_P(_pz); \
} \
} while (0)

#define Z_TRY_DELREF_P(pz) do { \
zval *_pz = (pz); \
if (Z_REFCOUNTED_P(_pz)) { \
Z_DELREF_P(_pz); \
} \
} while (0)

#define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z))
#define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z))

static zend_always_inline uint32_t zval_refcount_p(const zval* pz) {
#if ZEND_DEBUG
ZEND_ASSERT(Z_REFCOUNTED_P(pz) || Z_TYPE_P(pz) == IS_ARRAY);
#endif
return GC_REFCOUNT(Z_COUNTED_P(pz));
}
static zend_always_inline uint32_t Z_REFCOUNT_P(const zval *z) { return zval_refcount_p(z); }

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it's worth creating inline functions for pure aliases - the type is anyway forwarded directly.

This is sort of just odd to me...

@bwoebi bwoebi Jun 14, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the try_addref_p/try_delref_p ones are fine.

#define Z_REFCOUNT(z) Z_REFCOUNT_P(&(z))

static zend_always_inline uint32_t zval_set_refcount_p(zval* pz, uint32_t rc) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
return GC_SET_REFCOUNT(Z_COUNTED_P(pz), rc);
}
static zend_always_inline uint32_t Z_SET_REFCOUNT_P(zval *z, uint32_t rc) { return zval_set_refcount_p(z, rc); }
#define Z_SET_REFCOUNT(z, rc) Z_SET_REFCOUNT_P(&(z), rc)

static zend_always_inline uint32_t zval_addref_p(zval* pz) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
return GC_ADDREF(Z_COUNTED_P(pz));
}
static zend_always_inline uint32_t Z_ADDREF_P(zval *z) { return zval_addref_p(z); }
#define Z_ADDREF(z) Z_ADDREF_P(&(z))

static zend_always_inline uint32_t zval_delref_p(zval* pz) {
ZEND_ASSERT(Z_REFCOUNTED_P(pz));
return GC_DELREF(Z_COUNTED_P(pz));
}
static zend_always_inline uint32_t Z_DELREF_P(zval *z) { return zval_delref_p(z); }
#define Z_DELREF(z) Z_DELREF_P(&(z))

static zend_always_inline void Z_TRY_ADDREF_P(zval *z) {
if (Z_REFCOUNTED_P(z)) {
Z_ADDREF_P(z);
}
}
#define Z_TRY_ADDREF(z) Z_TRY_ADDREF_P(&(z))

static zend_always_inline void Z_TRY_DELREF_P(zval *z) {
if (Z_REFCOUNTED_P(z)) {
Z_DELREF_P(z);
}
}
#define Z_TRY_DELREF(z) Z_TRY_DELREF_P(&(z))

#if SIZEOF_SIZE_T == 4
# define ZVAL_COPY_VALUE_EX(z, v, gc, t) \
Expand Down
Loading