From 2454f72c8a5db58059fae079913d11138ac09230 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 5 Mar 2021 06:19:21 -0800 Subject: [PATCH] 7854 - shell: symbol lookup --- shell/eval.mu | 44 ++++++++++++++++++++++++++++++++++++++++++++ shell/sandbox.mu | 19 ++----------------- 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