/src/WasmEdge/lib/loader/ast/description.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | // SPDX-License-Identifier: Apache-2.0 |
2 | | // SPDX-FileCopyrightText: 2019-2024 Second State INC |
3 | | |
4 | | #include "loader/loader.h" |
5 | | |
6 | | namespace WasmEdge { |
7 | | namespace Loader { |
8 | | |
9 | | // Load binary of Import description. See "include/loader/loader.h". |
10 | 11.2k | Expect<void> Loader::loadDesc(AST::ImportDesc &ImpDesc) { |
11 | 11.2k | auto ReportError = [this](auto E) { |
12 | 84 | return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Desc_Import); |
13 | 84 | }; |
14 | | |
15 | | // Read the module name. |
16 | 11.2k | EXPECTED_TRY(FMgr.readName().map_error(ReportError).map([&](std::string S) { |
17 | 11.1k | ImpDesc.setModuleName(S); |
18 | 11.1k | })); |
19 | | |
20 | | // Read the external name. |
21 | 11.1k | EXPECTED_TRY(FMgr.readName().map_error(ReportError).map([&](std::string S) { |
22 | 11.1k | ImpDesc.setExternalName(S); |
23 | 11.1k | })); |
24 | | |
25 | | // Read the external type. |
26 | 11.1k | EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) { |
27 | 11.1k | ImpDesc.setExternalType(static_cast<ExternalType>(B)); |
28 | 11.1k | })); |
29 | | |
30 | | // Make content node according to external type. |
31 | 11.1k | switch (ImpDesc.getExternalType()) { |
32 | 3.04k | case ExternalType::Function: { |
33 | | // Read the function type index. |
34 | 3.04k | EXPECTED_TRY(FMgr.readU32().map_error(ReportError).map([&](uint32_t Idx) { |
35 | 3.03k | ImpDesc.setExternalFuncTypeIdx(Idx); |
36 | 3.03k | })); |
37 | 3.03k | return {}; |
38 | 3.04k | } |
39 | 157 | case ExternalType::Table: { |
40 | | // Read the table type node. |
41 | 157 | return loadType(ImpDesc.getExternalTableType()); |
42 | 3.04k | } |
43 | 259 | case ExternalType::Memory: { |
44 | | // Read the memory type node. |
45 | 259 | return loadType(ImpDesc.getExternalMemoryType()); |
46 | 3.04k | } |
47 | 7.67k | case ExternalType::Global: { |
48 | | // Read the global type node. |
49 | 7.67k | EXPECTED_TRY(loadType(ImpDesc.getExternalGlobalType())); |
50 | | // Import the mutable globals are for ImportExportMutGlobals proposal. |
51 | 7.66k | if (ImpDesc.getExternalGlobalType().getValMut() == ValMut::Var && |
52 | 7.66k | unlikely(!Conf.hasProposal(Proposal::ImportExportMutGlobals))) { |
53 | 0 | return logNeedProposal(ErrCode::Value::InvalidMut, |
54 | 0 | Proposal::ImportExportMutGlobals, |
55 | 0 | FMgr.getLastOffset(), ASTNodeAttr::Desc_Import); |
56 | 0 | } |
57 | 7.66k | return {}; |
58 | 7.66k | } |
59 | 1 | case ExternalType::Tag: { |
60 | 1 | if (!Conf.hasProposal(Proposal::ExceptionHandling)) { |
61 | 1 | return logNeedProposal(ErrCode::Value::MalformedImportKind, |
62 | 1 | Proposal::ExceptionHandling, FMgr.getLastOffset(), |
63 | 1 | ASTNodeAttr::Module); |
64 | 1 | } |
65 | | // Read the Tag type node. |
66 | 0 | return loadType(ImpDesc.getExternalTagType()); |
67 | 1 | } |
68 | 8 | default: |
69 | 8 | return logLoadError(ErrCode::Value::MalformedImportKind, |
70 | 8 | FMgr.getLastOffset(), ASTNodeAttr::Desc_Import); |
71 | 11.1k | } |
72 | 11.1k | } |
73 | | |
74 | | // Load binary of Export description. See "include/loader/loader.h". |
75 | 21.8k | Expect<void> Loader::loadDesc(AST::ExportDesc &ExpDesc) { |
76 | 21.8k | auto ReportError = [this](auto E) { |
77 | 52 | return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Desc_Export); |
78 | 52 | }; |
79 | | |
80 | | // Read external name to export. |
81 | 21.8k | EXPECTED_TRY(FMgr.readName().map_error(ReportError).map([&](std::string S) { |
82 | 21.8k | ExpDesc.setExternalName(S); |
83 | 21.8k | })); |
84 | | |
85 | | // Read external type. |
86 | 21.8k | EXPECTED_TRY(FMgr.readByte().map_error(ReportError).map([&](uint8_t B) { |
87 | 21.8k | ExpDesc.setExternalType(static_cast<ExternalType>(B)); |
88 | 21.8k | })); |
89 | 21.8k | switch (ExpDesc.getExternalType()) { |
90 | 20.2k | case ExternalType::Function: |
91 | 20.6k | case ExternalType::Table: |
92 | 21.5k | case ExternalType::Memory: |
93 | 21.8k | case ExternalType::Global: |
94 | 21.8k | break; |
95 | 4 | case ExternalType::Tag: |
96 | 4 | if (!Conf.hasProposal(Proposal::ExceptionHandling)) { |
97 | 4 | return logNeedProposal(ErrCode::Value::MalformedImportKind, |
98 | 4 | Proposal::ExceptionHandling, FMgr.getLastOffset(), |
99 | 4 | ASTNodeAttr::Module); |
100 | 4 | } |
101 | 0 | break; |
102 | 10 | default: |
103 | 10 | return logLoadError(ErrCode::Value::MalformedExportKind, |
104 | 10 | FMgr.getLastOffset(), ASTNodeAttr::Desc_Export); |
105 | 21.8k | } |
106 | | |
107 | | // Read external index to export. |
108 | 21.8k | EXPECTED_TRY(FMgr.readU32().map_error(ReportError).map([&](uint32_t Idx) { |
109 | 21.8k | ExpDesc.setExternalIndex(Idx); |
110 | 21.8k | })); |
111 | 21.8k | return {}; |
112 | 21.8k | } |
113 | | |
114 | | } // namespace Loader |
115 | | } // namespace WasmEdge |