about summary refs log tree commit diff stats
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
parent275a652402e296eeef4f2e139bde44330bf85a6f (diff)
downloadmu-2454f72c8a5db58059fae079913d11138ac09230.tar.gz
7854 - shell: symbol lookup
-rw-r--r--shell/eval.mu44
-rw-r--r--shell/sandbox.mu19
2 files changed, 46 insertions, 17 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"
+}
diff --git a/shell/sandbox.mu b/shell/sandbox.mu
index fbed3cff..2ff426d6 100644
--- a/shell/sandbox.mu
+++ b/shell/sandbox.mu
@@ -175,24 +175,9 @@ fn run in: (addr gap-buffer), out: (addr stream byte), trace: (addr trace) {
     return
   }
   var nil-storage: (handle cell)
-  var nil-ah/ecx: (addr handle cell) <- address nil-storage
+  var nil-ah/eax: (addr handle cell) <- address nil-storage
   allocate-pair nil-ah
-  # HERE
-  var tmp-storage: (handle cell)
-  var tmp-ah/edx: (addr handle cell) <- address tmp-storage
-  # tmp = a
-  new-symbol tmp-ah, "a"
-  # tmp = (a)
-  new-pair tmp-ah, *tmp-ah, *nil-ah
-  # tmp = (a . (a)) = (a a)
-  var tmp/eax: (addr cell) <- lookup *tmp-ah
-  {
-    var new-ah/ecx: (addr handle cell) <- get tmp, left
-    new-pair tmp-ah, *new-ah, *tmp-ah
-  }
-  # env = tmp = ((a a))
-  new-pair tmp-ah, *tmp-ah, *nil-ah
-  var env/eax: (addr cell) <- lookup *tmp-ah
+  var env/eax: (addr cell) <- lookup *nil-ah
   var eval-result-storage: (handle cell)
   var eval-result/edi: (addr handle cell) <- address eval-result-storage
   evaluate read-result, eval-result, env, trace