diff options
Diffstat (limited to 'shell/evaluate.mu')
-rw-r--r-- | shell/evaluate.mu | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/shell/evaluate.mu b/shell/evaluate.mu index c789d755..cb2c84ef 100644 --- a/shell/evaluate.mu +++ b/shell/evaluate.mu @@ -134,6 +134,14 @@ fn evaluate _in-ah: (addr handle cell), _out-ah: (addr handle cell), env-h: (han trace-higher trace return } + compare *in-type, 7/array + { + break-if-!= + trace-text trace, "eval", "array" + copy-object _in-ah, _out-ah + trace-higher trace + return + } # 'in' is a syntax tree $evaluate:literal-function: { # trees starting with "litfn" are literals @@ -1374,6 +1382,43 @@ fn cell-isomorphic? _a: (addr cell), _b: (addr cell), trace: (addr trace) -> _/e var result/eax: boolean <- gap-buffers-equal? a-val, b-val return result } + # if objects are arrays, check if they have the same contents + compare b-type, 7/array + { + break-if-!= + var a-val-ah/ecx: (addr handle array handle cell) <- get a, array-data + var _a-val/eax: (addr array handle cell) <- lookup *a-val-ah + var a-val/ecx: (addr array handle cell) <- copy _a-val + var b-val-ah/eax: (addr handle array handle cell) <- get b, array-data + var _b-val/eax: (addr array handle cell) <- lookup *b-val-ah + var b-val/edx: (addr array handle cell) <- copy _b-val + var a-len/eax: int <- length a-val + var b-len/ebx: int <- length b-val + { + compare a-len, b-len + break-if-= + return 0/false + } + var i/esi: int <- copy 0 + { + compare i, b-len + break-if->= + var a-elem-ah/eax: (addr handle cell) <- index a-val, i + var _a-elem/eax: (addr cell) <- lookup *a-elem-ah + var a-elem/edi: (addr cell) <- copy _a-elem + var b-elem-ah/eax: (addr handle cell) <- index b-val, i + var b-elem/eax: (addr cell) <- lookup *b-elem-ah + var curr-result/eax: boolean <- cell-isomorphic? a-elem, b-elem, trace + { + compare curr-result, 0/false + break-if-!= + return 0/false + } + i <- increment + loop + } + return 1/true + } # if a is nil, b should be nil { # (assumes nil? returns 0 or 1) |