/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 |