1111
1212namespace
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+
1434inline 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
2669extern " 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