diff --git a/src/wasm/wasm-js.cc b/src/wasm/wasm-js.cc index ce2bf42455..19aece944f 100644 --- a/src/wasm/wasm-js.cc +++ b/src/wasm/wasm-js.cc @@ -826,7 +826,7 @@ void WebAssemblyMemoryGrow(const v8::FunctionCallbackInfo& args) { return; } uint32_t old_size = - old_buffer->byte_length()->Number() / i::wasm::kSpecMaxWasmMemoryPages; + old_buffer->byte_length()->Number() / i::wasm::kWasmPageSize; int64_t new_size64 = old_size + delta_size; if (delta_size < 0 || max_size64 < new_size64 || new_size64 < old_size) { thrower.RangeError(new_size64 < old_size ? "trying to shrink memory" diff --git a/test/mjsunit/wasm/memory-size.js b/test/mjsunit/wasm/memory-size.js index 0c96efb798..c7e6241358 100644 --- a/test/mjsunit/wasm/memory-size.js +++ b/test/mjsunit/wasm/memory-size.js @@ -7,6 +7,9 @@ load("test/mjsunit/wasm/wasm-constants.js"); load("test/mjsunit/wasm/wasm-module-builder.js"); +var kV8MaxWasmMemoryPages = 32767; // ~ 2 GiB +var kSpecMaxWasmMemoryPages = 65536; // 4 GiB + (function testMemorySizeZero() { print("testMemorySizeZero()"); var builder = new WasmModuleBuilder(); @@ -29,3 +32,38 @@ load("test/mjsunit/wasm/wasm-module-builder.js"); var module = builder.instantiate(); assertEquals(size, module.exports.memory_size()); })(); + +(function testMemorySizeSpecMaxOk() { + print("testMemorySizeV8Max()"); + var builder = new WasmModuleBuilder(); + builder.addMemory(1, kSpecMaxWasmMemoryPages, true); + builder.addFunction("memory_size", kSig_i_v) + .addBody([kExprMemorySize, kMemoryZero]) + .exportFunc(); + var module = builder.instantiate(); + assertEquals(1, module.exports.memory_size()); +})(); + +(function testMemorySizeV8MaxPlus1Throws() { + print("testMemorySizeV8MaxPlus1Throws()"); + var builder = new WasmModuleBuilder(); + builder.addMemory(kV8MaxWasmMemoryPages + 1, + kV8MaxWasmMemoryPages + 1, false); + builder.addFunction("memory_size", kSig_i_v) + .addBody([kExprMemorySize, kMemoryZero]) + .exportFunc(); + assertThrows(() => builder.instantiate()); +})(); + +(function testMemorySpecMaxOk() { + print("testMemoryInitialMaxOk()"); + var mem = new WebAssembly.Memory( + {initial: 1, maximum: kSpecMaxWasmMemoryPages}); + assertThrows(() => builder.instantiate()); +})(); + +(function testMemoryInitialMaxPlus1Throws() { + print("testMemoryInitialMaxOk()"); + assertThrows(() => new WebAssembly.Memory( + {initial: kV8WasmMaxMemoryPages + 1})); +})();