From 8ea9fc2536aa0eb45092ed3654dba19b0c8e7c20 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sat, 27 Apr 2024 10:19:54 -0700 Subject: Implement recursive functions. --- codegen.sml | 37 +++++++++++++++++++++++-------------- 1 file changed, 23 insertions(+), 14 deletions(-) (limited to 'codegen.sml') 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] -- cgit v1.3.1