69 lines
2.1 KiB
V
69 lines
2.1 KiB
V
|
module builtin
|
|||
|
|
|||
|
import dlmalloc
|
|||
|
|
|||
|
// Corresponding intrinsic to wasm’s `memory.grow` instruction
|
|||
|
//
|
|||
|
// This function, when called, will attempt to grow the default linear memory by the specified delta of pages.
|
|||
|
// The current WebAssembly page size is 65536 bytes (64 KB). If memory is successfully grown then the previous size of memory, in pages, is returned.
|
|||
|
// If memory cannot be grown then -1 is returned.
|
|||
|
//
|
|||
|
// The argument mem is the numerical index of which memory to return the size of. Note that currently the WebAssembly specification only supports one memory,
|
|||
|
// so it is required that zero is passed in. The argument is present to be forward-compatible with future WebAssembly revisions.
|
|||
|
// If a nonzero argument is passed to this function it will currently unconditionally abort
|
|||
|
fn C.__builtin_wasm_memory_grow(mem u32, delta usize) usize
|
|||
|
|
|||
|
/// Corresponding intrinsic to wasm's `memory.size` instruction
|
|||
|
///
|
|||
|
/// This function, when called, will return the current memory size in units of
|
|||
|
/// pages. The current WebAssembly page size is 65536 bytes (64 KB).
|
|||
|
fn C.__builtin_wasm_memory_size(mem u32) usize
|
|||
|
|
|||
|
const page_size = 65536
|
|||
|
|
|||
|
fn system_alloc(_ voidptr, size usize) (voidptr, usize, u32) {
|
|||
|
pages := size / page_size
|
|||
|
prev := C.__builtin_wasm_memory_grow(0, pages)
|
|||
|
if prev == -1 {
|
|||
|
return voidptr(0), 0, 0
|
|||
|
}
|
|||
|
return voidptr(prev * page_size), pages * page_size, 0
|
|||
|
}
|
|||
|
|
|||
|
fn system_remap(_ voidptr, _ voidptr, _ usize, _ usize, _ bool) voidptr {
|
|||
|
return voidptr(0)
|
|||
|
}
|
|||
|
|
|||
|
fn system_free_part(_ voidptr, _ voidptr, _ usize, _ usize) bool {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
fn system_free(_ voidptr, _ voidptr, _ usize) bool {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
fn system_allocates_zeros(_ voidptr) bool {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
fn system_page_size(_ voidptr) usize {
|
|||
|
return page_size
|
|||
|
}
|
|||
|
|
|||
|
fn system_can_release_part(_ voidptr, _ u32) bool {
|
|||
|
return false
|
|||
|
}
|
|||
|
|
|||
|
fn get_wasm_allocator() dlmalloc.Allocator {
|
|||
|
return dlmalloc.Allocator{
|
|||
|
alloc: system_alloc
|
|||
|
remap: system_remap
|
|||
|
free_part: system_free_part
|
|||
|
free_: system_free
|
|||
|
can_release_part: system_can_release_part
|
|||
|
allocates_zeros: system_allocates_zeros
|
|||
|
page_size: system_page_size
|
|||
|
data: voidptr(0)
|
|||
|
}
|
|||
|
}
|