working commit
This commit is contained in:
+45
@@ -0,0 +1,45 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user