Prechádzať zdrojové kódy

Add `page_alloc` and `page_allocator`

gingerBill 3 rokov pred
rodič
commit
0f1153fae2
1 zmenil súbory, kde vykonal 46 pridanie a 0 odobranie
  1. 46 0
      vendor/wasm/js/memory.odin

+ 46 - 0
vendor/wasm/js/memory.odin

@@ -0,0 +1,46 @@
+//+build js wasm32
+package wasm_js_interface
+
+import "core:mem"
+import "core: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:
+			assert(size % PAGE_SIZE == 0)
+			return page_alloc(size/PAGE_SIZE)
+		case .Resize, .Free, .Free_All:
+			return nil, .Mode_Not_Implemented
+		case .Query_Features:
+			set := (^mem.Allocator_Mode_Set)(old_memory)
+			if set != nil {
+				set^ = {.Alloc}
+			}
+		case .Query_Info:
+			return nil, .Mode_Not_Implemented
+		}
+
+		return nil, nil
+	}
+
+	return {
+		procedure = procedure,
+		data = nil,
+	}
+}
+