diff options
-rw-r--r-- | mu.arc | 19 | ||||
-rw-r--r-- | mu.arc.t | 13 |
2 files changed, 32 insertions, 0 deletions
diff --git a/mu.arc b/mu.arc index 3bade639..e80c1795 100644 --- a/mu.arc +++ b/mu.arc @@ -93,6 +93,20 @@ (def typeinfo (operand) (types* ty.operand)) +;? (def is-array (operand) +;? (if (pos 'deref metadata.operand) +;? (if typeinfo.operand!address +;? ((types* typeinfo.operand!elem) 'array) +;? (err "can't deref non-address @operand")) +;? typeinfo.operand!array)) +;? +;? (def is-record (operand) +;? (if (pos 'deref metadata.operand) +;? (if typeinfo.operand!address +;? ((types* typeinfo.operand!elem) 'record) +;? (err "can't deref non-address @operand")) +;? typeinfo.operand!record)) + (def sz (operand) ;? (prn "sz " operand) ; todo: override this for arrays @@ -287,6 +301,11 @@ get (with (base arg.0 ; integer (non-symbol) memory location including metadata idx (v arg.1)) ; literal integer +;? (prn base ": " (memory* v.base)) + (when typeinfo.base!address + (assert (pos 'deref metadata.base)) + (= base (list (memory* v.base) typeinfo.base!elem))) +;? (prn "after: " base) (if typeinfo.base!array (array-ref base idx) diff --git a/mu.arc.t b/mu.arc.t index 9f7365c9..19e82d75 100644 --- a/mu.arc.t +++ b/mu.arc.t @@ -400,6 +400,19 @@ (add-fns '((main ((1 integer) <- literal 34) + ((2 boolean) <- literal nil) + ((3 integer-boolean-pair-address) <- literal 1) + ((4 boolean) <- get (3 integer-boolean-pair-address deref) (1 offset)) + ((5 integer) <- get (3 integer-boolean-pair-address deref) (0 offset))))) +(run 'main) +;? (prn memory*) +(if (~iso memory* (obj 1 34 2 nil 3 1 4 nil 5 34)) + (prn "F - 'get' accesses fields of record address")) + +(reset) +(add-fns + '((main + ((1 integer) <- literal 34) ((2 integer) <- literal 35) ((3 integer) <- literal 36) ((4 integer-integer-pair) <- get (1 integer-point-pair) (1 offset))))) |