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 #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
return ptr; return ptr;
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET #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 #else
# error "Unknown ZEND_MAP_PTR_KIND" # error "Unknown ZEND_MAP_PTR_KIND"
#endif #endif

View file

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