about summary refs log tree commit diff stats
path: root/shell/eval.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-03-05 06:19:21 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-03-05 06:19:21 -0800
commit2454f72c8a5db58059fae079913d11138ac09230 (patch)
tree0d33b4b2c49e19b24e1b07e44419f0cee270385b /shell/eval.mu
parent275a652402e296eeef4f2e139bde44330bf85a6f (diff)
downloadmu-2454f72c8a5db58059fae079913d11138ac09230.tar.gz
7854 - shell: symbol lookup
Diffstat (limited to 'shell/eval.mu')
-rw-r--r--shell/eval.mu44
1 files changed, 44 insertions, 0 deletions
diff --git a/shell/eval.mu b/shell/eval.mu
index 1774f8a2..ff7a8e4f 100644
--- a/shell/eval.mu
+++ b/shell/eval.mu
@@ -290,3 +290,47 @@ fn cell-isomorphic? _a: (addr cell), _b: (addr cell), trace: (addr trace) -> _/e
   var result/eax: boolean <- cell-isomorphic? a-tmp, b-tmp, trace
   return result
 }
+
+fn test-evaluate-is-well-behaved {
+  var t-storage: trace
+  var t/esi: (addr trace) <- address t-storage
+  initialize-trace t, 0x10, 0/visible  # we don't use trace UI
+  #
+  var tmp-storage: (handle cell)
+  var tmp-ah/edx: (addr handle cell) <- address tmp-storage
+  # eval sym(a), nil env
+  allocate-pair tmp-ah
+  var env/eax: (addr cell) <- lookup *tmp-ah
+  new-symbol tmp-ah, "a"
+  evaluate tmp-ah, tmp-ah, env, t
+  # doesn't die
+  check-trace-contains t, "error", "unbound symbol: a", "F - test-evaluate-is-well-behaved"
+}
+
+fn test-evaluate {
+  # tmp = (a . 3)
+  var val-storage: (handle cell)
+  var val-ah/ecx: (addr handle cell) <- address val-storage
+  new-integer val-ah, 3
+  var key-storage: (handle cell)
+  var key-ah/edx: (addr handle cell) <- address key-storage
+  new-symbol key-ah, "a"
+  var tmp-storage: (handle cell)
+  var tmp-ah/ebx: (addr handle cell) <- address tmp-storage
+  new-pair tmp-ah, *key-ah, *val-ah
+  # env = ((a . 3))
+  var nil-storage: (handle cell)
+  var nil-ah/ecx: (addr handle cell) <- address nil-storage
+  allocate-pair nil-ah
+  new-pair tmp-ah, *tmp-ah, *nil-ah
+  var env/eax: (addr cell) <- lookup *tmp-ah
+  # eval sym(a), env
+  new-symbol tmp-ah, "a"
+  evaluate tmp-ah, tmp-ah, env, 0/no-trace
+  var result/eax: (addr cell) <- lookup *tmp-ah
+  var result-type/edx: (addr int) <- get result, type
+  check-ints-equal *result-type, 1/number, "F - test-evaluate/0"
+  var result-value-addr/eax: (addr float) <- get result, number-data
+  var result-value/eax: int <- convert *result-value-addr
+  check-ints-equal result-value, 3, "F - test-evaluate/1"
+}