Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros.

This commit is contained in:
Dmitry Stogov 2018-10-17 11:05:43 +03:00
parent 9ef07c88bd
commit 8dadca8864
2 changed files with 11 additions and 5 deletions

View file

@ -1676,7 +1676,7 @@ ZEND_API void *zend_map_ptr_new(void)
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
return ptr;
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
return (void*)((CG(map_ptr_last) * sizeof(void*)) - (sizeof(void*) - 1));
return ZEND_MAP_PTR_PTR2OFFSET(ptr);
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif

View file

@ -51,13 +51,19 @@
ptr ## __ptr
# define ZEND_MAP_PTR_DEF(type, name) \
type * ZEND_MAP_PTR(name)
# define ZEND_MAP_PTR_IS_OFFSET(ptr) \
(((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
# define ZEND_MAP_PTR_OFFSET2PTR(ptr) \
((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr) - 1))
# define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
((void*)((uintptr_t)(((char*)(ptr)) - ((char*)CG(map_ptr_base))) | 1L))
# define ZEND_MAP_PTR_GET(ptr) \
((((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L) ? \
*(void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr) - 1) : \
(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
*(ZEND_MAP_PTR_OFFSET2PTR(ptr)) : \
(void*)(*(ZEND_MAP_PTR(ptr))))
# define ZEND_MAP_PTR_SET(ptr, val) do { \
if (((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L) { \
*(void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr) - 1) = (val); \
if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
*(ZEND_MAP_PTR_OFFSET2PTR(ptr)) = (val); \
} else { \
*(ZEND_MAP_PTR(ptr)) = (val); \
} \