diff options
Diffstat (limited to 'src/wasm/wasm-s-parser.cpp')
-rw-r--r-- | src/wasm/wasm-s-parser.cpp | 66 |
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)); |