summaryrefslogtreecommitdiffstats
path: root/codegen.sml
diff options
context:
space:
mode:
Diffstat (limited to 'codegen.sml')
-rw-r--r--codegen.sml37
1 files changed, 23 insertions, 14 deletions
diff --git a/codegen.sml b/codegen.sml
index a4fef6c..9dbee51 100644
--- a/codegen.sml
+++ b/codegen.sml
@@ -62,7 +62,11 @@ struct
end
fun go expr =
case expr of
- Syntax.CRecord (_, res, k) => insert res (go k)
+ Syntax.CRecord (records, k) =>
+ foldl
+ (fn ((_, res), acc) => insert res acc)
+ (go k)
+ records
| Syntax.CSelect (_, _, res, k) => insert res (go k)
| Syntax.CApp _ => VarMap.empty
| Syntax.CFix (funcs, body) =>
@@ -115,20 +119,25 @@ struct
| translateVal x = x
fun go expr =
case expr of
- Syntax.CRecord (args, res, k) =>
- Syntax.OAlloc (translate res, Syntax.VInt (length args))
- :: List.concat
+ Syntax.CRecord (records, k) =>
+ map (fn (args, res) => Syntax.OAlloc (translate res, Syntax.VInt (length args)))
+ records
+ @ List.concat
(map
- (fn (i, (arg, path)) =>
- let val (temp, ops) =
- foldl
- (fn (off, (arg, ops)) =>
- (Syntax.VVar tempReg, Syntax.OPeek (tempReg, off, translateVal arg) :: ops))
- (translateVal arg, [])
- path
- in rev (Syntax.OPoke (i, translate res, temp) :: ops)
- end)
- (enumerate args))
+ (fn (args, res) =>
+ List.concat
+ (map
+ (fn (i, (arg, path)) =>
+ let val (temp, ops) =
+ foldl
+ (fn (off, (arg, ops)) =>
+ (Syntax.VVar tempReg, Syntax.OPeek (tempReg, off, arg) :: ops))
+ (translateVal arg, [])
+ path
+ in rev (Syntax.OPoke (i, translate res, temp) :: ops)
+ end)
+ (enumerate args)))
+ records)
@ go k
| Syntax.CSelect (i, arg, res, k) => Syntax.OPeek (translate res, i, translateVal arg) :: go k
| Syntax.CApp (func, args) => shuffle (map translateVal (func :: args)) @ [Syntax.OCall]