@@ -1023,6 +1023,10 @@ Value Thread::Pop() {
10231023 return value;
10241024}
10251025
1026+ u64 Thread::PopPtr (const Memory::Ptr& memory) {
1027+ return memory->type ().limits .is_64 ? Pop<u64 >() : Pop<u32 >();
1028+ }
1029+
10261030template <typename T>
10271031void WABT_VECTORCALL Thread::Push (T value) {
10281032 Push (Value::Make (value));
@@ -1187,15 +1191,15 @@ RunResult Thread::StepInternal(Trap::Ptr* out_trap) {
11871191 case O::MemoryGrow: {
11881192 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32 ]};
11891193 u64 old_size = memory->PageSize ();
1190- if (Failed ( memory->Grow (Pop< u32 >())) ) {
1191- if (memory->type (). limits . is_64 ) {
1194+ if (memory->type (). limits . is_64 ) {
1195+ if (Failed ( memory->Grow (Pop< u64 >())) ) {
11921196 Push<s64>(-1 );
11931197 } else {
1194- Push<s32>(- 1 );
1198+ Push<u64 >(old_size );
11951199 }
11961200 } else {
1197- if (memory->type (). limits . is_64 ) {
1198- Push<u64 >(old_size );
1201+ if (Failed ( memory->Grow (Pop< u32 >())) ) {
1202+ Push<s32>(- 1 );
11991203 } else {
12001204 Push<u32 >(old_size);
12011205 }
@@ -1754,7 +1758,7 @@ RunResult Thread::DoCall(const Func::Ptr& func, Trap::Ptr* out_trap) {
17541758template <typename T>
17551759RunResult Thread::Load (Instr instr, T* out, Trap::Ptr* out_trap) {
17561760 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
1757- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
1761+ u64 offset = PopPtr (memory );
17581762 TRAP_IF (Failed (memory->Load (offset, instr.imm_u32x2 .snd , out)),
17591763 StringPrintf (" out of bounds memory access: access at %" PRIu64
17601764 " +%" PRIzd " >= max value %" PRIu64,
@@ -1777,7 +1781,7 @@ template <typename T, typename V>
17771781RunResult Thread::DoStore (Instr instr, Trap::Ptr* out_trap) {
17781782 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
17791783 V val = static_cast <V>(Pop<T>());
1780- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
1784+ u64 offset = PopPtr (memory );
17811785 TRAP_IF (Failed (memory->Store (offset, instr.imm_u32x2 .snd , val)),
17821786 StringPrintf (" out of bounds memory access: access at %" PRIu64
17831787 " +%" PRIzd " >= max value %" PRIu64,
@@ -1843,7 +1847,7 @@ RunResult Thread::DoMemoryInit(Instr instr, Trap::Ptr* out_trap) {
18431847 auto && data = inst_->datas ()[instr.imm_u32x2 .snd ];
18441848 auto size = Pop<u32 >();
18451849 auto src = Pop<u32 >();
1846- auto dst = Pop< u32 >( );
1850+ auto dst = PopPtr (memory );
18471851 TRAP_IF (Failed (memory->Init (dst, data, src, size)),
18481852 " out of bounds memory access: memory.init out of bounds" );
18491853 return RunResult::Ok;
@@ -1857,9 +1861,9 @@ RunResult Thread::DoDataDrop(Instr instr) {
18571861RunResult Thread::DoMemoryCopy (Instr instr, Trap::Ptr* out_trap) {
18581862 Memory::Ptr mem_dst{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
18591863 Memory::Ptr mem_src{store_, inst_->memories ()[instr.imm_u32x2 .snd ]};
1860- auto size = Pop< u32 >( );
1861- auto src = Pop< u32 >( );
1862- auto dst = Pop< u32 >( );
1864+ auto size = PopPtr (mem_src );
1865+ auto src = PopPtr (mem_src );
1866+ auto dst = PopPtr (mem_dst );
18631867 // TODO: change to "out of bounds"
18641868 TRAP_IF (Failed (Memory::Copy (*mem_dst, dst, *mem_src, src, size)),
18651869 " out of bounds memory access: memory.copy out of bound" );
@@ -1868,9 +1872,9 @@ RunResult Thread::DoMemoryCopy(Instr instr, Trap::Ptr* out_trap) {
18681872
18691873RunResult Thread::DoMemoryFill (Instr instr, Trap::Ptr* out_trap) {
18701874 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32 ]};
1871- auto size = Pop< u32 >( );
1875+ auto size = PopPtr (memory );
18721876 auto value = Pop<u32 >();
1873- auto dst = Pop< u32 >( );
1877+ auto dst = PopPtr (memory );
18741878 TRAP_IF (Failed (memory->Fill (dst, value, size)),
18751879 " out of bounds memory access: memory.fill out of bounds" );
18761880 return RunResult::Ok;
@@ -2151,7 +2155,7 @@ RunResult Thread::DoSimdLoadExtend(Instr instr, Trap::Ptr* out_trap) {
21512155template <typename T, typename V>
21522156RunResult Thread::DoAtomicLoad (Instr instr, Trap::Ptr* out_trap) {
21532157 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
2154- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
2158+ u64 offset = PopPtr (memory );
21552159 V val;
21562160 TRAP_IF (Failed (memory->AtomicLoad (offset, instr.imm_u32x2 .snd , &val)),
21572161 StringPrintf (" invalid atomic access at %" PRIaddress " +%u" , offset,
@@ -2164,7 +2168,7 @@ template <typename T, typename V>
21642168RunResult Thread::DoAtomicStore (Instr instr, Trap::Ptr* out_trap) {
21652169 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
21662170 V val = static_cast <V>(Pop<T>());
2167- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
2171+ u64 offset = PopPtr (memory );
21682172 TRAP_IF (Failed (memory->AtomicStore (offset, instr.imm_u32x2 .snd , val)),
21692173 StringPrintf (" invalid atomic access at %" PRIaddress " +%u" , offset,
21702174 instr.imm_u32x2 .snd ));
@@ -2177,7 +2181,7 @@ RunResult Thread::DoAtomicRmw(BinopFunc<T, T> f,
21772181 Trap::Ptr* out_trap) {
21782182 Memory::Ptr memory{store_, inst_->memories ()[instr.imm_u32x2 .fst ]};
21792183 T val = static_cast <T>(Pop<R>());
2180- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
2184+ u64 offset = PopPtr (memory );
21812185 T old;
21822186 TRAP_IF (Failed (memory->AtomicRmw (offset, instr.imm_u32x2 .snd , val, f, &old)),
21832187 StringPrintf (" invalid atomic access at %" PRIaddress " +%u" , offset,
@@ -2192,7 +2196,7 @@ RunResult Thread::DoAtomicRmwCmpxchg(Instr instr, Trap::Ptr* out_trap) {
21922196 V replace = static_cast <V>(Pop<T>());
21932197 V expect = static_cast <V>(Pop<T>());
21942198 V old;
2195- u64 offset = memory-> type (). limits . is_64 ? Pop< u64 >() : Pop< u32 >( );
2199+ u64 offset = PopPtr (memory );
21962200 TRAP_IF (Failed (memory->AtomicRmwCmpxchg (offset, instr.imm_u32x2 .snd , expect,
21972201 replace, &old)),
21982202 StringPrintf (" invalid atomic access at %" PRIaddress " +%u" , offset,
0 commit comments