diff --git a/lib/mem/alloc.q b/lib/mem/alloc.q index 138f871..af6ab70 100644 --- a/lib/mem/alloc.q +++ b/lib/mem/alloc.q @@ -3,9 +3,10 @@ alloc(length uint) -> (buffer ![]byte) { if heap.current + aligned > heap.max { size := (heap.max - heap.min + 32) * 2 as uint + needed := (aligned + 32 + (pageSize - 1)) & -pageSize - if size < pageSize { - size = (aligned + (pageSize - 1)) & -pageSize + if size < needed { + size = needed } x := rawAlloc(size) diff --git a/tests/memory-growth.q b/tests/memory-growth.q new file mode 100644 index 0000000..7edeb8b --- /dev/null +++ b/tests/memory-growth.q @@ -0,0 +1,7 @@ +import mem + +main() { + _ := new(byte, 1) + b := new(byte, 20000000) + assert mem.heap.max - b.ptr >= b.len +} \ No newline at end of file diff --git a/tests/tests_test.go b/tests/tests_test.go index b165049..e2e756d 100644 --- a/tests/tests_test.go +++ b/tests/tests_test.go @@ -100,6 +100,7 @@ var tests = []run{ {"fibonacci", nil, "", "", 0}, {"memory", nil, "", "Hello\n", 0}, {"out-of-memory", nil, "", "(x as int) >= 0x1000\n", 1}, + {"memory-growth", nil, "", "", 0}, {"index-static", nil, "", "", 0}, {"index-dynamic", nil, "", "", 0}, {"struct", nil, "", "", 0},