@@ -458,7 +458,7 @@ static zend_never_inline zend_ffi_cdata *zend_ffi_cdata_to_zval_slow_ret(void *p
458
458
}
459
459
/* }}} */
460
460
461
- static zend_always_inline void zend_ffi_cdata_to_zval (zend_ffi_cdata * cdata , void * ptr , zend_ffi_type * type , int read_type , zval * rv , zend_ffi_flags flags , zend_bool is_ret ) /* {{{ */
461
+ static zend_always_inline void zend_ffi_cdata_to_zval (zend_ffi_cdata * cdata , void * ptr , zend_ffi_type * type , int read_type , zval * rv , zend_ffi_flags flags , zend_bool is_ret , zend_bool debug_union ) /* {{{ */
462
462
{
463
463
if (read_type == BP_VAR_R ) {
464
464
zend_ffi_type_kind kind = type -> kind ;
@@ -513,6 +513,9 @@ static zend_always_inline void zend_ffi_cdata_to_zval(zend_ffi_cdata *cdata, voi
513
513
if (* (void * * )ptr == NULL ) {
514
514
ZVAL_NULL (rv );
515
515
return ;
516
+ } else if (debug_union ) {
517
+ ZVAL_STR (rv , zend_strpprintf (0 , "%p" , * (void * * )ptr ));
518
+ return ;
516
519
} else if ((type -> attr & ZEND_FFI_ATTR_CONST ) && ZEND_FFI_TYPE (type -> pointer .type )-> kind == ZEND_FFI_TYPE_CHAR ) {
517
520
ZVAL_STRING (rv , * (char * * )ptr );
518
521
return ;
@@ -863,7 +866,7 @@ static void zend_ffi_callback_trampoline(ffi_cif* cif, void* ret, void** args, v
863
866
864
867
ZEND_HASH_FOREACH_PTR (callback_data -> type -> func .args , arg_type ) {
865
868
arg_type = ZEND_FFI_TYPE (arg_type );
866
- zend_ffi_cdata_to_zval (NULL , args [n ], arg_type , BP_VAR_R , & fci .params [n ], (zend_ffi_flags )(arg_type -> attr & ZEND_FFI_ATTR_CONST ), 0 );
869
+ zend_ffi_cdata_to_zval (NULL , args [n ], arg_type , BP_VAR_R , & fci .params [n ], (zend_ffi_flags )(arg_type -> attr & ZEND_FFI_ATTR_CONST ), 0 , 0 );
867
870
n ++ ;
868
871
} ZEND_HASH_FOREACH_END ();
869
872
}
@@ -997,7 +1000,7 @@ static zval *zend_ffi_cdata_get(zend_object *obj, zend_string *member, int read_
997
1000
return & EG (uninitialized_zval );;
998
1001
}
999
1002
1000
- zend_ffi_cdata_to_zval (cdata , cdata -> ptr , type , BP_VAR_R , rv , 0 , 0 );
1003
+ zend_ffi_cdata_to_zval (cdata , cdata -> ptr , type , BP_VAR_R , rv , 0 , 0 , 0 );
1001
1004
return rv ;
1002
1005
}
1003
1006
/* }}} */
@@ -1159,7 +1162,7 @@ static zval *zend_ffi_cdata_read_field(zend_object *obj, zend_string *field_name
1159
1162
}
1160
1163
}
1161
1164
ptr = (void * )(((char * )ptr ) + field -> offset );
1162
- zend_ffi_cdata_to_zval (NULL , ptr , field_type , read_type , rv , (cdata -> flags & ZEND_FFI_FLAG_CONST ) | (zend_ffi_flags )field -> is_const , 0 );
1165
+ zend_ffi_cdata_to_zval (NULL , ptr , field_type , read_type , rv , (cdata -> flags & ZEND_FFI_FLAG_CONST ) | (zend_ffi_flags )field -> is_const , 0 , 0 );
1163
1166
} else {
1164
1167
zend_ffi_bit_field_to_zval (ptr , field , rv );
1165
1168
}
@@ -1288,7 +1291,7 @@ static zval *zend_ffi_cdata_read_dim(zend_object *obj, zval *offset, int read_ty
1288
1291
return & EG (uninitialized_zval );
1289
1292
}
1290
1293
1291
- zend_ffi_cdata_to_zval (NULL , ptr , dim_type , read_type , rv , is_const , 0 );
1294
+ zend_ffi_cdata_to_zval (NULL , ptr , dim_type , read_type , rv , is_const , 0 , 0 );
1292
1295
return rv ;
1293
1296
}
1294
1297
/* }}} */
@@ -1835,7 +1838,7 @@ static zval *zend_ffi_cdata_it_get_current_data(zend_object_iterator *it) /* {{{
1835
1838
ptr = (void * )((char * )cdata -> ptr + dim_type -> size * iter -> it .index );
1836
1839
1837
1840
zval_ptr_dtor (& iter -> value );
1838
- zend_ffi_cdata_to_zval (NULL , ptr , dim_type , iter -> by_ref ? BP_VAR_RW : BP_VAR_R , & iter -> value , (cdata -> flags & ZEND_FFI_FLAG_CONST ) | (zend_ffi_flags )(type -> attr & ZEND_FFI_ATTR_CONST ), 0 );
1841
+ zend_ffi_cdata_to_zval (NULL , ptr , dim_type , iter -> by_ref ? BP_VAR_RW : BP_VAR_R , & iter -> value , (cdata -> flags & ZEND_FFI_FLAG_CONST ) | (zend_ffi_flags )(type -> attr & ZEND_FFI_ATTR_CONST ), 0 , 0 );
1839
1842
return & iter -> value ;
1840
1843
}
1841
1844
/* }}} */
@@ -1930,7 +1933,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
1930
1933
case ZEND_FFI_TYPE_SINT32 :
1931
1934
case ZEND_FFI_TYPE_UINT64 :
1932
1935
case ZEND_FFI_TYPE_SINT64 :
1933
- zend_ffi_cdata_to_zval (cdata , ptr , type , BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 );
1936
+ zend_ffi_cdata_to_zval (cdata , ptr , type , BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 , 0 );
1934
1937
ht = zend_new_array (1 );
1935
1938
zend_hash_str_add (ht , "cdata" , sizeof ("cdata" )- 1 , & tmp );
1936
1939
* is_temp = 1 ;
@@ -1950,7 +1953,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
1950
1953
* is_temp = 1 ;
1951
1954
return ht ;
1952
1955
} else {
1953
- zend_ffi_cdata_to_zval (NULL , * (void * * )ptr , ZEND_FFI_TYPE (type -> pointer .type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 );
1956
+ zend_ffi_cdata_to_zval (NULL , * (void * * )ptr , ZEND_FFI_TYPE (type -> pointer .type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 , 0 );
1954
1957
ht = zend_new_array (1 );
1955
1958
zend_hash_index_add_new (ht , 0 , & tmp );
1956
1959
* is_temp = 1 ;
@@ -1963,7 +1966,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
1963
1966
if (key ) {
1964
1967
if (!f -> bits ) {
1965
1968
void * f_ptr = (void * )(((char * )ptr ) + f -> offset );
1966
- zend_ffi_cdata_to_zval (NULL , f_ptr , ZEND_FFI_TYPE (f -> type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 );
1969
+ zend_ffi_cdata_to_zval (NULL , f_ptr , ZEND_FFI_TYPE (f -> type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 , type -> attr & ZEND_FFI_ATTR_UNION );
1967
1970
zend_hash_add (ht , key , & tmp );
1968
1971
} else {
1969
1972
zend_ffi_bit_field_to_zval (ptr , f , & tmp );
@@ -1976,7 +1979,7 @@ static HashTable *zend_ffi_cdata_get_debug_info(zend_object *obj, int *is_temp)
1976
1979
case ZEND_FFI_TYPE_ARRAY :
1977
1980
ht = zend_new_array (type -> array .length );
1978
1981
for (n = 0 ; n < type -> array .length ; n ++ ) {
1979
- zend_ffi_cdata_to_zval (NULL , ptr , ZEND_FFI_TYPE (type -> array .type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 );
1982
+ zend_ffi_cdata_to_zval (NULL , ptr , ZEND_FFI_TYPE (type -> array .type ), BP_VAR_R , & tmp , ZEND_FFI_FLAG_CONST , 0 , 0 );
1980
1983
zend_hash_index_add (ht , n , & tmp );
1981
1984
ptr = (void * )(((char * )ptr ) + ZEND_FFI_TYPE (type -> array .type )-> size );
1982
1985
}
@@ -2346,7 +2349,7 @@ static zval *zend_ffi_read_var(zend_object *obj, zend_string *var_name, int read
2346
2349
}
2347
2350
2348
2351
if (sym -> kind == ZEND_FFI_SYM_VAR ) {
2349
- zend_ffi_cdata_to_zval (NULL , sym -> addr , ZEND_FFI_TYPE (sym -> type ), read_type , rv , (zend_ffi_flags )sym -> is_const , 0 );
2352
+ zend_ffi_cdata_to_zval (NULL , sym -> addr , ZEND_FFI_TYPE (sym -> type ), read_type , rv , (zend_ffi_flags )sym -> is_const , 0 , 0 );
2350
2353
} else if (sym -> kind == ZEND_FFI_SYM_FUNC ) {
2351
2354
zend_ffi_cdata * cdata ;
2352
2355
zend_ffi_type * new_type = emalloc (sizeof (zend_ffi_type ));
@@ -2714,7 +2717,7 @@ static ZEND_FUNCTION(ffi_trampoline) /* {{{ */
2714
2717
free_alloca (arg_values , arg_values_use_heap );
2715
2718
}
2716
2719
2717
- zend_ffi_cdata_to_zval (NULL , ret , ZEND_FFI_TYPE (type -> func .ret_type ), BP_VAR_R , return_value , 0 , 1 );
2720
+ zend_ffi_cdata_to_zval (NULL , ret , ZEND_FFI_TYPE (type -> func .ret_type ), BP_VAR_R , return_value , 0 , 1 , 0 );
2718
2721
free_alloca (ret , ret_use_heap );
2719
2722
2720
2723
exit :
0 commit comments