Skip to content

Commit

Permalink
More wrap/unwrap
Browse files Browse the repository at this point in the history
  • Loading branch information
gumb0 committed Sep 29, 2020
1 parent c9792be commit 9ef4767
Showing 1 changed file with 28 additions and 12 deletions.
40 changes: 28 additions & 12 deletions lib/fizzy/capi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,26 @@

namespace
{
inline FizzyValue wrap(fizzy::Value value) noexcept
{
return fizzy::bit_cast<FizzyValue>(value);
}

inline fizzy::Value unwrap(FizzyValue value) noexcept
{
return fizzy::bit_cast<fizzy::Value>(value);
}

inline const FizzyValue* wrap(const fizzy::Value* values) noexcept
{
return reinterpret_cast<const FizzyValue*>(values);
}

inline const fizzy::Value* unwrap(const FizzyValue* values) noexcept
{
return reinterpret_cast<const fizzy::Value*>(values);
}

inline FizzyInstance* wrap(fizzy::Instance* instance) noexcept
{
return reinterpret_cast<FizzyInstance*>(instance);
Expand All @@ -20,7 +40,6 @@ inline fizzy::Instance* unwrap(FizzyInstance* instance) noexcept
{
return reinterpret_cast<fizzy::Instance*>(instance);
}

} // namespace

extern "C" {
Expand Down Expand Up @@ -79,16 +98,15 @@ FizzyInstance* fizzy_instantiate(FizzyModule* module,
auto func = [cfunc = imported_functions[imported_func_idx]](fizzy::Instance& instance,
fizzy::span<const fizzy::Value> args,
int depth) -> fizzy::ExecutionResult {
const auto cres = cfunc.function(cfunc.context, wrap(&instance),
reinterpret_cast<const FizzyValue*>(args.data()),
static_cast<uint32_t>(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<fizzy::Value>(cres.value);
return unwrap(cres.value);
};

// TODO get type from input array
Expand All @@ -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<const fizzy::Value*>(cargs);

const auto result = fizzy::execute(
*unwrap(instance), func_idx, fizzy::span<const fizzy::Value>(args, args_size), depth);
const auto result = fizzy::execute(*unwrap(instance), func_idx,
fizzy::span<const fizzy::Value>(unwrap(args), args_size), depth);

return {result.trapped, result.has_value, fizzy::bit_cast<FizzyValue>(result.value)};
return {result.trapped, result.has_value, wrap(result.value)};
}
}

0 comments on commit 9ef4767

Please sign in to comment.