46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package wasm
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
// MemoryPageSize is the unit of memory length in WebAssembly,
|
|
// and is defined as 2^16 = 65536.
|
|
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#memory-instances%E2%91%A0
|
|
MemoryPageSize = uint32(65536)
|
|
// MemoryPageSizeInBits satisfies the relation: "1 << MemoryPageSizeInBits == MemoryPageSize".
|
|
MemoryPageSizeInBits = 16
|
|
)
|
|
|
|
// MemoryPagesToBytesNum converts the given pages into the number of bytes contained in these pages.
|
|
func MemoryPagesToBytesNum(pages uint32) (bytesNum uint64) {
|
|
return uint64(pages) << MemoryPageSizeInBits
|
|
}
|
|
|
|
// PagesToUnitOfBytes converts the pages to a human-readable form similar to what's specified. Ex. 1 -> "64Ki"
|
|
//
|
|
// See https://www.w3.org/TR/2019/REC-wasm-core-1-20191205/#memory-instances%E2%91%A0
|
|
func PagesToUnitOfBytes(pages uint32) string {
|
|
k := pages * 64
|
|
if k < 1024 {
|
|
return fmt.Sprintf("%d Ki", k)
|
|
}
|
|
m := k / 1024
|
|
if m < 1024 {
|
|
return fmt.Sprintf("%d Mi", m)
|
|
}
|
|
g := m / 1024
|
|
if g < 1024 {
|
|
return fmt.Sprintf("%d Gi", g)
|
|
}
|
|
return fmt.Sprintf("%d Ti", g/1024)
|
|
}
|
|
|
|
// Below are raw functions used to implement the api.Memory API:
|
|
|
|
// memoryBytesNumToPages converts the given number of bytes into the number of pages.
|
|
func memoryBytesNumToPages(bytesNum uint64) (pages uint32) {
|
|
return uint32(bytesNum >> MemoryPageSizeInBits)
|
|
}
|