/src/WasmEdge/lib/loader/serialize/serial_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/serialize.h" |
5 | | |
6 | | namespace WasmEdge { |
7 | | namespace Loader { |
8 | | |
9 | | // Serialize import description. See "include/loader/serialize.h". |
10 | | Expect<void> |
11 | | Serializer::serializeDesc(const AST::ImportDesc &Desc, |
12 | 0 | std::vector<uint8_t> &OutVec) const noexcept { |
13 | | // Import description: modname:vec(byte) + extname:vec(byte) + importdesc |
14 | | // Module name: vec(byte). |
15 | 0 | serializeU32(static_cast<uint32_t>(Desc.getModuleName().size()), OutVec); |
16 | 0 | OutVec.insert(OutVec.end(), Desc.getModuleName().begin(), |
17 | 0 | Desc.getModuleName().end()); |
18 | | // External name: vec(byte). |
19 | 0 | serializeU32(static_cast<uint32_t>(Desc.getExternalName().size()), OutVec); |
20 | 0 | OutVec.insert(OutVec.end(), Desc.getExternalName().begin(), |
21 | 0 | Desc.getExternalName().end()); |
22 | | |
23 | | // Import Desc: extern_type:byte + content:idx|tabletype|memorytype|globaltype |
24 | 0 | OutVec.push_back(static_cast<uint8_t>(Desc.getExternalType())); |
25 | 0 | switch (Desc.getExternalType()) { |
26 | 0 | case ExternalType::Function: |
27 | 0 | serializeU32(Desc.getExternalFuncTypeIdx(), OutVec); |
28 | 0 | break; |
29 | 0 | case ExternalType::Table: |
30 | 0 | return serializeType(Desc.getExternalTableType(), OutVec); |
31 | 0 | case ExternalType::Memory: |
32 | 0 | return serializeType(Desc.getExternalMemoryType(), OutVec); |
33 | 0 | case ExternalType::Global: |
34 | 0 | if (Desc.getExternalGlobalType().getValMut() == ValMut::Var && |
35 | 0 | unlikely(!Conf.hasProposal(Proposal::ImportExportMutGlobals))) { |
36 | 0 | return logNeedProposal(ErrCode::Value::InvalidMut, |
37 | 0 | Proposal::ImportExportMutGlobals, |
38 | 0 | ASTNodeAttr::Desc_Import); |
39 | 0 | } |
40 | 0 | return serializeType(Desc.getExternalGlobalType(), OutVec); |
41 | 0 | case ExternalType::Tag: |
42 | 0 | if (!Conf.hasProposal(Proposal::ExceptionHandling)) { |
43 | 0 | return logNeedProposal(ErrCode::Value::MalformedImportKind, |
44 | 0 | Proposal::ExceptionHandling, ASTNodeAttr::Module); |
45 | 0 | } |
46 | 0 | return serializeType(Desc.getExternalTagType(), OutVec); |
47 | 0 | default: |
48 | 0 | return logSerializeError(ErrCode::Value::Unreachable, |
49 | 0 | ASTNodeAttr::Desc_Import); |
50 | 0 | } |
51 | 0 | return {}; |
52 | 0 | } |
53 | | |
54 | | // Serialize export description. See "include/loader/serialize.h". |
55 | | Expect<void> |
56 | | Serializer::serializeDesc(const AST::ExportDesc &Desc, |
57 | 0 | std::vector<uint8_t> &OutVec) const noexcept { |
58 | | // Export description: extname:vec(byte) + exportdesc |
59 | | // External name: vec(byte). |
60 | 0 | serializeU32(static_cast<uint32_t>(Desc.getExternalName().size()), OutVec); |
61 | 0 | OutVec.insert(OutVec.end(), Desc.getExternalName().begin(), |
62 | 0 | Desc.getExternalName().end()); |
63 | | // Export Desc: extern_type:byte + idx:u32. |
64 | 0 | OutVec.push_back(static_cast<uint8_t>(Desc.getExternalType())); |
65 | | // If the type is a Tag type, check for the exception handling proposal first. |
66 | 0 | if (Desc.getExternalType() == ExternalType::Tag) { |
67 | 0 | if (!Conf.hasProposal(Proposal::ExceptionHandling)) { |
68 | 0 | return logNeedProposal(ErrCode::Value::MalformedExportKind, |
69 | 0 | Proposal::ExceptionHandling, ASTNodeAttr::Module); |
70 | 0 | } |
71 | 0 | return serializeType(Desc.getExternalIndex(), OutVec); |
72 | 0 | } |
73 | 0 | serializeU32(Desc.getExternalIndex(), OutVec); |
74 | 0 | return {}; |
75 | 0 | } |
76 | | |
77 | | } // namespace Loader |
78 | | } // namespace WasmEdge |