summaryrefslogtreecommitdiff
path: root/src/wasm/wat-parser.cpp
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2023-04-04 11:33:15 -0700
committerGitHub <noreply@github.com>2023-04-04 11:33:15 -0700
commita802fbe07c270f510c87dfa93577bd4731c075f3 (patch)
tree4c67b39ced46258593f6904bba4a5ac20292886c /src/wasm/wat-parser.cpp
parent05e1183954e49f8b3a1669cc7973af590afe9fc3 (diff)
downloadbinaryen-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.cpp22
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");
}