1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- #+build js wasm32, js wasm64p32
- package wasm_js_interface
- import "core:mem"
- import "base:intrinsics"
- PAGE_SIZE :: 64 * 1024
- page_alloc :: proc(page_count: int) -> (data: []byte, err: mem.Allocator_Error) {
- prev_page_count := intrinsics.wasm_memory_grow(0, uintptr(page_count))
- if prev_page_count < 0 {
- return nil, .Out_Of_Memory
- }
- ptr := ([^]u8)(uintptr(prev_page_count) * PAGE_SIZE)
- return ptr[:page_count * PAGE_SIZE], nil
- }
- page_allocator :: proc() -> mem.Allocator {
- procedure :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
- size, alignment: int,
- old_memory: rawptr, old_size: int,
- location := #caller_location) -> ([]byte, mem.Allocator_Error) {
- switch mode {
- case .Alloc, .Alloc_Non_Zeroed:
- assert(size % PAGE_SIZE == 0)
- return page_alloc(size/PAGE_SIZE)
- case .Resize, .Free, .Free_All, .Query_Info, .Resize_Non_Zeroed:
- return nil, .Mode_Not_Implemented
- case .Query_Features:
- set := (^mem.Allocator_Mode_Set)(old_memory)
- if set != nil {
- set^ = {.Alloc, .Query_Features}
- }
- }
- return nil, nil
- }
- return {
- procedure = procedure,
- data = nil,
- }
- }
|