summaryrefslogtreecommitdiff
path: root/src/mono_opt.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2008-11-09 18:19:47 -0500
committerGravatar Adam Chlipala <adamc@hcoop.net>2008-11-09 18:19:47 -0500
commita676c53ffcf88833514d12968ee5b6b28aa8cc8a (patch)
tree20f7896237fd6c5305a66766a96cdc17fdbbfcec /src/mono_opt.sml
parent15dbb86a5905e505527ab60972087e8bed0c9088 (diff)
Remove some allocation
Diffstat (limited to 'src/mono_opt.sml')
-rw-r--r--src/mono_opt.sml30
1 files changed, 29 insertions, 1 deletions
diff --git a/src/mono_opt.sml b/src/mono_opt.sml
index 93cb888b..e350db1d 100644
--- a/src/mono_opt.sml
+++ b/src/mono_opt.sml
@@ -320,11 +320,39 @@ fun exp e =
| EWrite (EQuery {exps, tables, state, query,
initial = (EPrim (Prim.String ""), _),
+ body}, loc) =>
+ let
+ fun passLets (depth, (e', _), lets) =
+ case e' of
+ EStrcat ((ERel x, _), e'') =>
+ if x = depth then
+ let
+ val body = (optExp (EWrite e'', loc), loc)
+ val body = foldl (fn ((x, t, e'), e) =>
+ (ELet (x, t, e', e), loc))
+ body lets
+ in
+ EQuery {exps = exps, tables = tables, query = query,
+ state = (TRecord [], loc),
+ initial = (ERecord [], loc),
+ body = body}
+ end
+ else
+ e
+ | ELet (x, t, e', e'') =>
+ passLets (depth + 1, e'', (x, t, e') :: lets)
+ | _ => e
+ in
+ passLets (0, body, [])
+ end
+
+ (*| EWrite (EQuery {exps, tables, state, query,
+ initial = (EPrim (Prim.String ""), _),
body = (EStrcat ((ERel 0, _), e'), _)}, loc) =>
EQuery {exps = exps, tables = tables, query = query,
state = (TRecord [], loc),
initial = (ERecord [], loc),
- body = (optExp (EWrite e', loc), loc)}
+ body = (optExp (EWrite e', loc), loc)}*)
| EWrite (ELet (x, t, e1, e2), loc) =>
optExp (ELet (x, t, e1, (EWrite e2, loc)), loc)