/src/WasmEdge/lib/loader/ast/component/component_alias.cpp
Line | Count | Source |
1 | | // SPDX-License-Identifier: Apache-2.0 |
2 | | // SPDX-FileCopyrightText: Copyright The WasmEdge Authors |
3 | | |
4 | | #include "loader/loader.h" |
5 | | |
6 | | namespace WasmEdge { |
7 | | namespace Loader { |
8 | | |
9 | 142 | Expect<void> Loader::loadCoreAlias(AST::Component::CoreAlias &Alias) { |
10 | 142 | auto ReportError = [this](auto E) { |
11 | 9 | return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Comp_Alias); |
12 | 9 | }; |
13 | | // core:alias ::= s:<core:sort> t:<core:aliastarget> => (alias t (s)) |
14 | | // core:aliastarget ::= 0x01 ct:<u32> idx:<u32> => outer ct idx |
15 | | |
16 | 142 | EXPECTED_TRY(loadCoreSort(Alias.getSort()).map_error(ReportError)); |
17 | 272 | EXPECTED_TRY(uint8_t Flag, FMgr.readByte().map_error(ReportError)); |
18 | 272 | if (Flag != 0x01) { |
19 | 2 | return logLoadError(ErrCode::Value::MalformedAliasTarget, |
20 | 2 | FMgr.getLastOffset(), ASTNodeAttr::Comp_Alias); |
21 | 2 | } |
22 | 265 | EXPECTED_TRY(uint32_t Ct, FMgr.readU32().map_error(ReportError)); |
23 | 265 | EXPECTED_TRY(uint32_t Idx, FMgr.readU32().map_error(ReportError)); |
24 | 131 | Alias.setComponentJump(Ct); |
25 | 131 | Alias.setIndex(Idx); |
26 | 131 | return {}; |
27 | 265 | } |
28 | | |
29 | 8.96k | Expect<void> Loader::loadAlias(AST::Component::Alias &Alias) { |
30 | 8.96k | auto ReportError = [this](auto E) { |
31 | 108 | return logLoadError(E, FMgr.getLastOffset(), ASTNodeAttr::Comp_Alias); |
32 | 108 | }; |
33 | | // alias ::= s:<sort> t:<aliastarget> => (alias t (s)) |
34 | | // aliastarget ::= 0x00 i:<instanceidx> n:<string> => export i n |
35 | | // | 0x01 i:<core:instanceidx> n:<core:name> => core export i n |
36 | | // | 0x02 ct:<u32> idx:<u32> => outer ct idx |
37 | | |
38 | 8.96k | EXPECTED_TRY(loadSort(Alias.getSort()).map_error(ReportError)); |
39 | 17.7k | EXPECTED_TRY(uint8_t Flag, FMgr.readByte().map_error(ReportError)); |
40 | 17.7k | switch (Flag) { |
41 | 1.76k | case 0x00: |
42 | 2.11k | case 0x01: { |
43 | 2.11k | EXPECTED_TRY(uint32_t Idx, FMgr.readU32().map_error(ReportError)); |
44 | 2.10k | EXPECTED_TRY(std::string Name, FMgr.readName().map_error(ReportError)); |
45 | 2.09k | Alias.setExport(Idx, Name); |
46 | 2.09k | break; |
47 | 2.10k | } |
48 | 6.75k | case 0x02: { |
49 | 6.75k | EXPECTED_TRY(uint32_t Ct, FMgr.readU32().map_error(ReportError)); |
50 | 6.75k | EXPECTED_TRY(uint32_t Idx, FMgr.readU32().map_error(ReportError)); |
51 | 6.74k | Alias.setOuter(Ct, Idx); |
52 | 6.74k | break; |
53 | 6.75k | } |
54 | 15 | default: |
55 | 15 | return logLoadError(ErrCode::Value::MalformedAliasTarget, |
56 | 15 | FMgr.getLastOffset(), ASTNodeAttr::Comp_Alias); |
57 | 17.7k | } |
58 | 8.84k | Alias.setTargetType(static_cast<AST::Component::Alias::TargetType>(Flag)); |
59 | 8.84k | return {}; |
60 | 17.7k | } |
61 | | |
62 | | } // namespace Loader |
63 | | } // namespace WasmEdge |