Skip to content

Commit 7313982

Browse files
committed
Cleanup pointer compression
1 parent 7fbdae4 commit 7313982

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

ext/opcache/ZendAccelerator.c

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2696,13 +2696,25 @@ static accel_ffi_cache_type_entry* accel_ffi_persist_type(zend_ffi_dcl *dcl, voi
26962696
return entry;
26972697
}
26982698

2699+
static uint32_t accel_ffi_cache_ptr_to_offset(const void *ptr)
2700+
{
2701+
ZEND_ASSERT(((uintptr_t)ptr & 0x7) == 0); /* should be 8 byte aligned */
2702+
ZEND_ASSERT(((uintptr_t)ZSMMG(shared_segments)[0]->p & 0x7) == 0);
2703+
ZEND_ASSERT((uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p > 0 &&
2704+
(uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
2705+
return (uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p;
2706+
}
2707+
2708+
static void* accel_ffi_cache_offset_to_ptr(uint32_t offset)
2709+
{
2710+
return (uint64_t*)ZSMMG(shared_segments)[0]->p + offset;
2711+
}
2712+
26992713
static zend_ffi_dcl* accel_ffi_cache_type_get(zend_string *str, void *context)
27002714
{
27012715
str = accel_find_interned_string(str);
27022716
if (str && (str->gc.u.type_info & IS_STR_FFI_TYPE)) {
2703-
// TODO: ???
2704-
accel_ffi_cache_type_entry *ptr =
2705-
(accel_ffi_cache_type_entry*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2717+
accel_ffi_cache_type_entry *ptr = accel_ffi_cache_offset_to_ptr(str->gc.refcount);
27062718
while (ptr && ptr->context != context) {
27072719
ptr = ptr->next;
27082720
}
@@ -2726,18 +2738,14 @@ static zend_ffi_dcl* accel_ffi_cache_type_add(zend_string *str, zend_ffi_dcl *dc
27262738
if (IS_ACCEL_INTERNED(str)) {
27272739
accel_ffi_cache_type_entry *ptr = accel_ffi_persist_type(dcl, context);
27282740
if (ptr) {
2729-
// TODO: ???
27302741
ZEND_ASSERT(!(str->gc.u.type_info & (IS_STR_CLASS_NAME_MAP_PTR|IS_STR_FFI_SCOPE)));
2731-
ZEND_ASSERT((char*)ptr - (char*)ZSMMG(shared_segments)[0]->p > 0 &&
2732-
(char*)new_dcl - (char*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
27332742
if (str->gc.u.type_info & IS_STR_FFI_TYPE) {
2734-
ptr->next = (accel_ffi_cache_type_entry*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2743+
ptr->next = accel_ffi_cache_offset_to_ptr(str->gc.refcount);
27352744
} else {
27362745
ptr->next = NULL;
27372746
str->gc.u.type_info |= IS_STR_FFI_TYPE;
27382747
}
2739-
// TODO: ???
2740-
str->gc.refcount = (char*)ptr - (char*)ZSMMG(shared_segments)[0]->p;
2748+
str->gc.refcount = accel_ffi_cache_ptr_to_offset(ptr);
27412749
new_dcl = &ptr->dcl;
27422750
}
27432751
}
@@ -2916,8 +2924,7 @@ static zend_ffi_scope* accel_ffi_cache_scope_get(zend_string *str)
29162924
{
29172925
str = accel_find_interned_string(str);
29182926
if (str && (str->gc.u.type_info & IS_STR_FFI_SCOPE)) {
2919-
// TODO: ???
2920-
zend_ffi_scope *ptr = (zend_ffi_scope*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2927+
zend_ffi_scope *ptr = (zend_ffi_scope*)accel_ffi_cache_offset_to_ptr(str->gc.refcount);
29212928
return ptr;
29222929
}
29232930
return NULL;
@@ -2936,13 +2943,9 @@ static zend_ffi_scope* accel_ffi_cache_scope_add(zend_string *str, zend_ffi_scop
29362943
if (IS_ACCEL_INTERNED(str)) {
29372944
new_scope = accel_ffi_persist_scope(scope);
29382945
if (new_scope) {
2939-
// TODO: ???
29402946
ZEND_ASSERT(!(str->gc.u.type_info & (IS_STR_CLASS_NAME_MAP_PTR|IS_STR_FFI_TYPE|IS_STR_FFI_SCOPE)));
2941-
ZEND_ASSERT((char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p > 0 &&
2942-
(char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
29432947
str->gc.u.type_info |= IS_STR_FFI_SCOPE;
2944-
// TODO: ???
2945-
str->gc.refcount = (char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p;
2948+
str->gc.refcount = accel_ffi_cache_ptr_to_offset(new_scope);
29462949
}
29472950
}
29482951
}

0 commit comments

Comments
 (0)