42 lines
1.1 KiB
TypeScript
Raw Normal View History

2019-03-14 04:33:58 +01:00
import { HEAP_BASE, memory } from "../memory";
2019-03-13 03:47:35 +01:00
import { AL_MASK, MAX_SIZE_32 } from "../util/allocator";
2019-03-14 05:11:03 +01:00
// @ts-ignore: decorator
2019-03-14 06:09:49 +01:00
@lazy
var startOffset: usize = (HEAP_BASE + AL_MASK) & ~AL_MASK;
2019-03-14 05:11:03 +01:00
// @ts-ignore: decorator
2019-03-14 06:09:49 +01:00
@lazy
var offset: usize = startOffset;
2018-07-19 16:15:56 +02:00
2019-03-14 05:11:03 +01:00
// @ts-ignore: decorator
2019-03-14 12:52:46 +01:00
@unsafe @global @inline
2019-03-14 06:09:49 +01:00
function __memory_allocate(size: usize): usize {
2019-03-14 04:33:58 +01:00
if (size > MAX_SIZE_32) unreachable();
var ptr = offset;
var newPtr = (ptr + max<usize>(size, 1) + AL_MASK) & ~AL_MASK;
var pagesBefore = memory.size();
if (newPtr > <usize>pagesBefore << 16) {
let pagesNeeded = ((newPtr - ptr + 0xffff) & ~0xffff) >>> 16;
let pagesWanted = max(pagesBefore, pagesNeeded); // double memory
if (memory.grow(pagesWanted) < 0) {
if (memory.grow(pagesNeeded) < 0) {
unreachable(); // out of memory
}
}
}
2019-03-14 04:33:58 +01:00
offset = newPtr;
return ptr;
}
2019-03-14 05:11:03 +01:00
// @ts-ignore: decorator
2019-03-14 12:52:46 +01:00
@unsafe @global @inline
2019-03-14 06:09:49 +01:00
function __memory_free(ptr: usize): void {
2019-03-14 04:33:58 +01:00
}
2019-03-14 05:11:03 +01:00
// @ts-ignore: decorator
2019-03-14 12:52:46 +01:00
@unsafe @global @inline
2019-03-14 06:09:49 +01:00
function __memory_reset(): void {
2019-03-14 04:33:58 +01:00
offset = startOffset;
}