mirror of
https://github.com/Noratrieb/riverdelta.git
synced 2026-01-14 16:35:03 +01:00
many things
This commit is contained in:
parent
f582a5b4c3
commit
924236532c
13 changed files with 264 additions and 85 deletions
66
std.nil
66
std.nil
|
|
@ -1,8 +1,15 @@
|
|||
function printlnI32(x: I32) = (
|
||||
printI32(x);
|
||||
print("\n");
|
||||
);
|
||||
|
||||
function printlnInt(x: Int) = (
|
||||
printInt(x);
|
||||
print("\n");
|
||||
);
|
||||
|
||||
function printI32(x: I32) = printInt(i32ToInt(x));
|
||||
|
||||
function printInt(x: Int) = (
|
||||
let mag = log10(x);
|
||||
|
||||
|
|
@ -58,8 +65,59 @@ function println(s: String) = (
|
|||
print("\n");
|
||||
);
|
||||
|
||||
mod alloc (
|
||||
function allocateItem(size: I32): I32 = (
|
||||
|
||||
mod rt (
|
||||
// Start the heap at 1024. In practice this could probably be as low as we want.
|
||||
global BASE_PTR: I32 = 1024_I32;
|
||||
global HEAD_PTR: I32 = 1024_I32;
|
||||
|
||||
/*
|
||||
Every struct has a header of an I32 as a refcount.
|
||||
*/
|
||||
|
||||
// Allocate a new item. We do not deallocate anything yet.
|
||||
// lol.
|
||||
function allocateItem(objSize: I32, align: I32): I32 = (
|
||||
if align < 4_I32 then std.abort("invalid alignment");
|
||||
|
||||
// Include the refcount header.
|
||||
let actualSize = 4_I32 + objSize;
|
||||
|
||||
// Let's see whether we can fit the refcount into the align bits.
|
||||
// I happen to know that everything will always be at least 4 bytes aligned.
|
||||
let alignedPtr = std.alignUp(HEAD_PTR, align);
|
||||
let actualObjPtr = if (alignedPtr - HEAD_PTR) > align then (
|
||||
alignedPtr - 4_I32
|
||||
) else (
|
||||
// Take up the next spot.
|
||||
alignedPtr + align - 4_I32
|
||||
);
|
||||
|
||||
let newHeadPtr = actualObjPtr + actualSize;
|
||||
|
||||
if newHeadPtr > __memory_size() then (
|
||||
// 16 pages, very arbitrary.
|
||||
let result = __memory_grow(16_I32);
|
||||
// If allocation failed we get -1. We don't have negative numbers yet, lol.
|
||||
if result > 100000000_I32 then (
|
||||
std.abort("failed to grow memory");
|
||||
);
|
||||
);
|
||||
|
||||
0_I32
|
||||
);
|
||||
)
|
||||
);
|
||||
|
||||
function alignUp(x: I32, align: I32): I32 = (x + (align - 1_I32)) & !(align - 1_I32);
|
||||
|
||||
function i32ToInt(x: I32): Int = __i32_extend_to_i64_u(x);
|
||||
|
||||
function abort(message: String) = (
|
||||
print("fatal error: ");
|
||||
print(message);
|
||||
println(".. aborting");
|
||||
trap();
|
||||
);
|
||||
|
||||
function main() = (
|
||||
std.rt.allocateItem(100000000_I32, 8_I32);
|
||||
);
|
||||
Loading…
Add table
Add a link
Reference in a new issue