about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--mu.arc19
-rw-r--r--mu.arc.t13
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)))))