X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-psi;a=blobdiff_plain;f=src%2Flibffi.c;h=301995e5903d9bc377c3d2630f1be48fed9e0513;hp=288acd35134bfef10abeced9b5557ea135283a2d;hb=d3171526ab7658114cac4ebe1098af4b038e576e;hpb=c0999079ea85fecba8ab5eec386541fc1ce733b7;ds=sidebyside diff --git a/src/libffi.c b/src/libffi.c index 288acd3..301995e 100644 --- a/src/libffi.c +++ b/src/libffi.c @@ -8,6 +8,7 @@ #include "php_psi.h" #include "libffi.h" +#include "engine.h" #undef PACKAGE #undef PACKAGE_BUGREPORT @@ -87,6 +88,7 @@ static inline ffi_type *psi_ffi_token_type(token_t t) { case PSI_T_BOOL: return &ffi_type_uchar; case PSI_T_INT: + case PSI_T_ENUM: return &ffi_type_sint; case PSI_T_LONG: return &ffi_type_slong; @@ -190,7 +192,8 @@ static ffi_type **psi_ffi_struct_type_elements(decl_struct *strct) { static inline ffi_type *psi_ffi_decl_type(decl_type *type) { decl_type *real = real_decl_type(type); - if (real->type == PSI_T_STRUCT) { + switch (real->type) { + case PSI_T_STRUCT: if (!real->strct->engine.type) { ffi_type *strct = calloc(1, sizeof(ffi_type)); @@ -203,8 +206,13 @@ static inline ffi_type *psi_ffi_decl_type(decl_type *type) { } return real->strct->engine.type; + + case PSI_T_UNION: + return psi_ffi_decl_arg_type(real->unn->args->args[0]); + + default: + return psi_ffi_token_type(real->type); } - return psi_ffi_token_type(real->type); } static inline ffi_type *psi_ffi_decl_arg_type(decl_arg *darg) { if (darg->var->pointer_level) {