From 1ea0b4e57922e5cb69193b5118b91a2a3da33d95 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Mon, 26 Jan 2015 02:42:30 -0800 Subject: 627 --- mu.arc | 8 ++++---- mu.arc.t | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/mu.arc b/mu.arc index 688fc012..d8b45205 100644 --- a/mu.arc +++ b/mu.arc @@ -1019,14 +1019,14 @@ (def new-scalar (type) ;? (tr "new scalar: @type") - (ret result rep.routine*!alloc - (when (>= rep.routine*!alloc rep.routine*!alloc-max) + (let sz (sizeof `((_ ,type))) + (when (> sz (- rep.routine*!alloc-max rep.routine*!alloc)) (let curr-alloc Memory-allocated-until (= rep.routine*!alloc curr-alloc) (++ Memory-allocated-until Allocation-chunk) (= rep.routine*!alloc-max Memory-allocated-until))) - (++ rep.routine*!alloc (sizeof `((_ ,type)))) - )) + (ret result rep.routine*!alloc + (++ rep.routine*!alloc sz)))) (def new-array (type size) ;? (tr "new array: @type @size") diff --git a/mu.arc.t b/mu.arc.t index 0bb64788..cc5be550 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -1902,6 +1902,31 @@ (when (~is rep.routine!alloc-max 50) (prn "F - 'new' updates upper bound for routine memory @rep.routine!alloc-max"))) +(reset) +(new-trace "new-skip") +(add-code + '((function main [ + (1:integer-boolean-pair-address <- new integer-boolean-pair:literal) + ]))) +; start allocating from address 30, in chunks of 10 locations each +(= Memory-allocated-until 30 + Allocation-chunk 10) +(let routine make-routine!main + (assert:is rep.routine!alloc 30) + (assert:is rep.routine!alloc-max 40) + ; pretend the current chunk has just one location left + (= rep.routine!alloc 39) + (enq routine running-routines*) + ; request 2 locations + (run) + (each routine completed-routines* + (aif rep.routine!error (prn "error - " it))) + (when (or (~is memory*.1 40) + (~is rep.routine!alloc 42) + (~is rep.routine!alloc-max 50) + (~is Memory-allocated-until 50)) + (prn "F - 'new' skips past current chunk if insufficient space"))) + ; Even though our memory locations can now have names, the names are all ; globals, accessible from any function. To isolate functions from their ; callers we need local variables, and mu provides them using a special -- cgit 1.4.1-2-gfad0