@@ -195,7 +195,6 @@ typedef struct _zend_ffi {
195195 * > However, integral types narrower than the system register size are widened.
196196 * > In these cases your program may assume that ret points to an ffi_arg object.
197197 */
198- #define ZEND_FFI_READ_NARROW (ty , ptr , is_ret ) (is_ret ? ((ty) *(ffi_arg *) ptr) : (*(ty *) ptr))
199198#define ZEND_FFI_WRITE_NARROW (ty , ptr , val , is_ret ) do { \
200199 if (is_ret) { \
201200 *(ffi_arg *) ptr = (ffi_arg) (ty) val; \
@@ -562,6 +561,42 @@ static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, voi
562561 if (read_type == BP_VAR_R ) {
563562 zend_ffi_type_kind kind = type -> kind ;
564563
564+ /* Return values are widened to a machine register. */
565+ if (is_ret ) {
566+ if (kind == ZEND_FFI_TYPE_ENUM ) {
567+ kind = type -> enumeration .kind ;
568+ }
569+
570+ switch (kind ) {
571+ case ZEND_FFI_TYPE_UINT8 :
572+ case ZEND_FFI_TYPE_UINT16 :
573+ #if SIZEOF_SIZE_T == 8
574+ case ZEND_FFI_TYPE_UINT32 :
575+ kind = ZEND_FFI_TYPE_UINT64 ;
576+ #else
577+ kind = ZEND_FFI_TYPE_UINT32 ;
578+ #endif
579+ break ;
580+ case ZEND_FFI_TYPE_SINT8 :
581+ case ZEND_FFI_TYPE_SINT16 :
582+ #if SIZEOF_SIZE_T == 8
583+ case ZEND_FFI_TYPE_SINT32 :
584+ kind = ZEND_FFI_TYPE_SINT64 ;
585+ #else
586+ kind = ZEND_FFI_TYPE_SINT32 ;
587+ #endif
588+ break ;
589+ case ZEND_FFI_TYPE_BOOL :
590+ ZVAL_BOOL (rv , * (ffi_arg * )ptr );
591+ return ;
592+ case ZEND_FFI_TYPE_CHAR :
593+ ZVAL_CHAR (rv , * (ffi_arg * )ptr );
594+ return ;
595+ default :
596+ break ;
597+ }
598+ }
599+
565600again :
566601 switch (kind ) {
567602 case ZEND_FFI_TYPE_FLOAT :
@@ -576,22 +611,22 @@ static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, voi
576611 return ;
577612#endif
578613 case ZEND_FFI_TYPE_UINT8 :
579- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (uint8_t , ptr , is_ret ) );
614+ ZVAL_LONG (rv , * (uint8_t * ) ptr );
580615 return ;
581616 case ZEND_FFI_TYPE_SINT8 :
582- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (int8_t , ptr , is_ret ) );
617+ ZVAL_LONG (rv , * (int8_t * ) ptr );
583618 return ;
584619 case ZEND_FFI_TYPE_UINT16 :
585- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (uint16_t , ptr , is_ret ) );
620+ ZVAL_LONG (rv , * (uint16_t * ) ptr );
586621 return ;
587622 case ZEND_FFI_TYPE_SINT16 :
588- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (int16_t , ptr , is_ret ) );
623+ ZVAL_LONG (rv , * (int16_t * ) ptr );
589624 return ;
590625 case ZEND_FFI_TYPE_UINT32 :
591- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (uint32_t , ptr , is_ret ) );
626+ ZVAL_LONG (rv , * (uint32_t * ) ptr );
592627 return ;
593628 case ZEND_FFI_TYPE_SINT32 :
594- ZVAL_LONG (rv , ZEND_FFI_READ_NARROW (int32_t , ptr , is_ret ) );
629+ ZVAL_LONG (rv , * (int32_t * ) ptr );
595630 return ;
596631 case ZEND_FFI_TYPE_UINT64 :
597632 ZVAL_LONG (rv , * (uint64_t * )ptr );
@@ -600,10 +635,10 @@ static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, voi
600635 ZVAL_LONG (rv , * (int64_t * )ptr );
601636 return ;
602637 case ZEND_FFI_TYPE_BOOL :
603- ZVAL_BOOL (rv , ZEND_FFI_READ_NARROW (uint8_t , ptr , is_ret ) );
638+ ZVAL_BOOL (rv , * (uint8_t * ) ptr );
604639 return ;
605640 case ZEND_FFI_TYPE_CHAR :
606- ZVAL_CHAR (rv , ZEND_FFI_READ_NARROW (char , ptr , is_ret ) );
641+ ZVAL_CHAR (rv , * (char * ) ptr );
607642 return ;
608643 case ZEND_FFI_TYPE_ENUM :
609644 kind = type -> enumeration .kind ;
0 commit comments