memory_js.odin 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #+build js wasm32, js wasm64p32
  2. package wasm_js_interface
  3. import "core:mem"
  4. import "base:intrinsics"
  5. PAGE_SIZE :: 64 * 1024
  6. page_alloc :: proc(page_count: int) -> (data: []byte, err: mem.Allocator_Error) {
  7. prev_page_count := intrinsics.wasm_memory_grow(0, uintptr(page_count))
  8. if prev_page_count < 0 {
  9. return nil, .Out_Of_Memory
  10. }
  11. ptr := ([^]u8)(uintptr(prev_page_count) * PAGE_SIZE)
  12. return ptr[:page_count * PAGE_SIZE], nil
  13. }
  14. page_allocator :: proc() -> mem.Allocator {
  15. procedure :: proc(allocator_data: rawptr, mode: mem.Allocator_Mode,
  16. size, alignment: int,
  17. old_memory: rawptr, old_size: int,
  18. location := #caller_location) -> ([]byte, mem.Allocator_Error) {
  19. switch mode {
  20. case .Alloc, .Alloc_Non_Zeroed:
  21. assert(size % PAGE_SIZE == 0)
  22. return page_alloc(size/PAGE_SIZE)
  23. case .Resize, .Free, .Free_All, .Query_Info, .Resize_Non_Zeroed:
  24. return nil, .Mode_Not_Implemented
  25. case .Query_Features:
  26. set := (^mem.Allocator_Mode_Set)(old_memory)
  27. if set != nil {
  28. set^ = {.Alloc, .Query_Features}
  29. }
  30. }
  31. return nil, nil
  32. }
  33. return {
  34. procedure = procedure,
  35. data = nil,
  36. }
  37. }