diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2014-11-03 22:34:58 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2014-11-03 22:37:44 -0800 |
commit | 83d275f9a8c5e37bdff7f0b7c2f92c9d04fa061d (patch) | |
tree | e94747bdf13e084db866cbce6d25dcd5f09a86f0 /mu.arc | |
parent | 5be49b35fd7f3edfe2aff29abff35f5b3af8cbbf (diff) | |
download | mu-83d275f9a8c5e37bdff7f0b7c2f92c9d04fa061d.tar.gz |
215 - allow record fields to be named
Diffstat (limited to 'mu.arc')
-rw-r--r-- | mu.arc | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/mu.arc b/mu.arc index 8774b6bc..1db0ef09 100644 --- a/mu.arc +++ b/mu.arc @@ -44,7 +44,7 @@ integer-array-address (obj size 1 address t elem 'integer-array) integer-address (obj size 1 address t elem 'integer) ; pointer to int ; records consist of a series of elems, corresponding to a list of types - integer-boolean-pair (obj size 2 record t elems '(integer boolean)) + integer-boolean-pair (obj size 2 record t elems '(integer boolean) fields '(int bool)) integer-boolean-pair-address (obj size 1 address t elem 'integer-boolean-pair) integer-boolean-pair-array (obj array t elem 'integer-boolean-pair) integer-boolean-pair-array-address (obj size 1 address t elem 'integer-boolean-pair-array) @@ -647,15 +647,28 @@ ;; convert symbolic names to integer offsets (def convert-names (instrs) - (let offset (table) + (with (offset (table) + isa-field (table)) (let idx 1 (each instr instrs (let (oargs op args) (parse-instr instr) - (each arg args - (when (maybe-add arg offset idx) - (err "use before set: @arg") - (++ idx))) + (if (in op 'get 'get-address) + (with (fields ((typeinfo args.0) 'fields) + field (v args.1)) + (when (isa field 'sym) + (assert (~offset field) "field @args.1 is also a variable") + (assert fields "no field names available for @instr") + (iflet idx (pos field fields) + (do (set isa-field.field) + (= offset.field idx)) + (assert nil "couldn't find field in @instr")))) + (each arg args + (assert (~isa-field v.arg) "arg @arg is also a field name") + (when (maybe-add arg offset idx) + (err "use before set: @arg") + (++ idx)))) (each arg oargs + (assert (~isa-field v.arg) "oarg @arg is also a field name") (when (maybe-add arg offset idx) (++ idx)))))) (each instr instrs |