Skip to content

Commit 92b83ab

Browse files
committed
Cleanup pointer compression
1 parent c740ef4 commit 92b83ab

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

ext/opcache/ZendAccelerator.c

+19-16
Original file line numberDiff line numberDiff line change
@@ -2689,13 +2689,25 @@ static accel_ffi_cache_type_entry* accel_ffi_persist_type(zend_ffi_dcl *dcl, voi
26892689
return entry;
26902690
}
26912691

2692+
static uint32_t accel_ffi_cache_ptr_to_offset(const void *ptr)
2693+
{
2694+
ZEND_ASSERT(((uintptr_t)ptr & 0x7) == 0); /* should be 8 byte aligned */
2695+
ZEND_ASSERT(((uintptr_t)ZSMMG(shared_segments)[0]->p & 0x7) == 0);
2696+
ZEND_ASSERT((uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p > 0 &&
2697+
(uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
2698+
return (uint64_t*)ptr - (uint64_t*)ZSMMG(shared_segments)[0]->p;
2699+
}
2700+
2701+
static void* accel_ffi_cache_offset_to_ptr(uint32_t offset)
2702+
{
2703+
return (uint64_t*)ZSMMG(shared_segments)[0]->p + offset;
2704+
}
2705+
26922706
static zend_ffi_dcl* accel_ffi_cache_type_get(zend_string *str, void *context)
26932707
{
26942708
str = accel_find_interned_string(str);
26952709
if (str && (str->gc.u.type_info & IS_STR_FFI_TYPE)) {
2696-
// TODO: ???
2697-
accel_ffi_cache_type_entry *ptr =
2698-
(accel_ffi_cache_type_entry*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2710+
accel_ffi_cache_type_entry *ptr = accel_ffi_cache_offset_to_ptr(str->gc.refcount);
26992711
while (ptr && ptr->context != context) {
27002712
ptr = ptr->next;
27012713
}
@@ -2719,18 +2731,14 @@ static zend_ffi_dcl* accel_ffi_cache_type_add(zend_string *str, zend_ffi_dcl *dc
27192731
if (IS_ACCEL_INTERNED(str)) {
27202732
accel_ffi_cache_type_entry *ptr = accel_ffi_persist_type(dcl, context);
27212733
if (ptr) {
2722-
// TODO: ???
27232734
ZEND_ASSERT(!(str->gc.u.type_info & (IS_STR_CLASS_NAME_MAP_PTR|IS_STR_FFI_SCOPE)));
2724-
ZEND_ASSERT((char*)ptr - (char*)ZSMMG(shared_segments)[0]->p > 0 &&
2725-
(char*)new_dcl - (char*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
27262735
if (str->gc.u.type_info & IS_STR_FFI_TYPE) {
2727-
ptr->next = (accel_ffi_cache_type_entry*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2736+
ptr->next = accel_ffi_cache_offset_to_ptr(str->gc.refcount);
27282737
} else {
27292738
ptr->next = NULL;
27302739
str->gc.u.type_info |= IS_STR_FFI_TYPE;
27312740
}
2732-
// TODO: ???
2733-
str->gc.refcount = (char*)ptr - (char*)ZSMMG(shared_segments)[0]->p;
2741+
str->gc.refcount = accel_ffi_cache_ptr_to_offset(ptr);
27342742
new_dcl = &ptr->dcl;
27352743
}
27362744
}
@@ -2909,8 +2917,7 @@ static zend_ffi_scope* accel_ffi_cache_scope_get(zend_string *str)
29092917
{
29102918
str = accel_find_interned_string(str);
29112919
if (str && (str->gc.u.type_info & IS_STR_FFI_SCOPE)) {
2912-
// TODO: ???
2913-
zend_ffi_scope *ptr = (zend_ffi_scope*)((char*)ZSMMG(shared_segments)[0]->p + str->gc.refcount);
2920+
zend_ffi_scope *ptr = (zend_ffi_scope*)accel_ffi_cache_offset_to_ptr(str->gc.refcount);
29142921
return ptr;
29152922
}
29162923
return NULL;
@@ -2929,13 +2936,9 @@ static zend_ffi_scope* accel_ffi_cache_scope_add(zend_string *str, zend_ffi_scop
29292936
if (IS_ACCEL_INTERNED(str)) {
29302937
new_scope = accel_ffi_persist_scope(scope);
29312938
if (new_scope) {
2932-
// TODO: ???
29332939
ZEND_ASSERT(!(str->gc.u.type_info & (IS_STR_CLASS_NAME_MAP_PTR|IS_STR_FFI_TYPE|IS_STR_FFI_SCOPE)));
2934-
ZEND_ASSERT((char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p > 0 &&
2935-
(char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p < 0x7fffffff);
29362940
str->gc.u.type_info |= IS_STR_FFI_SCOPE;
2937-
// TODO: ???
2938-
str->gc.refcount = (char*)new_scope - (char*)ZSMMG(shared_segments)[0]->p;
2941+
str->gc.refcount = accel_ffi_cache_ptr_to_offset(new_scope);
29392942
}
29402943
}
29412944
}

0 commit comments

Comments
 (0)