zend_map_ptr.h 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. +----------------------------------------------------------------------+
  3. | Zend Engine |
  4. +----------------------------------------------------------------------+
  5. | Copyright (c) Zend Technologies Ltd. (http://www.zend.com) |
  6. +----------------------------------------------------------------------+
  7. | This source file is subject to version 2.00 of the Zend license, |
  8. | that is bundled with this package in the file LICENSE, and is |
  9. | available through the world-wide-web at the following url: |
  10. | http://www.zend.com/license/2_00.txt. |
  11. | If you did not receive a copy of the Zend license and are unable to |
  12. | obtain it through the world-wide-web, please send a note to |
  13. | license@zend.com so we can mail you a copy immediately. |
  14. +----------------------------------------------------------------------+
  15. | Authors: Dmitry Stogov <dmitry@php.net> |
  16. +----------------------------------------------------------------------+
  17. */
  18. #ifndef ZEND_MAP_PTR_H
  19. #define ZEND_MAP_PTR_H
  20. #include "zend_portability.h"
  21. #define ZEND_MAP_PTR_KIND_PTR 0
  22. #define ZEND_MAP_PTR_KIND_PTR_OR_OFFSET 1
  23. //#if defined(ZTS) || defined(TSRM_WIN32)
  24. # define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
  25. //#else
  26. //# define ZEND_MAP_PTR_KIND ZEND_MAP_PTR_KIND_PTR
  27. //#endif
  28. #define ZEND_MAP_PTR(ptr) \
  29. ptr ## __ptr
  30. #define ZEND_MAP_PTR_DEF(type, name) \
  31. type * ZEND_MAP_PTR(name)
  32. #define ZEND_MAP_PTR_OFFSET2PTR(offset) \
  33. ((void**)((char*)CG(map_ptr_base) + offset))
  34. #define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
  35. ((void*)(((char*)(ptr)) - ((char*)CG(map_ptr_base))))
  36. #define ZEND_MAP_PTR_INIT(ptr, val) do { \
  37. ZEND_MAP_PTR(ptr) = (val); \
  38. } while (0)
  39. #define ZEND_MAP_PTR_NEW(ptr) do { \
  40. ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
  41. } while (0)
  42. #if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
  43. # define ZEND_MAP_PTR_NEW_OFFSET() \
  44. ((uint32_t)(uintptr_t)ZEND_MAP_PTR_PTR2OFFSET(zend_map_ptr_new()))
  45. # define ZEND_MAP_PTR_GET(ptr) \
  46. (*(ZEND_MAP_PTR(ptr)))
  47. # define ZEND_MAP_PTR_GET_IMM(ptr) \
  48. ZEND_MAP_PTR_GET(ptr)
  49. # define ZEND_MAP_PTR_SET(ptr, val) do { \
  50. (*(ZEND_MAP_PTR(ptr))) = (val); \
  51. } while (0)
  52. # define ZEND_MAP_PTR_SET_IMM(ptr, val) \
  53. ZEND_MAP_PTR_SET(ptr, val)
  54. # define ZEND_MAP_PTR_BIASED_BASE(real_base) \
  55. (real_base)
  56. #elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
  57. # define ZEND_MAP_PTR_NEW_OFFSET() \
  58. ((uint32_t)(uintptr_t)zend_map_ptr_new())
  59. # define ZEND_MAP_PTR_IS_OFFSET(ptr) \
  60. (((uintptr_t)ZEND_MAP_PTR(ptr)) & 1L)
  61. # define ZEND_MAP_PTR_GET(ptr) \
  62. (*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
  63. ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)) : \
  64. ((void**)(ZEND_MAP_PTR(ptr)))))
  65. # define ZEND_MAP_PTR_GET_IMM(ptr) \
  66. (*ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)))
  67. # define ZEND_MAP_PTR_SET(ptr, val) do { \
  68. void **__p = (void**)(ZEND_MAP_PTR(ptr)); \
  69. if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
  70. __p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \
  71. } \
  72. *__p = (val); \
  73. } while (0)
  74. # define ZEND_MAP_PTR_SET_IMM(ptr, val) do { \
  75. void **__p = ZEND_MAP_PTR_OFFSET2PTR((uintptr_t)ZEND_MAP_PTR(ptr)); \
  76. *__p = (val); \
  77. } while (0)
  78. # define ZEND_MAP_PTR_BIASED_BASE(real_base) \
  79. ((void*)(((uintptr_t)(real_base)) - 1))
  80. #else
  81. # error "Unknown ZEND_MAP_PTR_KIND"
  82. #endif
  83. ZEND_API void zend_map_ptr_reset(void);
  84. ZEND_API void *zend_map_ptr_new(void);
  85. ZEND_API void zend_map_ptr_extend(size_t last);
  86. ZEND_API void zend_alloc_ce_cache(zend_string *type_name);
  87. #endif /* ZEND_MAP_PTR_H */