Skip to content

Commit 9991225

Browse files
committed
capi: Add FizzyFunctionType
1 parent 161f49e commit 9991225

3 files changed

Lines changed: 22 additions & 26 deletions

File tree

include/fizzy/fizzy.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,18 +55,18 @@ static const FizzyValueType FizzyValueTypeI32 = 0x7f;
5555
static const FizzyValueType FizzyValueTypeI64 = 0x7e;
5656
static const FizzyValueType FizzyValueTypeF32 = 0x7d;
5757
static const FizzyValueType FizzyValueTypeF64 = 0x7c;
58+
/// Special value, can be used only as function output type.
59+
static const FizzyValueType FizzyValueTypeVoid = 0;
5860

5961
/// Function type.
6062
typedef struct FizzyFunctionType
6163
{
64+
/// Output type, equals to FizzyValueTypeVoid, iff function has no output.
65+
FizzyValueType output;
6266
/// Pointer to input types array.
6367
const FizzyValueType* inputs;
6468
/// Input types array size.
6569
size_t inputs_size;
66-
/// Pointer to output types array.
67-
const FizzyValueType* outputs;
68-
/// Output types array size.
69-
size_t outputs_size;
7070
} FizzyFunctionType;
7171

7272
/// External function.

lib/fizzy/capi.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,31 @@ inline const FizzyValueType* wrap(const fizzy::ValType* value_types) noexcept
2727
return reinterpret_cast<const FizzyValueType*>(value_types);
2828
}
2929

30+
inline FizzyValueType wrap(fizzy::ValType value_type) noexcept
31+
{
32+
return static_cast<FizzyValueType>(value_type);
33+
}
34+
3035
inline fizzy::ValType unwrap(FizzyValueType value_type) noexcept
3136
{
3237
return static_cast<fizzy::ValType>(value_type);
3338
}
3439

3540
inline FizzyFunctionType wrap(const fizzy::FuncType& type) noexcept
3641
{
37-
return {(type.inputs.empty() ? nullptr : wrap(&type.inputs[0])), type.inputs.size(),
38-
(type.outputs.empty() ? nullptr : wrap(&type.outputs[0])), type.outputs.size()};
42+
return {(type.outputs.empty() ? FizzyValueTypeVoid : wrap(type.outputs[0])),
43+
(type.inputs.empty() ? nullptr : wrap(&type.inputs[0])), type.inputs.size()};
3944
}
4045

4146
inline fizzy::FuncType unwrap(const FizzyFunctionType& type)
4247
{
4348
fizzy::FuncType func_type{std::vector<fizzy::ValType>(type.inputs_size),
44-
std::vector<fizzy::ValType>(type.outputs_size)};
49+
(type.output == FizzyValueTypeVoid ? std::vector<fizzy::ValType>{} :
50+
std::vector<fizzy::ValType>{unwrap(type.output)})};
4551

4652
fizzy::ValType (*unwrap_valtype_fn)(FizzyValueType value) = &unwrap;
4753
std::transform(
4854
type.inputs, type.inputs + type.inputs_size, func_type.inputs.begin(), unwrap_valtype_fn);
49-
std::transform(type.outputs, type.outputs + type.outputs_size, func_type.outputs.begin(),
50-
unwrap_valtype_fn);
5155

5256
return func_type;
5357
}

test/unittests/capi_test.cpp

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,25 +48,23 @@ TEST(capi, get_function_type)
4848

4949
const auto type0 = fizzy_get_function_type(module, 0);
5050
EXPECT_EQ(type0.inputs_size, 0);
51-
EXPECT_EQ(type0.outputs_size, 0);
51+
EXPECT_EQ(type0.output, FizzyValueTypeVoid);
5252

5353
const auto type1 = fizzy_get_function_type(module, 1);
5454
EXPECT_EQ(type1.inputs_size, 2);
5555
EXPECT_EQ(type1.inputs[0], FizzyValueTypeI32);
5656
EXPECT_EQ(type1.inputs[1], FizzyValueTypeI32);
57-
EXPECT_EQ(type1.outputs_size, 1);
58-
EXPECT_EQ(type1.outputs[0], FizzyValueTypeI32);
57+
EXPECT_EQ(type1.output, FizzyValueTypeI32);
5958

6059
const auto type2 = fizzy_get_function_type(module, 2);
6160
EXPECT_EQ(type2.inputs_size, 1);
6261
EXPECT_EQ(type2.inputs[0], FizzyValueTypeI64);
63-
EXPECT_EQ(type2.outputs_size, 0);
62+
EXPECT_EQ(type2.output, FizzyValueTypeVoid);
6463

6564
const auto type3 = fizzy_get_function_type(module, 3);
6665
EXPECT_EQ(type3.inputs_size, 1);
6766
EXPECT_EQ(type3.inputs[0], FizzyValueTypeF64);
68-
EXPECT_EQ(type3.outputs_size, 1);
69-
EXPECT_EQ(type3.outputs[0], FizzyValueTypeF32);
67+
EXPECT_EQ(type3.output, FizzyValueTypeF32);
7068

7169
fizzy_free_module(module);
7270
}
@@ -126,9 +124,7 @@ TEST(capi, instantiate_imported_function)
126124
module = fizzy_parse(wasm.data(), wasm.size());
127125
ASSERT_NE(module, nullptr);
128126

129-
const auto output = FizzyValueTypeI32;
130-
131-
FizzyExternalFunction host_funcs[] = {{{nullptr, 0, &output, 1},
127+
FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, nullptr, 0},
132128
[](void*, FizzyInstance*, const FizzyValue*, int) {
133129
return FizzyExecutionResult{false, true, {42}};
134130
},
@@ -252,14 +248,13 @@ TEST(capi, execute_with_host_function)
252248
ASSERT_NE(module, nullptr);
253249

254250
const FizzyValueType inputs[] = {FizzyValueTypeI32, FizzyValueTypeI32};
255-
const FizzyValueType output = FizzyValueTypeI32;
256251

257-
FizzyExternalFunction host_funcs[] = {{{nullptr, 0, &output, 1},
252+
FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, nullptr, 0},
258253
[](void*, FizzyInstance*, const FizzyValue*, int) {
259254
return FizzyExecutionResult{false, true, {42}};
260255
},
261256
nullptr},
262-
{{&inputs[0], 2, &output, 1},
257+
{{FizzyValueTypeI32, &inputs[0], 2},
263258
[](void*, FizzyInstance*, const FizzyValue* args, int) {
264259
return FizzyExecutionResult{false, true, {args[0].i64 / args[1].i64}};
265260
},
@@ -289,9 +284,7 @@ TEST(capi, imported_function_traps)
289284
auto module = fizzy_parse(wasm.data(), wasm.size());
290285
ASSERT_NE(module, nullptr);
291286

292-
const FizzyValueType output = FizzyValueTypeI32;
293-
294-
FizzyExternalFunction host_funcs[] = {{{nullptr, 0, &output, 1},
287+
FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, nullptr, 0},
295288
[](void*, FizzyInstance*, const FizzyValue*, int) {
296289
return FizzyExecutionResult{true, false, {}};
297290
},
@@ -384,9 +377,8 @@ TEST(capi, imported_function_from_another_module)
384377
};
385378

386379
const FizzyValueType inputs[] = {FizzyValueTypeI32, FizzyValueTypeI32};
387-
const FizzyValueType output = FizzyValueTypeI32;
388380

389-
FizzyExternalFunction host_funcs[] = {{{&inputs[0], 2, &output, 1}, sub, &host_context}};
381+
FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, &inputs[0], 2}, sub, &host_context}};
390382

391383
auto instance2 = fizzy_instantiate(module2, host_funcs, 1);
392384
ASSERT_NE(instance2, nullptr);

0 commit comments

Comments
 (0)