Skip to content

Commit 486ea52

Browse files
committed
Fix C++ build
1 parent 970c027 commit 486ea52

1 file changed

Lines changed: 13 additions & 3 deletions

File tree

‎Zend/zend_types.h‎

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -963,11 +963,21 @@ static zend_always_inline uint32_t zend_gc_delref_ex(zend_refcounted_h *p, uint3
963963
/* Fast class cache */
964964
static zend_always_inline bool zstr_has_ce_cache(const zend_string *s)
965965
{
966-
static_assert(sizeof(_Atomic uint32_t) == sizeof(uint32_t), "atomic size");
967-
static_assert(alignof(_Atomic uint32_t) == alignof(uint32_t), "atomic align");
966+
#ifdef __cplusplus
967+
# if defined(__GNUC__) || defined(__clang__)
968+
uint32_t type_info = __atomic_load_n(&GC_TYPE_INFO(s), __ATOMIC_ACQUIRE);
969+
# else
970+
uint32_t type_info = *(const volatile uint32_t *)&GC_TYPE_INFO(s);
971+
std::atomic_thread_fence(std::memory_order_acquire);
972+
# endif
973+
#else
974+
static_assert(sizeof(_Atomic(uint32_t)) == sizeof(uint32_t), "atomic size");
975+
static_assert(alignof(_Atomic(uint32_t)) == alignof(uint32_t), "atomic align");
968976
static_assert(ATOMIC_INT_LOCK_FREE == 2, "not always lock-free");
969977

970-
uint32_t type_info = atomic_load_explicit((_Atomic uint32_t *)&GC_TYPE_INFO(s), memory_order_acquire);
978+
uint32_t type_info = atomic_load_explicit((_Atomic(uint32_t) *)&GC_TYPE_INFO(s), memory_order_acquire);
979+
#endif
980+
971981
return (type_info & (IS_STR_CLASS_NAME_MAP_PTR << GC_FLAGS_SHIFT)) != 0;
972982
}
973983

0 commit comments

Comments
 (0)