summary refs log tree commit diff stats
path: root/lib/system/gc_stack.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/system/gc_stack.nim')
-rw-r--r--lib/system/gc_stack.nim20
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/system/gc_stack.nim b/lib/system/gc_stack.nim
index c251a4d0b..37d19db89 100644
--- a/lib/system/gc_stack.nim
+++ b/lib/system/gc_stack.nim
@@ -8,7 +8,23 @@
 
 # "Stack GC" for embedded devices or ultra performance requirements.
 
-include osalloc
+when defined(nimphpext):
+  proc roundup(x, v: int): int {.inline.} =
+    result = (x + (v-1)) and not (v-1)
+  proc emalloc(size: int): pointer {.importc:"_emalloc".}
+  proc efree(mem: pointer) {.importc:"_efree".}
+
+  proc osAllocPages(size: int): pointer {.inline.} =
+    emalloc(size)
+
+  proc osTryAllocPages(size: int): pointer {.inline.} =
+    emalloc(size)
+
+  proc osDeallocPages(p: pointer, size: int) {.inline.} =
+    efree(p)
+
+else:
+  include osalloc
 
 # We manage memory as a thread local stack. Since the allocation pointer
 # is detached from the control flow pointer, this model is vastly more
@@ -100,6 +116,7 @@ proc allocSlowPath(r: var MemRegion; size: int) =
   fresh.size = s
   fresh.head = nil
   fresh.tail = nil
+  fresh.next = nil
   inc r.totalSize, s
   let old = r.tail
   if old == nil:
@@ -168,6 +185,7 @@ proc setObstackPtr*(r: var MemRegion; sp: StackPtr) =
 
 proc obstackPtr*(): StackPtr = tlRegion.obstackPtr()
 proc setObstackPtr*(sp: StackPtr) = tlRegion.setObstackPtr(sp)
+proc deallocAll*() = tlRegion.deallocAll()
 
 proc joinRegion*(dest: var MemRegion; src: MemRegion) =
   # merging is not hard.