From 2454f72c8a5db58059fae079913d11138ac09230 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Fri, 5 Mar 2021 06:19:21 -0800 Subject: 7854 - shell: symbol lookup --- shell/eval.mu | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'shell/eval.mu') 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" +} -- cgit 1.4.1-2-gfad0