@@ -2689,13 +2689,25 @@ static accel_ffi_cache_type_entry* accel_ffi_persist_type(zend_ffi_dcl *dcl, voi
2689
2689
return entry ;
2690
2690
}
2691
2691
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
+
2692
2706
static zend_ffi_dcl * accel_ffi_cache_type_get (zend_string * str , void * context )
2693
2707
{
2694
2708
str = accel_find_interned_string (str );
2695
2709
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 );
2699
2711
while (ptr && ptr -> context != context ) {
2700
2712
ptr = ptr -> next ;
2701
2713
}
@@ -2719,18 +2731,14 @@ static zend_ffi_dcl* accel_ffi_cache_type_add(zend_string *str, zend_ffi_dcl *dc
2719
2731
if (IS_ACCEL_INTERNED (str )) {
2720
2732
accel_ffi_cache_type_entry * ptr = accel_ffi_persist_type (dcl , context );
2721
2733
if (ptr ) {
2722
- // TODO: ???
2723
2734
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 );
2726
2735
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 );
2728
2737
} else {
2729
2738
ptr -> next = NULL ;
2730
2739
str -> gc .u .type_info |= IS_STR_FFI_TYPE ;
2731
2740
}
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 );
2734
2742
new_dcl = & ptr -> dcl ;
2735
2743
}
2736
2744
}
@@ -2909,8 +2917,7 @@ static zend_ffi_scope* accel_ffi_cache_scope_get(zend_string *str)
2909
2917
{
2910
2918
str = accel_find_interned_string (str );
2911
2919
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 );
2914
2921
return ptr ;
2915
2922
}
2916
2923
return NULL ;
@@ -2929,13 +2936,9 @@ static zend_ffi_scope* accel_ffi_cache_scope_add(zend_string *str, zend_ffi_scop
2929
2936
if (IS_ACCEL_INTERNED (str )) {
2930
2937
new_scope = accel_ffi_persist_scope (scope );
2931
2938
if (new_scope ) {
2932
- // TODO: ???
2933
2939
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 );
2936
2940
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 );
2939
2942
}
2940
2943
}
2941
2944
}
0 commit comments