diff --git a/src/runtime/mem_js.go b/src/runtime/mem_js.go index fc6092b2bb..7da4beda2a 100644 --- a/src/runtime/mem_js.go +++ b/src/runtime/mem_js.go @@ -41,13 +41,19 @@ var reserveEnd uintptr func sysReserve(v unsafe.Pointer, n uintptr) unsafe.Pointer { // TODO(neelance): maybe unify with mem_plan9.go, depending on how https://github.com/WebAssembly/design/blob/master/FutureFeatures.md#finer-grained-control-over-memory turns out + if v != nil { + // The address space of WebAssembly's linear memory is contiguous, + // so requesting specific addresses is not supported. We could use + // a different address, but then mheap.sysAlloc discards the result + // right away and we don't reuse chunks passed to sysFree. + return nil + } + if reserveEnd < lastmoduledatap.end { reserveEnd = lastmoduledatap.end } - if uintptr(v) < reserveEnd { - v = unsafe.Pointer(reserveEnd) - } - reserveEnd = uintptr(v) + n + v = unsafe.Pointer(reserveEnd) + reserveEnd += n current := currentMemory() needed := int32(reserveEnd/sys.DefaultPhysPageSize + 1)