@@ -161,6 +161,9 @@ typedef struct _zend_ffi {
161
161
#define ZEND_FFI_TYPE_MAKE_OWNED (t ) \
162
162
((zend_ffi_type*)(((uintptr_t)(t)) | ZEND_FFI_TYPE_OWNED))
163
163
164
+ #define ZEND_FFI_SIZEOF_ARG \
165
+ MAX(FFI_SIZEOF_ARG, sizeof(double))
166
+
164
167
typedef struct _zend_ffi_cdata {
165
168
zend_object std ;
166
169
zend_ffi_type * type ;
@@ -2582,12 +2585,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2582
2585
arg_types = do_alloca (
2583
2586
sizeof (ffi_type * ) * EX_NUM_ARGS (), arg_types_use_heap );
2584
2587
arg_values = do_alloca (
2585
- (sizeof (void * ) + FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2588
+ (sizeof (void * ) + ZEND_FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2586
2589
n = 0 ;
2587
2590
if (type -> func .args ) {
2588
2591
ZEND_HASH_FOREACH_PTR (type -> func .args , arg_type ) {
2589
2592
arg_type = ZEND_FFI_TYPE (arg_type );
2590
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2593
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2591
2594
if (zend_ffi_pass_arg (EX_VAR_NUM (n ), arg_type , & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2592
2595
free_alloca (arg_types , arg_types_use_heap );
2593
2596
free_alloca (arg_values , arg_values_use_heap );
@@ -2597,7 +2600,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2597
2600
} ZEND_HASH_FOREACH_END ();
2598
2601
}
2599
2602
for (; n < EX_NUM_ARGS (); n ++ ) {
2600
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2603
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2601
2604
if (zend_ffi_pass_var_arg (EX_VAR_NUM (n ), & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2602
2605
free_alloca (arg_types , arg_types_use_heap );
2603
2606
free_alloca (arg_values , arg_values_use_heap );
@@ -2627,12 +2630,12 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2627
2630
arg_types = do_alloca (
2628
2631
(sizeof (ffi_type * ) + sizeof (ffi_type )) * EX_NUM_ARGS (), arg_types_use_heap );
2629
2632
arg_values = do_alloca (
2630
- (sizeof (void * ) + FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2633
+ (sizeof (void * ) + ZEND_FFI_SIZEOF_ARG ) * EX_NUM_ARGS (), arg_values_use_heap );
2631
2634
n = 0 ;
2632
2635
if (type -> func .args ) {
2633
2636
ZEND_HASH_FOREACH_PTR (type -> func .args , arg_type ) {
2634
2637
arg_type = ZEND_FFI_TYPE (arg_type );
2635
- arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (FFI_SIZEOF_ARG * n );
2638
+ arg_values [n ] = ((char * )arg_values ) + (sizeof (void * ) * EX_NUM_ARGS ()) + (ZEND_FFI_SIZEOF_ARG * n );
2636
2639
if (zend_ffi_pass_arg (EX_VAR_NUM (n ), arg_type , & arg_types [n ], arg_values , n , execute_data ) != SUCCESS ) {
2637
2640
free_alloca (arg_types , arg_types_use_heap );
2638
2641
free_alloca (arg_values , arg_values_use_heap );
0 commit comments