in plugins/experimental/wasm/lib/src/wasmedge/wasmedge.cc [316:364]
bool WasmEdge::link(std::string_view /*debug_name*/) {
assert(ast_module_ != nullptr);
// Create store and register imports.
if (store_ == nullptr) {
store_ = WasmEdge_StoreCreate();
}
if (store_ == nullptr) {
return false;
}
WasmEdge_Result res;
for (auto &&it : host_modules_) {
res = WasmEdge_ExecutorRegisterImport(executor_.get(), store_.get(), it.second->cxt_);
if (!WasmEdge_ResultOK(res)) {
fail(FailState::UnableToInitializeCode,
std::string("Failed to link Wasm module due to import: ") + it.first);
return false;
}
}
// Instantiate module.
WasmEdge_ModuleInstanceContext *mod = nullptr;
res = WasmEdge_ExecutorInstantiate(executor_.get(), &mod, store_.get(), ast_module_.get());
if (!WasmEdge_ResultOK(res)) {
fail(FailState::UnableToInitializeCode,
std::string("Failed to link Wasm module: ") + std::string(WasmEdge_ResultGetMessage(res)));
return false;
}
// Get the function and memory exports.
uint32_t memory_num = WasmEdge_ModuleInstanceListMemoryLength(mod);
if (memory_num > 0) {
WasmEdge_String name;
WasmEdge_ModuleInstanceListMemory(mod, &name, 1);
memory_ = WasmEdge_ModuleInstanceFindMemory(mod, name);
if (memory_ == nullptr) {
WasmEdge_ModuleInstanceDelete(mod);
return false;
}
}
uint32_t func_num = WasmEdge_ModuleInstanceListFunctionLength(mod);
if (func_num > 0) {
std::vector<WasmEdge_String> names(func_num);
WasmEdge_ModuleInstanceListFunction(mod, &names[0], func_num);
for (auto i = 0; i < func_num; i++) {
module_functions_.insert(std::string(names[i].Buf, names[i].Length));
}
}
module_ = mod;
return true;
}