diff options
author | Thomas Lively <tlively@google.com> | 2023-04-04 11:33:15 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-04 11:33:15 -0700 |
commit | a802fbe07c270f510c87dfa93577bd4731c075f3 (patch) | |
tree | 4c67b39ced46258593f6904bba4a5ac20292886c /src/wasm/wat-parser.cpp | |
parent | 05e1183954e49f8b3a1669cc7973af590afe9fc3 (diff) | |
download | binaryen-a802fbe07c270f510c87dfa93577bd4731c075f3.tar.gz binaryen-a802fbe07c270f510c87dfa93577bd4731c075f3.tar.bz2 binaryen-a802fbe07c270f510c87dfa93577bd4731c075f3.zip |
Use Names instead of indices to identify segments (#5618)
All top-level Module elements are identified and referred to by Name, but for
historical reasons element and data segments were referred to by index instead.
Fix this inconsistency by using Names to refer to segments from expressions that
use them. Also parse and print segment names like we do for other elements.
The C API is partially converted to use names instead of indices, but there are
still many functions that refer to data segments by index. Finishing the
conversion can be done in the future once it becomes necessary.
Diffstat (limited to 'src/wasm/wat-parser.cpp')
-rw-r--r-- | src/wasm/wat-parser.cpp | 22 |
1 files changed, 10 insertions, 12 deletions
diff --git a/src/wasm/wat-parser.cpp b/src/wasm/wat-parser.cpp index 89e913ab5..567502c93 100644 --- a/src/wasm/wat-parser.cpp +++ b/src/wasm/wat-parser.cpp @@ -1284,7 +1284,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { using LocalIdxT = Index; using GlobalIdxT = Name; using MemoryIdxT = Name; - using DataIdxT = uint32_t; + using DataIdxT = Name; using MemargT = Memarg; @@ -1550,20 +1550,18 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return name; } - Result<uint32_t> getDataFromIdx(uint32_t idx) { + Result<Name> getDataFromIdx(uint32_t idx) { if (idx >= wasm.dataSegments.size()) { return in.err("data index out of bounds"); } - return idx; + return wasm.dataSegments[idx]->name; } - Result<uint32_t> getDataFromName(Name name) { - for (uint32_t i = 0; i < wasm.dataSegments.size(); ++i) { - if (wasm.dataSegments[i]->name == name) { - return i; - } + Result<Name> getDataFromName(Name name) { + if (!wasm.getDataSegmentOrNull(name)) { + return in.err("data $" + name.toString() + " does not exist"); } - return in.err("data $" + name.toString() + " does not exist"); + return name; } Result<TypeUseT> makeTypeUse(Index pos, @@ -1984,7 +1982,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { op, memarg.offset, memarg.align, lane, *ptr, *vec, *m)); } - Result<> makeMemoryInit(Index pos, Name* mem, uint32_t data) { + Result<> makeMemoryInit(Index pos, Name* mem, Name data) { auto m = getMemory(pos, mem); CHECK_ERR(m); auto size = pop(pos); @@ -1996,7 +1994,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return push(pos, builder.makeMemoryInit(data, *dest, *offset, *size, *m)); } - Result<> makeDataDrop(Index pos, uint32_t data) { + Result<> makeDataDrop(Index pos, Name data) { return push(pos, builder.makeDataDrop(data)); } @@ -2147,7 +2145,7 @@ struct ParseDefsCtx : TypeParserCtx<ParseDefsCtx> { return push(pos, builder.makeArrayNew(type, *size)); } - Result<> makeArrayNewData(Index pos, HeapType type, uint32_t data) { + Result<> makeArrayNewData(Index pos, HeapType type, Name data) { if (!type.isArray()) { return in.err(pos, "expected array type annotation"); } |