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";
|
2018-01-28 15:30:49 +01:00
|
|
|
|
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
|
2018-03-04 17:25:32 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2019-03-14 04:33:58 +01:00
|
|
|
offset = newPtr;
|
|
|
|
return ptr;
|
|
|
|
}
|
2018-01-28 15:30:49 +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_free(ptr: usize): void {
|
2019-03-14 04:33:58 +01:00
|
|
|
}
|
2018-01-28 15:30:49 +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;
|
2018-01-28 15:30:49 +01:00
|
|
|
}
|