Coverage Report

Created: 2025-07-01 06:18

/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