diff --git a/.github/workflows/buildAndTest.yaml b/.github/workflows/buildAndTest.yaml index 7d2c5ce..535f41e 100644 --- a/.github/workflows/buildAndTest.yaml +++ b/.github/workflows/buildAndTest.yaml @@ -56,7 +56,7 @@ jobs: run: | set -x uname -a - apt update && apt-get install -y ca-certificates pkg-config make gcc g++ check # todo: libffi-dev + apt update && apt-get install -y ca-certificates pkg-config make gcc g++ check libffi-dev tar -C /usr/local -xzf go.tar.gz && rm go.tar.gz export PATH=$PATH:/usr/local/go/bin diff --git a/examples/c_ffi_call/value_ffi.c b/examples/c_ffi_call/value_ffi.c index df422f9..f5d36a4 100644 --- a/examples/c_ffi_call/value_ffi.c +++ b/examples/c_ffi_call/value_ffi.c @@ -1,6 +1,7 @@ #include "value_ffi.h" #include "metac/backend/helpers.h" +#include "metac/endian.h" #include #include @@ -336,7 +337,7 @@ metac_value_t * metac_new_value_with_call_result(metac_value_t * p_param_storage } _check_(res_sz <= 0, NULL); - void * p_res_mem = calloc(1, res_sz= sizeof(rc)) { + res_addr = metac_value_addr(p_res_value); + assert(res_addr != NULL); + } + } - void * addr = metac_value_addr(p_res_value); - ffi_call(&cif, fn, - (metac_entry_has_result(p_param_storage_entry) == 0 || p_res_value == NULL)?NULL:addr, - values); + ffi_call(&cif, fn, res_addr, values); free(values); for (metac_num_t ic = 0; ic < param_count; ++ic ) {_cleanup_ffi_type(args[ic]);} @@ -461,5 +474,17 @@ int metac_value_call(metac_value_t * p_param_storage_val, void (*fn)(void), meta } _cleanup_ffi_type(rtype); + if (res_addr == &rc) { + // we need to pass result back to p_res_value if we used rc as buf (for small data) + uint8_t * p_res_buf = metac_value_addr(p_res_value); + for (metac_size_t i = 0; i < res_sz; ++i) { + if (IS_LITTLE_ENDIAN) { + p_res_buf[i] = rc & 0xff; + } else { + p_res_buf[res_sz - i - 1] = rc & 0xff; + } + rc >>= 8; + } + } return 0; } \ No newline at end of file