Skip to content

Commit a9b4164

Browse files
committed
More wrap/unwrap
1 parent c9792be commit a9b4164

1 file changed

Lines changed: 50 additions & 22 deletions

File tree

lib/fizzy/capi.cpp

Lines changed: 50 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,26 @@
1111

1212
namespace
1313
{
14+
inline FizzyValue wrap(fizzy::Value value) noexcept
15+
{
16+
return fizzy::bit_cast<FizzyValue>(value);
17+
}
18+
19+
inline fizzy::Value unwrap(FizzyValue value) noexcept
20+
{
21+
return fizzy::bit_cast<fizzy::Value>(value);
22+
}
23+
24+
inline const FizzyValue* wrap(const fizzy::Value* values) noexcept
25+
{
26+
return reinterpret_cast<const FizzyValue*>(values);
27+
}
28+
29+
inline const fizzy::Value* unwrap(const FizzyValue* values) noexcept
30+
{
31+
return reinterpret_cast<const fizzy::Value*>(values);
32+
}
33+
1434
inline FizzyInstance* wrap(fizzy::Instance* instance) noexcept
1535
{
1636
return reinterpret_cast<FizzyInstance*>(instance);
@@ -21,6 +41,29 @@ inline fizzy::Instance* unwrap(FizzyInstance* instance) noexcept
2141
return reinterpret_cast<fizzy::Instance*>(instance);
2242
}
2343

44+
inline FizzyExecutionResult wrap(const fizzy::ExecutionResult& result) noexcept
45+
{
46+
return {result.trapped, result.has_value, wrap(result.value)};
47+
}
48+
49+
inline fizzy::ExecutionResult unwrap(FizzyExecutionResult result) noexcept
50+
{
51+
if (result.trapped)
52+
return fizzy::Trap;
53+
else if (!result.has_value)
54+
return fizzy::Void;
55+
else
56+
return unwrap(result.value);
57+
}
58+
59+
inline auto unwrap(FizzyExternalFn func, void* context) noexcept
60+
{
61+
return [func, context](fizzy::Instance& instance, fizzy::span<const fizzy::Value> args,
62+
int depth) noexcept -> fizzy::ExecutionResult {
63+
const auto result = func(context, wrap(&instance), wrap(args.data()), args.size(), depth);
64+
return unwrap(result);
65+
};
66+
}
2467
} // namespace
2568

2669
extern "C" {
@@ -76,21 +119,9 @@ FizzyInstance* fizzy_instantiate(FizzyModule* module,
76119
for (size_t imported_func_idx = 0; imported_func_idx < imported_functions_size;
77120
++imported_func_idx)
78121
{
79-
auto func = [cfunc = imported_functions[imported_func_idx]](fizzy::Instance& instance,
80-
fizzy::span<const fizzy::Value> args,
81-
int depth) -> fizzy::ExecutionResult {
82-
const auto cres = cfunc.function(cfunc.context, wrap(&instance),
83-
reinterpret_cast<const FizzyValue*>(args.data()),
84-
static_cast<uint32_t>(args.size()), depth);
85-
86-
if (cres.trapped)
87-
return fizzy::Trap;
88-
else if (!cres.has_value)
89-
return fizzy::Void;
90-
else
91-
return fizzy::bit_cast<fizzy::Value>(cres.value);
92-
};
122+
const auto& cfunc = imported_functions[imported_func_idx];
93123

124+
auto func = unwrap(cfunc.function, cfunc.context);
94125
// TODO get type from input array
95126
auto func_type = module->module.imported_function_types[imported_func_idx];
96127

@@ -115,14 +146,11 @@ void fizzy_free_instance(FizzyInstance* instance)
115146
delete unwrap(instance);
116147
}
117148

118-
FizzyExecutionResult fizzy_execute(FizzyInstance* instance, uint32_t func_idx,
119-
const FizzyValue* cargs, size_t args_size, int depth)
149+
FizzyExecutionResult fizzy_execute(
150+
FizzyInstance* instance, uint32_t func_idx, const FizzyValue* args, size_t args_size, int depth)
120151
{
121-
const auto args = reinterpret_cast<const fizzy::Value*>(cargs);
122-
123-
const auto result = fizzy::execute(
124-
*unwrap(instance), func_idx, fizzy::span<const fizzy::Value>(args, args_size), depth);
125-
126-
return {result.trapped, result.has_value, fizzy::bit_cast<FizzyValue>(result.value)};
152+
const auto result =
153+
fizzy::execute(*unwrap(instance), func_idx, {unwrap(args), args_size}, depth);
154+
return wrap(result);
127155
}
128156
}

0 commit comments

Comments
 (0)