@@ -160,6 +160,9 @@ typedef struct _zend_ffi {
160
160
#define ZEND_FFI_TYPE_MAKE_OWNED (t ) \
161
161
((zend_ffi_type*)(((uintptr_t)(t)) | ZEND_FFI_TYPE_OWNED))
162
162
163
+ #define ZEND_FFI_SIZEOF_ARG \
164
+ MAX(FFI_SIZEOF_ARG, sizeof(double))
165
+
163
166
typedef struct _zend_ffi_cdata {
164
167
zend_object std ;
165
168
zend_ffi_type * type ;
@@ -2614,12 +2617,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2614
2617
arg_types = do_alloca (
2615
2618
sizeof (ffi_type * ) * EX_NUM_ARGS (), arg_types_use_heap );
2616
2619
arg_values = do_alloca (
2617
- (sizeof (void * ) + FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2620
+ (sizeof (void * ) + ZEND_FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2618
2621
n = 0 ;
2619
2622
if (type -> func .args ) {
2620
2623
ZEND_HASH_FOREACH_PTR (type -> func .args , arg_type ) {
2621
2624
arg_type = ZEND_FFI_TYPE (arg_type );
2622
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2625
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2623
2626
if (zend_ffi_pass_arg (EX_VAR_NUM (n ), arg_type , & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2624
2627
free_alloca (arg_types , arg_types_use_heap );
2625
2628
free_alloca (arg_values , arg_values_use_heap );
@@ -2629,7 +2632,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2629
2632
} ZEND_HASH_FOREACH_END ();
2630
2633
}
2631
2634
for (; n < EX_NUM_ARGS (); n ++ ) {
2632
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2635
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2633
2636
if (zend_ffi_pass_var_arg (EX_VAR_NUM (n ), & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2634
2637
free_alloca (arg_types , arg_types_use_heap );
2635
2638
free_alloca (arg_values , arg_values_use_heap );
@@ -2659,12 +2662,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2659
2662
arg_types = do_alloca (
2660
2663
(sizeof (ffi_type * ) + sizeof (ffi_type )) * EX_NUM_ARGS (), arg_types_use_heap );
2661
2664
arg_values = do_alloca (
2662
- (sizeof (void * ) + FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2665
+ (sizeof (void * ) + ZEND_FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2663
2666
n = 0 ;
2664
2667
if (type -> func .args ) {
2665
2668
ZEND_HASH_FOREACH_PTR (type -> func .args , arg_type ) {
2666
2669
arg_type = ZEND_FFI_TYPE (arg_type );
2667
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2670
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2668
2671
if (zend_ffi_pass_arg (EX_VAR_NUM (n ), arg_type , & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2669
2672
free_alloca (arg_types , arg_types_use_heap );
2670
2673
free_alloca (arg_values , arg_values_use_heap );
0 commit comments