summaryrefslogtreecommitdiff
path: root/src/monoize.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-09-17 16:35:11 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-09-17 16:35:11 -0400
commitae83d3e44959b43c167ba83736055bf94ace3113 (patch)
tree9d7a2e3bc1dff89e7399d555415ffae5c45c8b52 /src/monoize.sml
parentbf1a78ce9a5d60f8f4c40d0087f6caf90c10a796 (diff)
Basic tail recursion introduction seems to be working
Diffstat (limited to 'src/monoize.sml')
-rw-r--r--src/monoize.sml15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/monoize.sml b/src/monoize.sml
index 9a3858f8..83a520c8 100644
--- a/src/monoize.sml
+++ b/src/monoize.sml
@@ -3137,6 +3137,21 @@ fun monoExp (env, st, fm) (all as (e, loc)) =
((L'.ELet (x, t', e1, e2), loc), fm)
end
+ | L.ETailCall (n, es, ek, _, (L.TRecord (L.CRecord (_, []), _), _)) =>
+ let
+ val (es, fm) = ListUtil.foldlMap (fn (e, fm) => monoExp (env, st, fm) e) fm es
+ val (ek, fm) = monoExp (env, st, fm) ek
+
+ val e = (L'.ENamed n, loc)
+ val e = foldl (fn (e, arg) => (L'.EApp (e, arg), loc)) e es
+ val e = (L'.EApp (e, ek), loc)
+ in
+ (e, fm)
+ end
+ | L.ETailCall _ => (E.errorAt loc "Full scope of tail call continuation isn't known";
+ Print.eprefaces' [("Expression", CorePrint.p_exp env all)];
+ (dummyExp, fm))
+
| L.EServerCall (n, es, ek, t, (L.TRecord (L.CRecord (_, []), _), _)) =>
let
val t = monoType env t