bool WasmEdge::link()

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;
}