Coverage Report

Created: 2026-09-28 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/WasmEdge/include/runtime/instance/component/component.h
Line
Count
Source
1
// SPDX-License-Identifier: Apache-2.0
2
// SPDX-FileCopyrightText: Copyright The WasmEdge Authors
3
4
//===-- wasmedge/runtime/instance/component.h - Component Instance definition //
5
//
6
// Part of the WasmEdge Project.
7
//
8
//===----------------------------------------------------------------------===//
9
///
10
/// \file
11
/// This file contains the component instance definition.
12
///
13
//===----------------------------------------------------------------------===//
14
#pragma once
15
16
#include "ast/component/component.h"
17
#include "ast/module.h"
18
#include "ast/type.h"
19
#include "common/errcode.h"
20
#include "common/types.h"
21
#include "runtime/instance/component/function.h"
22
#include "runtime/instance/module.h"
23
#include "runtime/instance/tag.h"
24
25
#include <atomic>
26
#include <functional>
27
#include <map>
28
#include <memory>
29
#include <string>
30
#include <type_traits>
31
#include <vector>
32
33
namespace WasmEdge {
34
namespace Runtime {
35
namespace Instance {
36
37
class ComponentInstance;
38
39
class ComponentImportManager {
40
  // The import manager is used to supply imports for locally instantiated child
41
  // components and core modules.
42
public:
43
  // Export a named component func to this import manager.
44
  void exportFunction(std::string_view Name,
45
0
                      Component::FunctionInstance *Inst) noexcept {
46
0
    NamedFunc.emplace(Name, Inst);
47
0
  }
48
49
  // Export a named component instance to this import manager.
50
  void exportComponentInstance(std::string_view Name,
51
0
                               const ComponentInstance *Inst) noexcept {
52
0
    NamedCompInst.emplace(Name, Inst);
53
0
  }
54
55
  // Export a named core function instance to this import manager.
56
  void exportCoreFunctionInstance(std::string_view Name,
57
0
                                  FunctionInstance *Inst) noexcept {
58
0
    NamedCoreFunc.emplace(Name, Inst);
59
0
  }
60
61
  // Export a named core table instance to this import manager.
62
  void exportCoreTableInstance(std::string_view Name,
63
0
                               TableInstance *Inst) noexcept {
64
0
    NamedCoreTable.emplace(Name, Inst);
65
0
  }
66
67
  // Export a named core memory instance to this import manager.
68
  void exportCoreMemoryInstance(std::string_view Name,
69
0
                                MemoryInstance *Inst) noexcept {
70
0
    NamedCoreMemory.emplace(Name, Inst);
71
0
  }
72
73
  // Export a named core global instance to this import manager.
74
  void exportCoreGlobalInstance(std::string_view Name,
75
0
                                GlobalInstance *Inst) noexcept {
76
0
    NamedCoreGlobal.emplace(Name, Inst);
77
0
  }
78
79
  // Export a named core module instance to this import manager.
80
  void exportCoreModuleInstance(std::string_view Name,
81
0
                                const ModuleInstance *Inst) noexcept {
82
0
    NamedCoreModInst.emplace(Name, Inst);
83
0
  }
84
85
  // Export a named component to this import manager.
86
  void exportComponent(std::string_view Name,
87
0
                       const AST::Component::Component *Comp) noexcept {
88
0
    NamedComp.emplace(Name, Comp);
89
0
  }
90
91
  // Export a named core type to this import manager.
92
  void exportCoreType(std::string_view Name,
93
0
                      const AST::Component::CoreDefType *Ty) noexcept {
94
0
    NamedCoreType.emplace(Name, Ty);
95
0
  }
96
97
  // Export a named core module to this import manager.
98
  void exportCoreModule(std::string_view Name,
99
0
                        const AST::Module *Mod) noexcept {
100
0
    NamedCoreMod.emplace(Name, Mod);
101
0
  }
102
103
  // Find component func by name.
104
  Component::FunctionInstance *
105
0
  findFunction(std::string_view Name) const noexcept {
106
0
    return findExport(NamedFunc, Name);
107
0
  }
108
109
  // Find component instance by name.
110
  const ComponentInstance *
111
0
  findComponentInstance(std::string_view Name) const noexcept {
112
0
    return findExport(NamedCompInst, Name);
113
0
  }
114
115
  // Find core function instance by name.
116
  FunctionInstance *
117
0
  findCoreFunctionInstance(std::string_view Name) const noexcept {
118
0
    return findExport(NamedCoreFunc, Name);
119
0
  }
120
121
  // Find core table instance by name.
122
0
  TableInstance *findCoreTableInstance(std::string_view Name) const noexcept {
123
0
    return findExport(NamedCoreTable, Name);
124
0
  }
125
126
  // Find core memory instance by name.
127
0
  MemoryInstance *findCoreMemoryInstance(std::string_view Name) const noexcept {
128
0
    return findExport(NamedCoreMemory, Name);
129
0
  }
130
131
  // Find core global instance by name.
132
0
  GlobalInstance *findCoreGlobalInstance(std::string_view Name) const noexcept {
133
0
    return findExport(NamedCoreGlobal, Name);
134
0
  }
135
136
  // Find core module instance by name.
137
  const ModuleInstance *
138
0
  findCoreModuleInstance(std::string_view Name) const noexcept {
139
0
    return findExport(NamedCoreModInst, Name);
140
0
  }
141
142
  // Find component by name.
143
  const AST::Component::Component *
144
0
  findComponent(std::string_view Name) const noexcept {
145
0
    return findExport(NamedComp, Name);
146
0
  }
147
148
  // Find core type by name.
149
  const AST::Component::CoreDefType *
150
0
  findCoreType(std::string_view Name) const noexcept {
151
0
    return findExport(NamedCoreType, Name);
152
0
  }
153
154
  // Find core module by name.
155
0
  const AST::Module *findCoreModule(std::string_view Name) const noexcept {
156
0
    return findExport(NamedCoreMod, Name);
157
0
  }
158
159
  // Reset the import manager.
160
0
  void reset() noexcept {
161
0
    NamedFunc.clear();
162
0
    NamedCompInst.clear();
163
0
    NamedCoreFunc.clear();
164
0
    NamedCoreTable.clear();
165
0
    NamedCoreMemory.clear();
166
0
    NamedCoreGlobal.clear();
167
0
    NamedCoreModInst.clear();
168
0
    NamedComp.clear();
169
0
    NamedCoreType.clear();
170
0
    NamedCoreMod.clear();
171
0
  }
172
173
private:
174
  // Find export template.
175
  template <typename T>
176
  T *findExport(const std::map<std::string, T *, std::less<>> &Map,
177
0
                std::string_view ExtName) const noexcept {
178
0
    auto Iter = Map.find(ExtName);
179
0
    if (likely(Iter != Map.cend())) {
180
0
      return Iter->second;
181
0
    }
182
0
    return nullptr;
183
0
  }
Unexecuted instantiation: WasmEdge::Runtime::Instance::Component::FunctionInstance* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::Component::FunctionInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::Component::FunctionInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::Component::FunctionInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::ComponentInstance const* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::ComponentInstance const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::ComponentInstance const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::ComponentInstance const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::FunctionInstance* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::FunctionInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::FunctionInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::FunctionInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::TableInstance* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::TableInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::TableInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::TableInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::MemoryInstance* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::MemoryInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::MemoryInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::MemoryInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::GlobalInstance* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::GlobalInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::GlobalInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::GlobalInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::ModuleInstance const* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::Runtime::Instance::ModuleInstance const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::ModuleInstance const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::ModuleInstance const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Component::Component const* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::AST::Component::Component const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Component::Component const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Component::Component const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Component::CoreDefType const* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::AST::Component::CoreDefType const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Component::CoreDefType const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Component::CoreDefType const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Module const* WasmEdge::Runtime::Instance::ComponentImportManager::findExport<WasmEdge::AST::Module const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Module const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Module const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
184
185
  // Export with name for the index spaces.
186
  std::map<std::string, Component::FunctionInstance *, std::less<>> NamedFunc;
187
  // TODO: NamedValue
188
  // TODO: NamedType
189
  std::map<std::string, const ComponentInstance *, std::less<>> NamedCompInst;
190
  std::map<std::string, const AST::Component::Component *, std::less<>>
191
      NamedComp;
192
  std::map<std::string, FunctionInstance *, std::less<>> NamedCoreFunc;
193
  std::map<std::string, TableInstance *, std::less<>> NamedCoreTable;
194
  std::map<std::string, MemoryInstance *, std::less<>> NamedCoreMemory;
195
  std::map<std::string, GlobalInstance *, std::less<>> NamedCoreGlobal;
196
  std::map<std::string, const AST::Component::CoreDefType *, std::less<>>
197
      NamedCoreType;
198
  std::map<std::string, const ModuleInstance *, std::less<>> NamedCoreModInst;
199
  std::map<std::string, const AST::Module *, std::less<>> NamedCoreMod;
200
};
201
202
class ComponentInstance {
203
  // The component instance class is used not only for the runtime data
204
  // structure but also for the instantiation context according to the linking
205
  // isolation and the module and component type declarations.
206
public:
207
0
  ComponentInstance(std::string_view Name) : CompName(Name) {}
208
209
  // Getter for the component name.
210
0
  std::string_view getComponentName() const noexcept { return CompName; }
211
212
  // Instantiation finalizer. Should clean up all instantiation time data.
213
0
  void finishInstantiation() noexcept {
214
0
    Comps.clear();
215
0
    CoreMods.clear();
216
0
  }
217
218
  // values stored in component instance
219
0
  ComponentValVariant getValue(uint32_t Index) const noexcept {
220
0
    if (ValueList.size() > Index) {
221
0
      return ValueList[Index];
222
0
    }
223
0
    return 0;
224
0
  }
225
0
  void setValue(uint32_t Index, ComponentValVariant V) noexcept {
226
0
    if (ValueList.size() <= Index) {
227
0
      ValueList.resize(Index + 1, 0U);
228
0
    }
229
0
    ValueList[Index] = V;
230
0
  }
231
232
  // Index space: component function instance.
233
  void
234
0
  addFunction(std::unique_ptr<Component::FunctionInstance> &&Inst) noexcept {
235
0
    OwnedFuncInsts.push_back(std::move(Inst));
236
0
    FuncInsts.push_back(OwnedFuncInsts.back().get());
237
0
  }
238
0
  void addFunction(Component::FunctionInstance *Inst) noexcept {
239
0
    FuncInsts.push_back(Inst);
240
0
  }
241
0
  Component::FunctionInstance *getFunction(uint32_t Index) const noexcept {
242
0
    return FuncInsts[Index];
243
0
  }
244
0
  void exportFunction(std::string_view Name, uint32_t Idx) noexcept {
245
0
    ExpFuncInsts.insert_or_assign(std::string(Name), FuncInsts[Idx]);
246
0
  }
247
  Component::FunctionInstance *
248
0
  findFunction(std::string_view Name) const noexcept {
249
0
    return findExport(ExpFuncInsts, Name);
250
0
  }
251
  template <typename CallbackT>
252
0
  auto getFuncExports(CallbackT &&CallBack) const noexcept {
253
0
    return std::forward<CallbackT>(CallBack)(ExpFuncInsts);
254
0
  }
255
256
  // Index space: type.
257
  // TODO: deep copy the type
258
0
  void addType(const AST::Component::DefType &Ty) noexcept {
259
0
    Types.emplace_back(&Ty);
260
0
  }
261
0
  const AST::Component::DefType *getType(uint32_t Index) const noexcept {
262
0
    return Types[Index];
263
0
  }
264
0
  void exportType(std::string_view Name, uint32_t Idx) noexcept {
265
0
    ExpTypes.insert_or_assign(std::string(Name), Types[Idx]);
266
0
  }
267
  const AST::Component::DefType *
268
0
  findType(std::string_view Name) const noexcept {
269
0
    return findExport(ExpTypes, Name);
270
0
  }
271
272
  // Index space: component instance.
273
  void
274
0
  addComponentInstance(std::unique_ptr<ComponentInstance> &&Inst) noexcept {
275
0
    OwnedCompInsts.push_back(std::move(Inst));
276
0
    CompInsts.push_back(OwnedCompInsts.back().get());
277
0
  }
278
0
  void addComponentInstance(const ComponentInstance *Inst) noexcept {
279
0
    CompInsts.push_back(Inst);
280
0
  }
281
0
  const ComponentInstance *getComponentInstance(uint32_t Index) const noexcept {
282
0
    return CompInsts[Index];
283
0
  }
284
0
  void exportComponentInstance(std::string_view Name, uint32_t Idx) noexcept {
285
0
    ExpCompInsts.insert_or_assign(std::string(Name), CompInsts[Idx]);
286
0
  }
287
  const ComponentInstance *
288
0
  findComponentInstance(std::string_view Name) const noexcept {
289
0
    return findExport(ExpCompInsts, Name);
290
0
  }
291
292
  // Index space: component. (declaration for instantiation phase)
293
0
  void addComponent(const AST::Component::Component &C) noexcept {
294
0
    Comps.emplace_back(&C);
295
0
  }
296
0
  const AST::Component::Component &getComponent(uint32_t Index) const noexcept {
297
0
    return *Comps[Index];
298
0
  }
299
0
  void exportComponent(std::string_view Name, uint32_t Idx) noexcept {
300
0
    ExpComps.insert_or_assign(std::string(Name), Comps[Idx]);
301
0
  }
302
  const AST::Component::Component *
303
0
  findComponent(std::string_view Name) const noexcept {
304
0
    return findExport(ExpComps, Name);
305
0
  }
306
307
  // Index space: core function.
308
0
  void addCoreFunction(std::unique_ptr<FunctionInstance> &&Inst) noexcept {
309
0
    OwnedCoreFuncInsts.push_back(std::move(Inst));
310
0
    CoreFuncInsts.push_back(OwnedCoreFuncInsts.back().get());
311
0
  }
312
0
  void addCoreFunction(FunctionInstance *Inst) noexcept {
313
0
    CoreFuncInsts.push_back(Inst);
314
0
  }
315
  /// Add a host function to the core function index space. The function is
316
  /// owned by an auxiliary ModuleInstance (created here) whose only purpose
317
  /// is to register the host function's defined type so that downstream
318
  /// import matching (which walks ModInst::getTypeList()) succeeds. This is
319
  /// used by canon lower to expose its thunk to core wasm.
320
  void addCoreHostFunction(std::unique_ptr<Runtime::HostFunctionBase> &&Host,
321
0
                           std::string_view Name = "$canon-lower") {
322
0
    auto Mod = std::make_unique<ModuleInstance>("");
323
0
    Mod->addHostFunc(std::string(Name), std::move(Host));
324
0
    auto *FuncPtr = Mod->findFuncExports(std::string(Name));
325
0
    CoreFuncInsts.push_back(FuncPtr);
326
0
    OwnedAuxModInsts.push_back(std::move(Mod));
327
0
  }
328
0
  FunctionInstance *getCoreFunction(uint32_t Index) const noexcept {
329
0
    return CoreFuncInsts[Index];
330
0
  }
331
0
  void exportCoreFunction(std::string_view Name, uint32_t Idx) noexcept {
332
0
    ExpCoreFuncInsts.insert_or_assign(std::string(Name), CoreFuncInsts[Idx]);
333
0
  }
334
0
  FunctionInstance *findCoreFunction(std::string_view Name) const noexcept {
335
0
    return findExport(ExpCoreFuncInsts, Name);
336
0
  }
337
338
  // Index space: core table.
339
0
  void addCoreTable(TableInstance *Inst) noexcept {
340
0
    CoreTabInsts.push_back(Inst);
341
0
  }
342
0
  TableInstance *getCoreTable(uint32_t Index) const noexcept {
343
0
    return CoreTabInsts[Index];
344
0
  }
345
0
  void exportCoreTable(std::string_view Name, uint32_t Idx) noexcept {
346
0
    ExpCoreTabInsts.insert_or_assign(std::string(Name), CoreTabInsts[Idx]);
347
0
  }
348
0
  TableInstance *findCoreTable(std::string_view Name) const noexcept {
349
0
    return findExport(ExpCoreTabInsts, Name);
350
0
  }
351
352
  // Index space: core memory.
353
0
  void addCoreMemory(MemoryInstance *Inst) noexcept {
354
0
    CoreMemInsts.push_back(Inst);
355
0
  }
356
0
  MemoryInstance *getCoreMemory(uint32_t Index) const noexcept {
357
0
    return CoreMemInsts[Index];
358
0
  }
359
0
  void exportCoreMemory(std::string_view Name, uint32_t Idx) noexcept {
360
0
    ExpCoreMemInsts.insert_or_assign(std::string(Name), CoreMemInsts[Idx]);
361
0
  }
362
0
  MemoryInstance *findCoreMemory(std::string_view Name) const noexcept {
363
0
    return findExport(ExpCoreMemInsts, Name);
364
0
  }
365
366
  // Index space: core glocal.
367
0
  void addCoreGlobal(GlobalInstance *Inst) noexcept {
368
0
    CoreGlobInsts.push_back(Inst);
369
0
  }
370
0
  GlobalInstance *getCoreGlobal(uint32_t Index) const noexcept {
371
0
    return CoreGlobInsts[Index];
372
0
  }
373
0
  void exportCoreGlobal(std::string_view Name, uint32_t Idx) noexcept {
374
0
    ExpCoreGlobInsts.insert_or_assign(std::string(Name), CoreGlobInsts[Idx]);
375
0
  }
376
0
  GlobalInstance *findCoreGlobal(std::string_view Name) const noexcept {
377
0
    return findExport(ExpCoreGlobInsts, Name);
378
0
  }
379
380
  // Index space: core tag.
381
0
  void addCoreTag(TagInstance *Inst) noexcept { CoreTagInsts.push_back(Inst); }
382
0
  TagInstance *getCoreTag(uint32_t Index) const noexcept {
383
0
    return CoreTagInsts[Index];
384
0
  }
385
0
  void exportCoreTag(std::string_view Name, uint32_t Idx) noexcept {
386
0
    ExpCoreTagInsts.insert_or_assign(std::string(Name), CoreTagInsts[Idx]);
387
0
  }
388
0
  TagInstance *findCoreTag(std::string_view Name) const noexcept {
389
0
    return findExport(ExpCoreTagInsts, Name);
390
0
  }
391
392
  // Index space: core type.
393
  // TODO: deep copy the type
394
0
  void addCoreType(const AST::Component::CoreDefType &Ty) noexcept {
395
0
    CoreTypes.emplace_back(&Ty);
396
0
  }
397
  const AST::Component::CoreDefType &
398
0
  getCoreType(uint32_t Index) const noexcept {
399
0
    return *CoreTypes[Index];
400
0
  }
401
0
  void exportCoreType(std::string_view Name, uint32_t Idx) noexcept {
402
0
    ExpCoreTypes.insert_or_assign(std::string(Name), CoreTypes[Idx]);
403
0
  }
404
  const AST::Component::CoreDefType *
405
0
  findCoreType(std::string_view Name) const noexcept {
406
0
    return findExport(ExpCoreTypes, Name);
407
0
  }
408
409
  // Index space: core module instance.
410
0
  void addCoreModuleInstance(std::unique_ptr<ModuleInstance> &&Inst) noexcept {
411
0
    OwnedCoreModInsts.push_back(std::move(Inst));
412
0
    CoreModInsts.push_back(OwnedCoreModInsts.back().get());
413
0
  }
414
0
  const ModuleInstance *getCoreModuleInstance(uint32_t Index) const noexcept {
415
0
    return CoreModInsts[Index];
416
0
  }
417
0
  void exportCoreModuleInstance(std::string_view Name, uint32_t Idx) noexcept {
418
0
    ExpCoreModInsts.insert_or_assign(std::string(Name), CoreModInsts[Idx]);
419
0
  }
420
  const ModuleInstance *
421
0
  findCoreModuleInstance(std::string_view Name) const noexcept {
422
0
    return findExport(ExpCoreModInsts, Name);
423
0
  }
424
425
  // Index space: module. (declaration for instantiation phase)
426
0
  void addModule(const AST::Module &M) noexcept { CoreMods.emplace_back(&M); }
427
0
  const AST::Module &getModule(uint32_t Index) const noexcept {
428
0
    return *CoreMods[Index];
429
0
  }
430
0
  void exportCoreModule(std::string_view Name, uint32_t Idx) noexcept {
431
0
    ExpCoreMods.insert_or_assign(std::string(Name), CoreMods[Idx]);
432
0
  }
433
0
  const AST::Module *findCoreModule(std::string_view Name) const noexcept {
434
0
    return findExport(ExpCoreMods, Name);
435
0
  }
436
437
private:
438
  std::string CompName;
439
440
  // value
441
  std::vector<ComponentValVariant> ValueList;
442
443
  // Index spaces.
444
  // The index spaces of AST should be cleaned after instantiation.
445
  std::vector<Component::FunctionInstance *> FuncInsts;
446
  // TODO: values
447
  std::vector<const AST::Component::DefType *> Types;
448
  std::vector<const ComponentInstance *> CompInsts;
449
  std::vector<const AST::Component::Component *> Comps;
450
  std::vector<FunctionInstance *> CoreFuncInsts;
451
  std::vector<TableInstance *> CoreTabInsts;
452
  std::vector<MemoryInstance *> CoreMemInsts;
453
  std::vector<GlobalInstance *> CoreGlobInsts;
454
  std::vector<const AST::Component::CoreDefType *> CoreTypes;
455
  std::vector<TagInstance *> CoreTagInsts;
456
  std::vector<const ModuleInstance *> CoreModInsts;
457
  std::vector<const AST::Module *> CoreMods;
458
459
  // Storage of index spaces.
460
  std::vector<std::unique_ptr<Component::FunctionInstance>> OwnedFuncInsts;
461
  // std::vector<std::unique_ptr<AST::Component::DefType>> OwnedTypes;
462
  std::vector<std::unique_ptr<ComponentInstance>> OwnedCompInsts;
463
  std::vector<std::unique_ptr<FunctionInstance>> OwnedCoreFuncInsts;
464
  // std::vector<std::unique_ptr<AST::Component::CoreDefType>> OwnedCoreTypes;
465
  std::vector<std::unique_ptr<ModuleInstance>> OwnedCoreModInsts;
466
  // Holder modules for synthesized host functions (e.g., canon lower thunks).
467
  // Not visible in the core-module index space; only owns the host function
468
  // and its registered SubType for matchType lookups.
469
  std::vector<std::unique_ptr<ModuleInstance>> OwnedAuxModInsts;
470
471
  // Export alias.
472
  std::map<std::string, Component::FunctionInstance *, std::less<>>
473
      ExpFuncInsts;
474
  // TODO: ExpValue
475
  std::map<std::string, const AST::Component::DefType *, std::less<>> ExpTypes;
476
  std::map<std::string, const ComponentInstance *, std::less<>> ExpCompInsts;
477
  std::map<std::string, const AST::Component::Component *, std::less<>>
478
      ExpComps;
479
  std::map<std::string, FunctionInstance *, std::less<>> ExpCoreFuncInsts;
480
  std::map<std::string, TableInstance *, std::less<>> ExpCoreTabInsts;
481
  std::map<std::string, MemoryInstance *, std::less<>> ExpCoreMemInsts;
482
  std::map<std::string, GlobalInstance *, std::less<>> ExpCoreGlobInsts;
483
  std::map<std::string, TagInstance *, std::less<>> ExpCoreTagInsts;
484
  std::map<std::string, const AST::Component::CoreDefType *, std::less<>>
485
      ExpCoreTypes;
486
  std::map<std::string, const ModuleInstance *, std::less<>> ExpCoreModInsts;
487
  std::map<std::string, const AST::Module *, std::less<>> ExpCoreMods;
488
489
  // Find export template.
490
  template <typename T>
491
  T *findExport(const std::map<std::string, T *, std::less<>> &Map,
492
0
                std::string_view ExtName) const noexcept {
493
0
    auto Iter = Map.find(ExtName);
494
0
    if (likely(Iter != Map.cend())) {
495
0
      return Iter->second;
496
0
    }
497
0
    return nullptr;
498
0
  }
Unexecuted instantiation: WasmEdge::Runtime::Instance::Component::FunctionInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::Component::FunctionInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::Component::FunctionInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::Component::FunctionInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Component::DefType const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::AST::Component::DefType const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Component::DefType const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Component::DefType const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::ComponentInstance const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::ComponentInstance const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::ComponentInstance const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::ComponentInstance const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Component::Component const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::AST::Component::Component const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Component::Component const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Component::Component const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::FunctionInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::FunctionInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::FunctionInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::FunctionInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::TableInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::TableInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::TableInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::TableInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::MemoryInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::MemoryInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::MemoryInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::MemoryInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::GlobalInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::GlobalInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::GlobalInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::GlobalInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::TagInstance* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::TagInstance>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::TagInstance*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::TagInstance*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Component::CoreDefType const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::AST::Component::CoreDefType const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Component::CoreDefType const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Component::CoreDefType const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::Runtime::Instance::ModuleInstance const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::Runtime::Instance::ModuleInstance const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::Runtime::Instance::ModuleInstance const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::Runtime::Instance::ModuleInstance const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
Unexecuted instantiation: WasmEdge::AST::Module const* WasmEdge::Runtime::Instance::ComponentInstance::findExport<WasmEdge::AST::Module const>(std::__1::map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, WasmEdge::AST::Module const*, std::__1::less<void>, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, WasmEdge::AST::Module const*> > > const&, std::__1::basic_string_view<char, std::__1::char_traits<char> >) const
499
};
500
501
} // namespace Instance
502
} // namespace Runtime
503
} // namespace WasmEdge