]> granicus.if.org Git - php/commitdiff
Switch to better GC address representation
authorDmitry Stogov <dmitry@zend.com>
Fri, 2 Mar 2018 14:36:18 +0000 (17:36 +0300)
committerDmitry Stogov <dmitry@zend.com>
Fri, 2 Mar 2018 14:36:18 +0000 (17:36 +0300)
Zend/zend_gc.c

index f5367363889c0eeb9ab172f9127b41c6e506dede..89aedfd5c2d0e582bcaacdea5600288ce8364051 100644 (file)
        ((void*)(((uintptr_t)(ptr)) | GC_GARBAGE))
 
 /* GC address conversion */
-#define GC_ADDR2NUM(addr)    (addr)
-#define GC_NUM2ADDR(num)     (num)
+#define GC_ADDR2NUM(addr)    ((addr) / sizeof(void*))
+#define GC_NUM2ADDR(num)     ((num) * sizeof(void*))
 
-#define GC_NEXT_ADDR(addr)   ((addr) + 1)
-#define GC_PREV_ADDR(addr)   ((addr) - 1)
+#define GC_NEXT_ADDR(addr)   ((addr) + sizeof(void*))
+#define GC_PREV_ADDR(addr)   ((addr) - sizeof(void*))
 
-#define GC_ADDR2PTR(addr)    (GC_G(buf) + (addr))
-#define GC_PTR2ADDR(ptr)     ((ptr) - GC_G(buf))
+#define GC_ADDR2PTR(addr)    ((gc_root_buffer*)(((char*)GC_G(buf)) + (addr)))
+#define GC_PTR2ADDR(ptr)     ((uint32_t)(((char*)(ptr)) - (char*)GC_G(buf)))
 
-#define GC_ADDR2LIST(addr)   ((void*)(uintptr_t)(((addr) * sizeof(void*)) | GC_UNUSED))
-#define GC_LIST2ADDR(list)   (((uint32_t)(uintptr_t)(list)) / sizeof(void*))
+#define GC_ADDR2LIST(addr)   ((void*)(uintptr_t)((addr) | GC_UNUSED))
+#define GC_LIST2ADDR(list)   (((uint32_t)(uintptr_t)(list)) - GC_UNUSED)
 
 /* GC buffers */
 #define GC_INVALID_NUM       0