diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-08-16 17:01:28 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-09-07 09:54:59 -0700 |
commit | 1780339679e771f8ffe94ea5f7c38cb1272e0994 (patch) | |
tree | 284e5e8dbda9c9d53b2da58015dd89337790954c /src | |
parent | 99410c94d3a03aad24a9a6f53f5fc137bd336e71 (diff) | |
download | binaryen-1780339679e771f8ffe94ea5f7c38cb1272e0994.tar.gz binaryen-1780339679e771f8ffe94ea5f7c38cb1272e0994.tar.bz2 binaryen-1780339679e771f8ffe94ea5f7c38cb1272e0994.zip |
grow_memory no longer traps
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 805886a30..ae42ca648 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -720,14 +720,15 @@ public: case PageSize: return Literal((int32_t)Memory::kPageSize); case CurrentMemory: return Literal(int32_t(instance.memorySize)); case GrowMemory: { + auto fail = Literal(int32_t(-1)); Flow flow = visit(curr->operands[0]); if (flow.breaking()) return flow; int32_t ret = instance.memorySize; uint32_t delta = flow.value.geti32(); - if (delta > uint32_t(-1) /Memory::kPageSize) trap("growMemory: delta relatively too big"); - if (instance.memorySize >= uint32_t(-1) - delta) trap("growMemory: delta objectively too big"); + if (delta > uint32_t(-1) /Memory::kPageSize) return fail; + if (instance.memorySize >= uint32_t(-1) - delta) return fail; uint32_t newSize = instance.memorySize + delta; - if (newSize > instance.wasm.memory.max) trap("growMemory: exceeds max"); + if (newSize > instance.wasm.memory.max) return fail; instance.externalInterface->growMemory(instance.memorySize * Memory::kPageSize, newSize * Memory::kPageSize); instance.memorySize = newSize; return Literal(int32_t(ret)); |