Skip to content

Commit cc062c6

Browse files
committed
Review suggestion for zend_ffi_cdata_to_zval()
1 parent 100aa6c commit cc062c6

File tree

1 file changed

+44
-9
lines changed

1 file changed

+44
-9
lines changed

ext/ffi/ffi.c

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
565600
again:
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

Comments
 (0)