@@ -3480,7 +3480,7 @@ Index SExpressionWasmBuilder::parseMemoryLimits(
3480
3480
3481
3481
void SExpressionWasmBuilder::parseMemory (Element& s, bool preParseImport) {
3482
3482
auto memory = std::make_unique<Memory>();
3483
- memory->shared = false ;
3483
+ memory->shared = *s[s. size () - 1 ] == SHARED ;
3484
3484
Index i = 1 ;
3485
3485
if (s[i]->dollared ()) {
3486
3486
memory->setExplicitName (s[i++]->str ());
@@ -3507,10 +3507,6 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
3507
3507
memory->module = inner[1 ]->str ();
3508
3508
memory->base = inner[2 ]->str ();
3509
3509
i++;
3510
- } else if (elementStartsWith (inner, SHARED)) {
3511
- memory->shared = true ;
3512
- parseMemoryLimits (inner, 1 , memory);
3513
- i++;
3514
3510
} else {
3515
3511
if (!(inner.size () > 0 ? inner[0 ]->str () != IMPORT : true )) {
3516
3512
throw SParseException (" bad import ending" , inner);
@@ -3533,52 +3529,9 @@ void SExpressionWasmBuilder::parseMemory(Element& s, bool preParseImport) {
3533
3529
return ;
3534
3530
}
3535
3531
}
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]);
3582
3535
}
3583
3536
wasm.addMemory (std::move (memory));
3584
3537
}
@@ -3774,15 +3727,10 @@ void SExpressionWasmBuilder::parseImport(Element& s) {
3774
3727
memory->base = base;
3775
3728
memoryNames.push_back (name);
3776
3729
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) {
3782
3732
memory->shared = true ;
3783
- j = parseMemoryLimits (limits, 1 , memory);
3784
- } else {
3785
- j = parseMemoryLimits (inner, j, memory);
3733
+ j++;
3786
3734
}
3787
3735
3788
3736
wasm.addMemory (std::move (memory));
0 commit comments