diff --git a/lib/fizzy/capi.cpp b/lib/fizzy/capi.cpp index 6dcaa36cb5..1e7177574a 100644 --- a/lib/fizzy/capi.cpp +++ b/lib/fizzy/capi.cpp @@ -11,6 +11,26 @@ namespace { +inline FizzyValue wrap(fizzy::Value value) noexcept +{ + return fizzy::bit_cast(value); +} + +inline fizzy::Value unwrap(FizzyValue value) noexcept +{ + return fizzy::bit_cast(value); +} + +inline const FizzyValue* wrap(const fizzy::Value* values) noexcept +{ + return reinterpret_cast(values); +} + +inline const fizzy::Value* unwrap(const FizzyValue* values) noexcept +{ + return reinterpret_cast(values); +} + inline FizzyInstance* wrap(fizzy::Instance* instance) noexcept { return reinterpret_cast(instance); @@ -20,7 +40,6 @@ inline fizzy::Instance* unwrap(FizzyInstance* instance) noexcept { return reinterpret_cast(instance); } - } // namespace extern "C" { @@ -79,16 +98,15 @@ FizzyInstance* fizzy_instantiate(FizzyModule* module, auto func = [cfunc = imported_functions[imported_func_idx]](fizzy::Instance& instance, fizzy::span args, int depth) -> fizzy::ExecutionResult { - const auto cres = cfunc.function(cfunc.context, wrap(&instance), - reinterpret_cast(args.data()), - static_cast(args.size()), depth); + const auto cres = cfunc.function( + cfunc.context, wrap(&instance), wrap(args.data()), args.size(), depth); if (cres.trapped) return fizzy::Trap; else if (!cres.has_value) return fizzy::Void; else - return fizzy::bit_cast(cres.value); + return unwrap(cres.value); }; // TODO get type from input array @@ -115,14 +133,12 @@ void fizzy_free_instance(FizzyInstance* instance) delete unwrap(instance); } -FizzyExecutionResult fizzy_execute(FizzyInstance* instance, uint32_t func_idx, - const FizzyValue* cargs, size_t args_size, int depth) +FizzyExecutionResult fizzy_execute( + FizzyInstance* instance, uint32_t func_idx, const FizzyValue* args, size_t args_size, int depth) { - const auto args = reinterpret_cast(cargs); - - const auto result = fizzy::execute( - *unwrap(instance), func_idx, fizzy::span(args, args_size), depth); + const auto result = fizzy::execute(*unwrap(instance), func_idx, + fizzy::span(unwrap(args), args_size), depth); - return {result.trapped, result.has_value, fizzy::bit_cast(result.value)}; + return {result.trapped, result.has_value, wrap(result.value)}; } }