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) }