Skip to content

Commit

Permalink
capi: Add rich error reporting to fizzy_instantiate
Browse files Browse the repository at this point in the history
  • Loading branch information
gumb0 committed Mar 29, 2021
1 parent 560b191 commit 3ee2e20
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 39 deletions.
1 change: 1 addition & 0 deletions bindings/rust/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ impl Module {
std::ptr::null(),
std::ptr::null(),
0,
std::ptr::null_mut(),
)
};
// Forget Module (and avoid calling drop) because it has been consumed by instantiate (even if it failed).
Expand Down
2 changes: 1 addition & 1 deletion include/fizzy/fizzy.h
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,7 @@ bool fizzy_module_has_start_function(const FizzyModule* module);
FizzyInstance* fizzy_instantiate(const FizzyModule* module,
const FizzyExternalFunction* imported_functions, size_t imported_functions_size,
const FizzyExternalTable* imported_table, const FizzyExternalMemory* imported_memory,
const FizzyExternalGlobal* imported_globals, size_t imported_globals_size);
const FizzyExternalGlobal* imported_globals, size_t imported_globals_size, FizzyError* error);

/// Instantiate a module resolving imported functions.
///
Expand Down
4 changes: 3 additions & 1 deletion lib/fizzy/capi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -586,7 +586,7 @@ bool fizzy_module_has_start_function(const FizzyModule* module)
FizzyInstance* fizzy_instantiate(const FizzyModule* module,
const FizzyExternalFunction* imported_functions, size_t imported_functions_size,
const FizzyExternalTable* imported_table, const FizzyExternalMemory* imported_memory,
const FizzyExternalGlobal* imported_globals, size_t imported_globals_size)
const FizzyExternalGlobal* imported_globals, size_t imported_globals_size, FizzyError* error)
{
try
{
Expand All @@ -598,10 +598,12 @@ FizzyInstance* fizzy_instantiate(const FizzyModule* module,
auto instance = fizzy::instantiate(std::unique_ptr<const fizzy::Module>(unwrap(module)),
std::move(functions), std::move(table), std::move(memory), std::move(globals));

set_success(error);
return wrap(instance.release());
}
catch (...)
{
set_error(error);
return nullptr;
}
}
Expand Down
88 changes: 51 additions & 37 deletions test/unittests/capi_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ TEST(capi, export_name_after_instantiate)
const auto export0 = fizzy_get_export_description(module, 0);
EXPECT_STREQ(export0.name, "fn");

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance, nullptr);

EXPECT_STREQ(export0.name, "fn");
Expand Down Expand Up @@ -456,7 +456,7 @@ TEST(capi, find_exported_function)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalFunction function;
Expand Down Expand Up @@ -494,7 +494,7 @@ TEST(capi, find_exported_table)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalTable table;
Expand Down Expand Up @@ -524,7 +524,7 @@ TEST(capi, find_exported_table_no_max)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalTable table;
Expand Down Expand Up @@ -553,7 +553,7 @@ TEST(capi, find_exported_memory)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalMemory memory;
Expand Down Expand Up @@ -583,7 +583,7 @@ TEST(capi, find_exported_memory_no_max)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalMemory memory;
Expand Down Expand Up @@ -612,7 +612,7 @@ TEST(capi, find_exported_global)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

FizzyExternalGlobal global;
Expand Down Expand Up @@ -658,12 +658,21 @@ TEST(capi, has_start_function)
TEST(capi, instantiate)
{
uint8_t wasm_prefix[]{0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00};
auto module = fizzy_parse(wasm_prefix, sizeof(wasm_prefix), nullptr);
const auto* module = fizzy_parse(wasm_prefix, sizeof(wasm_prefix), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance, nullptr);

const auto* module_clone = fizzy_clone_module(module);
ASSERT_NE(module_clone, nullptr);
fizzy_free_instance(instance);

FizzyError success;
instance = fizzy_instantiate(module_clone, nullptr, 0, nullptr, nullptr, nullptr, 0, &success);
EXPECT_NE(instance, nullptr);
EXPECT_EQ(success.code, FIZZY_SUCCESS);
EXPECT_STREQ(success.message, "");
fizzy_free_instance(instance);
}

Expand All @@ -676,14 +685,15 @@ TEST(capi, instantiate_imported_function)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

EXPECT_EQ(fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0), nullptr);
EXPECT_EQ(
fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr), nullptr);

module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, nullptr, 0}, NullFn, nullptr}};

auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance, nullptr);

fizzy_free_instance(instance);
Expand Down Expand Up @@ -718,7 +728,7 @@ TEST(capi, instantiate_imported_globals)
{&g2, {FizzyValueTypeI64, false}}, {&g3, {FizzyValueTypeF32, false}},
{&g4, {FizzyValueTypeF64, true}}};

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals, 4);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals, 4, nullptr);
EXPECT_NE(instance, nullptr);

EXPECT_THAT(fizzy_execute(instance, 0, nullptr), CResult(42_u32));
Expand All @@ -731,12 +741,14 @@ TEST(capi, instantiate_imported_globals)
// No globals provided.
module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);
EXPECT_EQ(fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0), nullptr);
EXPECT_EQ(
fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr), nullptr);

// Not enough globals provided.
module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);
EXPECT_EQ(fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals, 3), nullptr);
EXPECT_EQ(
fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals, 3, nullptr), nullptr);

// Incorrect order or globals.
module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
Expand All @@ -746,7 +758,8 @@ TEST(capi, instantiate_imported_globals)
{&g2, {FizzyValueTypeI64, false}}, {&g4, {FizzyValueTypeF64, true}},
{&g3, {FizzyValueTypeF32, false}}};

EXPECT_EQ(fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals_incorrect_order, 4),
EXPECT_EQ(fizzy_instantiate(
module, nullptr, 0, nullptr, nullptr, globals_incorrect_order, 4, nullptr),
nullptr);

// Global type mismatch.
Expand All @@ -758,7 +771,8 @@ TEST(capi, instantiate_imported_globals)
{&g4, {FizzyValueTypeF64, true}}};

EXPECT_EQ(
fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals_type_mismatch, 4), nullptr);
fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, globals_type_mismatch, 4, nullptr),
nullptr);
}

TEST(capi, instantiate_twice)
Expand All @@ -767,13 +781,13 @@ TEST(capi, instantiate_twice)
const auto* module1 = fizzy_parse(wasm_prefix, sizeof(wasm_prefix), nullptr);
ASSERT_NE(module1, nullptr);

auto* instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto* instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance1, nullptr);

const auto* module2 = fizzy_clone_module(module1);
ASSERT_NE(module2, nullptr);

auto* instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto* instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance2, nullptr);
EXPECT_NE(instance1, instance2);

Expand Down Expand Up @@ -1053,7 +1067,7 @@ TEST(capi, get_instance_module)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

auto instance_module = fizzy_get_instance_module(instance);
Expand All @@ -1073,7 +1087,7 @@ TEST(capi, memory_access_no_memory)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_EQ(fizzy_get_instance_memory_data(instance), nullptr);
Expand All @@ -1091,7 +1105,7 @@ TEST(capi, memory_access_empty_memory)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_NE(fizzy_get_instance_memory_data(instance), nullptr);
Expand All @@ -1116,7 +1130,7 @@ TEST(capi, memory_access)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

uint8_t* memory = fizzy_get_instance_memory_data(instance);
Expand Down Expand Up @@ -1150,7 +1164,7 @@ TEST(capi, imported_memory_access)
auto* module_memory = fizzy_parse(wasm_memory.data(), wasm_memory.size(), nullptr);
ASSERT_NE(module_memory, nullptr);
auto* instance_memory =
fizzy_instantiate(module_memory, nullptr, 0, nullptr, nullptr, nullptr, 0);
fizzy_instantiate(module_memory, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance_memory, nullptr);

FizzyExternalMemory memory;
Expand All @@ -1168,7 +1182,7 @@ TEST(capi, imported_memory_access)
auto* module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto* instance = fizzy_instantiate(module, nullptr, 0, nullptr, &memory, nullptr, 0);
auto* instance = fizzy_instantiate(module, nullptr, 0, nullptr, &memory, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_EQ(fizzy_execute(instance, 0, nullptr).value.i32, 0x221100);
Expand Down Expand Up @@ -1205,7 +1219,7 @@ TEST(capi, execute)
auto module = fizzy_parse(wasm.data(), wasm.size(), nullptr);
ASSERT_NE(module, nullptr);

auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_THAT(fizzy_execute(instance, 0, nullptr), CResult());
Expand Down Expand Up @@ -1244,7 +1258,7 @@ TEST(capi, execute_with_host_function)
},
nullptr}};

auto instance = fizzy_instantiate(module, host_funcs, 2, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, host_funcs, 2, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_THAT(fizzy_execute(instance, 0, nullptr), CResult(42_u32));
Expand Down Expand Up @@ -1274,7 +1288,7 @@ TEST(capi, imported_function_traps)
},
nullptr}};

auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_THAT(fizzy_execute(instance, 1, nullptr), CTraps());
Expand Down Expand Up @@ -1303,7 +1317,7 @@ TEST(capi, imported_function_void)
},
&called}};

auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance, nullptr);

EXPECT_THAT(fizzy_execute(instance, 1, nullptr), CResult());
Expand All @@ -1327,7 +1341,7 @@ TEST(capi, imported_function_from_another_module)
"0061736d0100000001070160027f7f017f030201000707010373756200000a09010700200020016b0b");
auto module1 = fizzy_parse(bin1.data(), bin1.size(), nullptr);
ASSERT_NE(module1, nullptr);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance1, nullptr);

FizzyExternalFunction func;
Expand All @@ -1350,7 +1364,7 @@ TEST(capi, imported_function_from_another_module)
auto module2 = fizzy_parse(bin2.data(), bin2.size(), nullptr);
ASSERT_NE(module2, nullptr);

auto instance2 = fizzy_instantiate(module2, &func, 1, nullptr, nullptr, nullptr, 0);
auto instance2 = fizzy_instantiate(module2, &func, 1, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance2, nullptr);

FizzyValue args[] = {{44}, {2}};
Expand All @@ -1373,7 +1387,7 @@ TEST(capi, imported_table_from_another_module)
"0400412a0b");
auto module1 = fizzy_parse(bin1.data(), bin1.size(), nullptr);
ASSERT_NE(module1, nullptr);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance1, nullptr);

/* wat2wasm
Expand All @@ -1391,7 +1405,7 @@ TEST(capi, imported_table_from_another_module)
FizzyExternalTable table;
ASSERT_TRUE(fizzy_find_exported_table(instance1, "t", &table));

auto instance2 = fizzy_instantiate(module2, nullptr, 0, &table, nullptr, nullptr, 0);
auto instance2 = fizzy_instantiate(module2, nullptr, 0, &table, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance2, nullptr);

EXPECT_THAT(fizzy_execute(instance2, 0, nullptr), CResult(42_u32));
Expand All @@ -1409,7 +1423,7 @@ TEST(capi, imported_memory_from_another_module)
const auto bin1 = from_hex("0061736d010000000503010001070501016d02000b080100410a0b02aaff");
auto module1 = fizzy_parse(bin1.data(), bin1.size(), nullptr);
ASSERT_NE(module1, nullptr);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance1, nullptr);

/* wat2wasm
Expand All @@ -1427,7 +1441,7 @@ TEST(capi, imported_memory_from_another_module)
FizzyExternalMemory memory;
ASSERT_TRUE(fizzy_find_exported_memory(instance1, "m", &memory));

auto instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, &memory, nullptr, 0);
auto instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, &memory, nullptr, 0, nullptr);
ASSERT_NE(instance2, nullptr);

EXPECT_THAT(fizzy_execute(instance2, 0, nullptr), CResult(0x00ffaa00_u32));
Expand All @@ -1444,7 +1458,7 @@ TEST(capi, imported_global_from_another_module)
const auto bin1 = from_hex("0061736d010000000606017f00412a0b07050101670300");
auto module1 = fizzy_parse(bin1.data(), bin1.size(), nullptr);
ASSERT_NE(module1, nullptr);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0);
auto instance1 = fizzy_instantiate(module1, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr);
ASSERT_NE(instance1, nullptr);

/* wat2wasm
Expand All @@ -1463,7 +1477,7 @@ TEST(capi, imported_global_from_another_module)
FizzyExternalGlobal global;
ASSERT_TRUE(fizzy_find_exported_global(instance1, "g", &global));

auto instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, nullptr, &global, 1);
auto instance2 = fizzy_instantiate(module2, nullptr, 0, nullptr, nullptr, &global, 1, nullptr);
ASSERT_NE(instance2, nullptr);

EXPECT_THAT(fizzy_execute(instance2, 0, nullptr), CResult(42_u32));
Expand Down Expand Up @@ -1730,7 +1744,7 @@ TEST(capi, import_name_after_instantiate)

FizzyExternalFunction host_funcs[] = {{{FizzyValueTypeI32, nullptr, 0}, NullFn, nullptr}};

auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0);
auto instance = fizzy_instantiate(module, host_funcs, 1, nullptr, nullptr, nullptr, 0, nullptr);
EXPECT_NE(instance, nullptr);

EXPECT_STREQ(import0.module, "m");
Expand Down

0 comments on commit 3ee2e20

Please sign in to comment.