about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2014-12-15 02:00:18 -0800
committerKartik K. Agaram <vc@akkartik.com>2014-12-15 02:00:18 -0800
commitfaad417b119394dc80eabadeab29c4128094230e (patch)
treebb95540444bf1f4b53c26cbc2ee1632b49e7455c
parent0ae67ccb0a3411fbcdbf14ddb70c79f61cb258cd (diff)
downloadmu-faad417b119394dc80eabadeab29c4128094230e.tar.gz
430 - cache common functions for tests
Tests now take 21s instead of 76s, reclaiming recent losses and more.
-rw-r--r--mu.arc233
-rw-r--r--mu.arc.t2
2 files changed, 122 insertions, 113 deletions
diff --git a/mu.arc b/mu.arc
index cfacf0e6..d2146938 100644
--- a/mu.arc
+++ b/mu.arc
@@ -8,12 +8,6 @@
   `(enq (fn () ,@body)
         initialization-fns*))
 
-(mac init-fn (name . body)
-  `(enq (fn ()
-;?           (prn ',name)
-          (= (function* ',name) (convert-names:convert-labels:convert-braces:tokenize-args:insert-code ',body ',name)))
-        initialization-fns*))
-
 ;; persisting and checking traces for each test
 (= traces* (queue))
 (= trace-dir* ".traces/")
@@ -1004,7 +998,127 @@
                   (each instr fragment
                     (yield instr)))))))))
 
+;; loading code into the virtual machine
+
+(def add-code (forms)
+  (each (op . rest)  forms
+    (case op
+      ; syntax: function <name> [ <instructions> ]
+      ; don't apply our lightweight tools just yet
+      function!
+        (let (name (_make-br-fn body))  rest
+          (assert (is 'make-br-fn _make-br-fn))
+          (= function*.name body))
+      function
+        (let (name (_make-br-fn body))  rest
+          (assert (is 'make-br-fn _make-br-fn))
+          (= function*.name (join body function*.name)))
+
+      ; syntax: before <label> [ <instructions> ]
+      ;
+      ; multiple before directives => code in order
+      before
+        (let (label (_make-br-fn fragment))  rest
+          (assert (is 'make-br-fn _make-br-fn))
+          (or= before*.label (queue))
+          (enq fragment before*.label))
+
+      ; syntax: after <label> [ <instructions> ]
+      ;
+      ; multiple after directives => code in *reverse* order
+      ; (if initialization order in a function is A B, corresponding
+      ; finalization order should be B A)
+      after
+        (let (label (_make-br-fn fragment))  rest
+          (assert (is 'make-br-fn _make-br-fn))
+          (push fragment after*.label))
+      )))
+
+(def freeze-functions ()
+;?   (prn "freeze")
+  (each (name body)  canon.function*
+;?     (tr name)
+;?     (prn keys.before* " -- " keys.after*)
+;?     (= function*.name (convert-names:convert-labels:convert-braces:prn:insert-code body)))
+    (= function*.name (convert-names:convert-labels:convert-braces:tokenize-args:insert-code body name))))
+
+(def tokenize-arg (arg)
+;?   (tr "tokenize-arg " arg)
+  (if (in arg '<- '_)
+        arg
+      (isa arg 'sym)
+        (map [map [fromstring _ (read)] _]
+             (map [tokens _ #\:]
+                  (tokens string.arg #\/)))
+      :else
+        arg))
+
+(def tokenize-args (instrs)
+;?   (tr "tokenize-args " instrs)
+;?   (prn2 "@(tostring prn.instrs) => "
+  (accum yield
+    (each instr instrs
+      (if atom.instr
+            (yield instr)
+          (is 'begin instr.0)
+            (yield `{begin ,@(tokenize-args cdr.instr)})
+          :else
+            (yield (map tokenize-arg instr))))))
+;?   )
+
+(def prn2 (msg . args)
+  (pr msg)
+  (apply prn args))
+
+(def canon (table)
+  (sort (compare < [tostring (prn:car _)]) (as cons table)))
+
+(def int-canon (table)
+  (sort (compare < car) (as cons table)))
+
+;; test helpers
+
+(def memory-contains (addr value)
+;?   (prn "Looking for @value starting at @addr")
+  (loop (addr addr
+         idx  0)
+;?     (prn "@idx vs @addr")
+    (if (>= idx len.value)
+          t
+        (~is memory*.addr value.idx)
+          (do1 nil
+               (prn "@addr should contain @value.idx but contains @memory*.addr"))
+        :else
+          (recur (+ addr 1) (+ idx 1)))))
+
+(def memory-contains-array (addr value)
+;?   (prn "Looking for @value starting at @addr, size @memory*.addr vs @len.value")
+  (and (>= memory*.addr len.value)
+       (loop (addr (+ addr 1)
+              idx  0)
+;?          (prn "comparing @memory*.addr and @value.idx")
+         (if (>= idx len.value)
+               t
+             (~is memory*.addr value.idx)
+               (do1 nil
+                    (prn "@addr should contain @value.idx but contains @memory*.addr"))
+             :else
+               (recur (+ addr 1) (+ idx 1))))))
+
 ;; system software
+; create once, load before every test
+
+(reset)
+(= system-function* (table))
+
+(mac init-fn (name . body)
+  `(= (system-function* ',name) 
+      (convert-names:convert-labels:convert-braces:tokenize-args:insert-code ',body ',name)))
+
+(on-init
+  (each (name f) system-function*
+    (= (function* name)
+       (system-function* name))))
 
 (section 100
 
@@ -1334,113 +1448,6 @@
 
 )  ; section 100 for system software
 
-(def canon (table)
-  (sort (compare < [tostring (prn:car _)]) (as cons table)))
-
-(def int-canon (table)
-  (sort (compare < car) (as cons table)))
-
-;; loading code into the virtual machine
-
-(def add-code (forms)
-  (each (op . rest)  forms
-    (case op
-      ; syntax: function <name> [ <instructions> ]
-      ; don't apply our lightweight tools just yet
-      function!
-        (let (name (_make-br-fn body))  rest
-          (assert (is 'make-br-fn _make-br-fn))
-          (= function*.name body))
-      function
-        (let (name (_make-br-fn body))  rest
-          (assert (is 'make-br-fn _make-br-fn))
-          (= function*.name (join body function*.name)))
-
-      ; syntax: before <label> [ <instructions> ]
-      ;
-      ; multiple before directives => code in order
-      before
-        (let (label (_make-br-fn fragment))  rest
-          (assert (is 'make-br-fn _make-br-fn))
-          (or= before*.label (queue))
-          (enq fragment before*.label))
-
-      ; syntax: after <label> [ <instructions> ]
-      ;
-      ; multiple after directives => code in *reverse* order
-      ; (if initialization order in a function is A B, corresponding
-      ; finalization order should be B A)
-      after
-        (let (label (_make-br-fn fragment))  rest
-          (assert (is 'make-br-fn _make-br-fn))
-          (push fragment after*.label))
-      )))
-
-(def freeze-functions ()
-;?   (prn "freeze")
-  (each (name body)  canon.function*
-;?     (tr name)
-;?     (prn keys.before* " -- " keys.after*)
-;?     (= function*.name (convert-names:convert-labels:convert-braces:prn:insert-code body)))
-    (= function*.name (convert-names:convert-labels:convert-braces:tokenize-args:insert-code body name))))
-
-(def tokenize-arg (arg)
-;?   (tr "tokenize-arg " arg)
-  (if (in arg '<- '_)
-        arg
-      (isa arg 'sym)
-        (map [map [fromstring _ (read)] _]
-             (map [tokens _ #\:]
-                  (tokens string.arg #\/)))
-      :else
-        arg))
-
-(def tokenize-args (instrs)
-;?   (tr "tokenize-args " instrs)
-;?   (prn2 "@(tostring prn.instrs) => "
-  (accum yield
-    (each instr instrs
-      (if atom.instr
-            (yield instr)
-          (is 'begin instr.0)
-            (yield `{begin ,@(tokenize-args cdr.instr)})
-          :else
-            (yield (map tokenize-arg instr))))))
-;?   )
-
-(def prn2 (msg . args)
-  (pr msg)
-  (apply prn args))
-
-;; test helpers
-
-(def memory-contains (addr value)
-;?   (prn "Looking for @value starting at @addr")
-  (loop (addr addr
-         idx  0)
-;?     (prn "@idx vs @addr")
-    (if (>= idx len.value)
-          t
-        (~is memory*.addr value.idx)
-          (do1 nil
-               (prn "@addr should contain @value.idx but contains @memory*.addr"))
-        :else
-          (recur (+ addr 1) (+ idx 1)))))
-
-(def memory-contains-array (addr value)
-;?   (prn "Looking for @value starting at @addr, size @memory*.addr vs @len.value")
-  (and (>= memory*.addr len.value)
-       (loop (addr (+ addr 1)
-              idx  0)
-;?          (prn "comparing @memory*.addr and @value.idx")
-         (if (>= idx len.value)
-               t
-             (~is memory*.addr value.idx)
-               (do1 nil
-                    (prn "@addr should contain @value.idx but contains @memory*.addr"))
-             :else
-               (recur (+ addr 1) (+ idx 1))))))
-
 ;; load all provided files and start at 'main'
 (reset)
 (awhen (pos "--" argv)
diff --git a/mu.arc.t b/mu.arc.t
index 041c9560..59ba0e78 100644
--- a/mu.arc.t
+++ b/mu.arc.t
@@ -175,8 +175,10 @@
       (3:integer <- add 1:integer 2:integer)
      ])))
 (run 'main)
+;? (prn memory*)
 (if (~iso memory* (obj 1 1  2 3  3 4))
   (prn "F - 'add' operates on two addresses"))
+;? (quit)
 
 (reset)
 (new-trace "add-literal")