summaryrefslogtreecommitdiff
path: root/src/wasm/wasm-s-parser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r--src/wasm/wasm-s-parser.cpp66
1 files changed, 7 insertions, 59 deletions
diff --git a/src/wasm/wasm-s-parser.cpp b/src/wasm/wasm-s-parser.cpp
index 9f5f412be..41a5b1884 100644
--- a/src/wasm/wasm-s-parser.cpp
+++ b/src/wasm/wasm-s-parser.cpp
@@ -3480,7 +3480,7 @@ Index SExpressionWasmBuilder::parseMemoryLimits(
void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
auto memory = std::make_unique<Memory>();
- memory->shared = false;
+ memory->shared = *s[s.size() - 1] == SHARED;
Index i = 1;
if (s[i]->dollared()) {
memory->setExplicitName(s[i++]->str());
@@ -3507,10 +3507,6 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
memory->module = inner[1]->str();
memory->base = inner[2]->str();
i++;
- } else if (elementStartsWith(inner, SHARED)) {
- memory->shared = true;
- parseMemoryLimits(inner, 1, memory);
- i++;
} else {
if (!(inner.size() > 0 ? inner[0]->str() != IMPORT : true)) {
throw SParseException("bad import ending", inner);
@@ -3533,52 +3529,9 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
return;
}
}
- if (!memory->shared) {
- i = parseMemoryLimits(s, i, memory);
- }
-
- // Parse memory initializers.
- while (i < s.size()) {
- Element& curr = *s[i];
- size_t j = 1;
- Address offsetValue;
- if (elementStartsWith(curr, DATA)) {
- offsetValue = 0;
- } else {
- auto offsetElem = curr[j++];
- offsetValue = getAddress(offsetElem);
- if (!memory->is64()) {
- checkAddress(offsetValue, "excessive memory offset", offsetElem);
- }
- }
- std::string_view input = curr[j]->str().str;
- auto* offset = allocator.alloc<Const>();
- if (memory->is64()) {
- offset->type = Type::i64;
- offset->value = Literal(offsetValue);
- } else {
- offset->type = Type::i32;
- offset->value = Literal(int32_t(offsetValue));
- }
- if (input.size()) {
- std::vector<char> data;
- stringToBinary(*curr[j], input, data);
- auto segment = Builder::makeDataSegment(Name::fromInt(dataCounter++),
- memory->name,
- false,
- offset,
- data.data(),
- data.size());
- segment->hasExplicitName = false;
- dataSegmentNames.push_back(segment->name);
- wasm.addDataSegment(std::move(segment));
- } else {
- auto segment = Builder::makeDataSegment(
- Name::fromInt(dataCounter++), memory->name, false, offset);
- segment->hasExplicitName = false;
- wasm.addDataSegment(std::move(segment));
- }
- i++;
+ i = parseMemoryLimits(s, i, memory);
+ if (i + int(memory->shared) != s.size()) {
+ throw SParseException("expected end of memory", *s[i]);
}
wasm.addMemory(std::move(memory));
}
@@ -3774,15 +3727,10 @@ void SExpressionWasmBuilder::parseImport(Element& s) {
memory->base = base;
memoryNames.push_back(name);
- if (inner[j]->isList()) {
- auto& limits = *inner[j];
- if (!elementStartsWith(limits, SHARED)) {
- throw SParseException("bad memory limit declaration", inner, *inner[j]);
- }
+ j = parseMemoryLimits(inner, j, memory);
+ if (j != inner.size() && *inner[j] == SHARED) {
memory->shared = true;
- j = parseMemoryLimits(limits, 1, memory);
- } else {
- j = parseMemoryLimits(inner, j, memory);
+ j++;
}
wasm.addMemory(std::move(memory));