@@ -3480,7 +3480,7 @@ Index SExpressionWasmBuilder::parseMemoryLimits(
34803480
34813481void SExpressionWasmBuilder::parseMemory (Element& s, bool preParseImport) {
34823482 auto memory = std::make_unique<Memory>();
3483- memory->shared = false ;
3483+ memory->shared = *s[s. size () - 1 ] == SHARED ;
34843484 Index i = 1 ;
34853485 if (s[i]->dollared ()) {
34863486 memory->setExplicitName (s[i++]->str ());
@@ -3507,10 +3507,6 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
35073507 memory->module = inner[1 ]->str ();
35083508 memory->base = inner[2 ]->str ();
35093509 i++;
3510- } else if (elementStartsWith (inner, SHARED)) {
3511- memory->shared = true ;
3512- parseMemoryLimits (inner, 1 , memory);
3513- i++;
35143510 } else {
35153511 if (!(inner.size () > 0 ? inner[0 ]->str () != IMPORT : true )) {
35163512 throw SParseException (" bad import ending" , inner);
@@ -3533,52 +3529,9 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
35333529 return ;
35343530 }
35353531 }
3536- if (!memory->shared ) {
3537- i = parseMemoryLimits (s, i, memory);
3538- }
3539-
3540- // Parse memory initializers.
3541- while (i < s.size ()) {
3542- Element& curr = *s[i];
3543- size_t j = 1 ;
3544- Address offsetValue;
3545- if (elementStartsWith (curr, DATA)) {
3546- offsetValue = 0 ;
3547- } else {
3548- auto offsetElem = curr[j++];
3549- offsetValue = getAddress (offsetElem);
3550- if (!memory->is64 ()) {
3551- checkAddress (offsetValue, " excessive memory offset" , offsetElem);
3552- }
3553- }
3554- std::string_view input = curr[j]->str ().str ;
3555- auto * offset = allocator.alloc <Const>();
3556- if (memory->is64 ()) {
3557- offset->type = Type::i64 ;
3558- offset->value = Literal (offsetValue);
3559- } else {
3560- offset->type = Type::i32 ;
3561- offset->value = Literal (int32_t (offsetValue));
3562- }
3563- if (input.size ()) {
3564- std::vector<char > data;
3565- stringToBinary (*curr[j], input, data);
3566- auto segment = Builder::makeDataSegment (Name::fromInt (dataCounter++),
3567- memory->name ,
3568- false ,
3569- offset,
3570- data.data (),
3571- data.size ());
3572- segment->hasExplicitName = false ;
3573- dataSegmentNames.push_back (segment->name );
3574- wasm.addDataSegment (std::move (segment));
3575- } else {
3576- auto segment = Builder::makeDataSegment (
3577- Name::fromInt (dataCounter++), memory->name , false , offset);
3578- segment->hasExplicitName = false ;
3579- wasm.addDataSegment (std::move (segment));
3580- }
3581- i++;
3532+ i = parseMemoryLimits (s, i, memory);
3533+ if (i + int (memory->shared ) != s.size ()) {
3534+ throw SParseException (" expected end of memory" , *s[i]);
35823535 }
35833536 wasm.addMemory (std::move (memory));
35843537}
@@ -3774,15 +3727,10 @@ void SExpressionWasmBuilder::parseImport(Element& s) {
37743727 memory->base = base;
37753728 memoryNames.push_back (name);
37763729
3777- if (inner[j]->isList ()) {
3778- auto & limits = *inner[j];
3779- if (!elementStartsWith (limits, SHARED)) {
3780- throw SParseException (" bad memory limit declaration" , inner, *inner[j]);
3781- }
3730+ j = parseMemoryLimits (inner, j, memory);
3731+ if (j != inner.size () && *inner[j] == SHARED) {
37823732 memory->shared = true ;
3783- j = parseMemoryLimits (limits, 1 , memory);
3784- } else {
3785- j = parseMemoryLimits (inner, j, memory);
3733+ j++;
37863734 }
37873735
37883736 wasm.addMemory (std::move (memory));
0 commit comments