From 8dadca8864e66de70a24bdf1181bcf7dd8fb27d7 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 17 Oct 2018 11:05:43 +0300 Subject: [PATCH] Hide offset encoding magic in ZEND_MAP_PTR_IS_OFFSET(), ZEND_MAP_PTR_OFFSET2PTR() and ZEND_MAP_PTR_PTR2OFFSET() macros. --- Zend/zend.c | 2 +- Zend/zend_map_ptr.h | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 5962a276b05..1e4d2a0f421 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -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 diff --git a/Zend/zend_map_ptr.h b/Zend/zend_map_ptr.h index 0d5b8acd253..88872ab1fe5 100644 --- a/Zend/zend_map_ptr.h +++ b/Zend/zend_map_ptr.h @@ -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); \ } \