@@ -195,7 +195,6 @@ typedef struct _zend_ffi {
195
195
* > However, integral types narrower than the system register size are widened.
196
196
* > In these cases your program may assume that ret points to an ffi_arg object.
197
197
*/
198
- #define ZEND_FFI_READ_NARROW (ty , ptr , is_ret ) (is_ret ? ((ty) *(ffi_arg *) ptr) : (*(ty *) ptr))
199
198
#define ZEND_FFI_WRITE_NARROW (ty , ptr , val , is_ret ) do { \
200
199
if (is_ret) { \
201
200
*(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
562
561
if (read_type == BP_VAR_R ) {
563
562
zend_ffi_type_kind kind = type -> kind ;
564
563
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
+
565
600
again :
566
601
switch (kind ) {
567
602
case ZEND_FFI_TYPE_FLOAT :
@@ -576,22 +611,22 @@ static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, voi
576
611
return ;
577
612
#endif
578
613
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 );
580
615
return ;
581
616
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 );
583
618
return ;
584
619
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 );
586
621
return ;
587
622
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 );
589
624
return ;
590
625
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 );
592
627
return ;
593
628
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 );
595
630
return ;
596
631
case ZEND_FFI_TYPE_UINT64 :
597
632
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
600
635
ZVAL_LONG (rv , * (int64_t * )ptr );
601
636
return ;
602
637
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 );
604
639
return ;
605
640
case ZEND_FFI_TYPE_CHAR :
606
- ZVAL_CHAR (rv , ZEND_FFI_READ_NARROW (char , ptr , is_ret ) );
641
+ ZVAL_CHAR (rv , * (char * ) ptr );
607
642
return ;
608
643
case ZEND_FFI_TYPE_ENUM :
609
644
kind = type -> enumeration .kind ;
0 commit comments