@@ -2696,13 +2696,25 @@ static accel_ffi_cache_type_entry* accel_ffi_persist_type(zend_ffi_dcl *dcl, voi
2696
2696
return entry ;
2697
2697
}
2698
2698
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
+
2699
2713
static zend_ffi_dcl * accel_ffi_cache_type_get (zend_string * str , void * context )
2700
2714
{
2701
2715
str = accel_find_interned_string (str );
2702
2716
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 );
2706
2718
while (ptr && ptr -> context != context ) {
2707
2719
ptr = ptr -> next ;
2708
2720
}
@@ -2726,18 +2738,14 @@ static zend_ffi_dcl* accel_ffi_cache_type_add(zend_string *str, zend_ffi_dcl *dc
2726
2738
if (IS_ACCEL_INTERNED (str )) {
2727
2739
accel_ffi_cache_type_entry * ptr = accel_ffi_persist_type (dcl , context );
2728
2740
if (ptr ) {
2729
- // TODO: ???
2730
2741
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 );
2733
2742
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 );
2735
2744
} else {
2736
2745
ptr -> next = NULL ;
2737
2746
str -> gc .u .type_info |= IS_STR_FFI_TYPE ;
2738
2747
}
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 );
2741
2749
new_dcl = & ptr -> dcl ;
2742
2750
}
2743
2751
}
@@ -2916,8 +2924,7 @@ static zend_ffi_scope* accel_ffi_cache_scope_get(zend_string *str)
2916
2924
{
2917
2925
str = accel_find_interned_string (str );
2918
2926
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 );
2921
2928
return ptr ;
2922
2929
}
2923
2930
return NULL ;
@@ -2936,13 +2943,9 @@ static zend_ffi_scope* accel_ffi_cache_scope_add(zend_string *str, zend_ffi_scop
2936
2943
if (IS_ACCEL_INTERNED (str )) {
2937
2944
new_scope = accel_ffi_persist_scope (scope );
2938
2945
if (new_scope ) {
2939
- // TODO: ???
2940
2946
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 );
2943
2947
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 );
2946
2949
}
2947
2950
}
2948
2951
}
0 commit comments