#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
/* Map region is going to be created and resized at run-time. */
- compiler_globals->map_ptr_base = NULL;
+ ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
compiler_globals->map_ptr_size = 0;
compiler_globals->map_ptr_last = global_map_ptr_last;
if (compiler_globals->map_ptr_last) {
/* Allocate map_ptr table */
compiler_globals->map_ptr_size = ZEND_MM_ALIGNED_SIZE_EX(compiler_globals->map_ptr_last, 4096);
- compiler_globals->map_ptr_base = pemalloc(compiler_globals->map_ptr_size * sizeof(void*), 1);
- memset(compiler_globals->map_ptr_base, 0, compiler_globals->map_ptr_last * sizeof(void*));
+ base = pemalloc(compiler_globals->map_ptr_size * sizeof(void*), 1);
+ ZEND_MAP_PTR_SET_BASE(base);
+ memset(base, 0, compiler_globals->map_ptr_last * sizeof(void*));
}
#else
# error "Unknown ZEND_MAP_PTR_KIND"
if (compiler_globals->script_encoding_list) {
pefree((char*)compiler_globals->script_encoding_list, 1);
}
- if (compiler_globals->map_ptr_base) {
- free(compiler_globals->map_ptr_base);
- compiler_globals->map_ptr_base = NULL;
+ if (ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base)) {
+ free(ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base));
+ ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
compiler_globals->map_ptr_size = 0;
}
}
*/
CG(map_ptr_size) = 1024 * 1024; // TODO: initial size ???
CG(map_ptr_last) = 0;
- CG(map_ptr_base) = pemalloc(CG(map_ptr_size) * sizeof(void*), 1);
+ ZEND_MAP_PTR_SET_BASE(pemalloc(CG(map_ptr_size) * sizeof(void*), 1));
# elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
/* Map region is going to be created and resized at run-time. */
- CG(map_ptr_base) = NULL;
+ ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), NULL);
CG(map_ptr_size) = 0;
CG(map_ptr_last) = 0;
# else
compiler_globals->function_table = NULL;
free(compiler_globals->class_table);
compiler_globals->class_table = NULL;
- free(compiler_globals->map_ptr_base);
- compiler_globals->map_ptr_base = NULL;
+ if (ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base)) {
+ free(ZEND_MAP_PTR_REAL_BASE(compiler_globals->map_ptr_base));
+ }
+ ZEND_MAP_PTR_SET_REAL_BASE(compiler_globals->map_ptr_base, NULL);
if ((script_encoding_list = (zend_encoding **)compiler_globals->script_encoding_list)) {
compiler_globals_ctor(compiler_globals);
compiler_globals->script_encoding_list = (const zend_encoding **)script_encoding_list;
ts_free_id(executor_globals_id);
ts_free_id(compiler_globals_id);
#else
- if (CG(map_ptr_base)) {
- free(CG(map_ptr_base));
- CG(map_ptr_base) = NULL;
+ if (ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base))) {
+ free(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)));
+ ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), NULL);
CG(map_ptr_size) = 0;
}
#endif
init_executor();
startup_scanner();
if (CG(map_ptr_last)) {
- memset(CG(map_ptr_base), 0, CG(map_ptr_last) * sizeof(void*));
+ memset(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), 0, CG(map_ptr_last) * sizeof(void*));
}
}
/* }}} */
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
/* Grow map_ptr table */
CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(CG(map_ptr_last) + 1, 4096);
- CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+ ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), perealloc(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), CG(map_ptr_size) * sizeof(void*), 1));
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif
}
- ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+ ptr = (void**)ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)) + CG(map_ptr_last);
*ptr = NULL;
CG(map_ptr_last)++;
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
/* Grow map_ptr table */
CG(map_ptr_size) = ZEND_MM_ALIGNED_SIZE_EX(last, 4096);
- CG(map_ptr_base) = perealloc(CG(map_ptr_base), CG(map_ptr_size) * sizeof(void*), 1);
+ ZEND_MAP_PTR_SET_REAL_BASE(CG(map_ptr_base), perealloc(ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)), CG(map_ptr_size) * sizeof(void*), 1));
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif
}
- ptr = (void**)CG(map_ptr_base) + CG(map_ptr_last);
+ ptr = (void**)ZEND_MAP_PTR_REAL_BASE(CG(map_ptr_base)) + CG(map_ptr_last);
memset(ptr, 0, (last - CG(map_ptr_last)) * sizeof(void*));
CG(map_ptr_last) = last;
}
# define ZEND_MAP_PTR_NEW(ptr) do { \
ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
} while (0)
+# define ZEND_MAP_PTR_REAL_BASE(base) \
+ (base)
+# define ZEND_MAP_PTR_SET_REAL_BASE(base, ptr) do { \
+ base = (ptr); \
+ } while (0)
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
# define ZEND_MAP_PTR(ptr) \
ptr ## __ptr
# 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))
+ ((void**)((char*)CG(map_ptr_base) + (uintptr_t)ZEND_MAP_PTR(ptr)))
# define ZEND_MAP_PTR_PTR2OFFSET(ptr) \
- ((void*)((uintptr_t)(((char*)(ptr)) - ((char*)CG(map_ptr_base))) | 1L))
+ ((void*)(((char*)(ptr)) - ((char*)CG(map_ptr_base))))
# define ZEND_MAP_PTR_GET(ptr) \
- (ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
- *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) : \
- (void*)(*(ZEND_MAP_PTR(ptr))))
+ (*(ZEND_MAP_PTR_IS_OFFSET(ptr) ? \
+ ZEND_MAP_PTR_OFFSET2PTR(ptr) : \
+ ((void**)(ZEND_MAP_PTR(ptr)))))
# define ZEND_MAP_PTR_SET(ptr, val) do { \
+ void **__p = (void**)(ZEND_MAP_PTR(ptr)); \
if (ZEND_MAP_PTR_IS_OFFSET(ptr)) { \
- *(ZEND_MAP_PTR_OFFSET2PTR(ptr)) = (val); \
- } else { \
- *(ZEND_MAP_PTR(ptr)) = (val); \
+ __p = ZEND_MAP_PTR_OFFSET2PTR(ptr); \
} \
+ *__p = (val); \
} while (0)
# define ZEND_MAP_PTR_INIT(ptr, val) do { \
ZEND_MAP_PTR(ptr) = (val); \
# define ZEND_MAP_PTR_NEW(ptr) do { \
ZEND_MAP_PTR(ptr) = zend_map_ptr_new(); \
} while (0)
+# define ZEND_MAP_PTR_REAL_BASE(base) \
+ ((void*)(((char*)(base)) + 1))
+# define ZEND_MAP_PTR_SET_REAL_BASE(base, ptr) do { \
+ base = (void*)(((char*)(ptr)) - 1); \
+ } while (0)
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
| mov r2, aword [r2]
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
- | xor r1, r1
| test r2, 1
| jz >1
- | MEM_OP2_2_ZTS mov, r1, aword, compiler_globals, map_ptr_base, r1
- | sub r1, 1
+ | MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|1:
- | mov r2, aword [r1 + r2]
+ | mov r2, aword [r2]
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif
#if ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR
| mov r2, aword [r2]
#elif ZEND_MAP_PTR_KIND == ZEND_MAP_PTR_KIND_PTR_OR_OFFSET
- | xor r1, r1
| test r2, 1
| jz >1
- | MEM_OP2_2_ZTS mov, r1, aword, compiler_globals, map_ptr_base, r1
- | sub r1, 1
+ | MEM_OP2_2_ZTS add, r2, aword, compiler_globals, map_ptr_base, r1
|1:
- | mov r2, aword [r1 + r2]
+ | mov r2, aword [r2]
#else
# error "Unknown ZEND_MAP_PTR_KIND"
#endif