diff src/mono_opt.sml @ 107:bed5cf0b6b75

Optimizing attrification of constants
author Adam Chlipala <adamc@hcoop.net>
date Thu, 10 Jul 2008 15:58:16 -0400
parents d101cb1efe55
children 6230bdd122e7
line wrap: on
line diff
--- a/src/mono_opt.sml	Thu Jul 10 15:49:14 2008 -0400
+++ b/src/mono_opt.sml	Thu Jul 10 15:58:16 2008 -0400
@@ -33,6 +33,24 @@
 fun typ t = t
 fun decl d = d
 
+fun attrifyInt n =
+    if n < 0 then
+        "-" ^ Int64.toString (Int64.~ n)
+    else
+        Int64.toString n
+
+fun attrifyFloat n =
+    if n < 0.0 then
+        "-" ^ Real.toString (Real.~ n)
+    else
+        Real.toString n
+
+val attrifyString = String.translate (fn #"\"" => "&quot;"
+                                       | ch => if Char.isPrint ch then
+                                                   str ch
+                                               else
+                                                   "&#" ^ Int.toString (ord ch) ^ ";")
+
 fun exp e =
     case e of
         EPrim (Prim.String s) =>
@@ -85,10 +103,24 @@
         ESeq ((optExp (EWrite e1, loc), loc),
               (optExp (EWrite e2, loc), loc))
 
+      | EFfiApp ("Basis", "attrifyInt", [(EPrim (Prim.Int n), _)]) =>
+        EPrim (Prim.String (attrifyInt n))
+      | EWrite (EFfiApp ("Basis", "attrifyInt", [(EPrim (Prim.Int n), _)]), loc) =>
+        EWrite (EPrim (Prim.String (attrifyInt n)), loc)
       | EWrite (EFfiApp ("Basis", "attrifyInt", [e]), _) =>
         EFfiApp ("Basis", "attrifyInt_w", [e])
+
+      | EFfiApp ("Basis", "attrifyFloat", [(EPrim (Prim.Float n), _)]) =>
+        EPrim (Prim.String (attrifyFloat n))
+      | EWrite (EFfiApp ("Basis", "attrifyFloat", [(EPrim (Prim.Float n), _)]), loc) =>
+        EWrite (EPrim (Prim.String (attrifyFloat n)), loc)
       | EWrite (EFfiApp ("Basis", "attrifyFloat", [e]), _) =>
         EFfiApp ("Basis", "attrifyFloat_w", [e])
+
+      | EFfiApp ("Basis", "attrifyString", [(EPrim (Prim.String s), _)]) =>
+        EPrim (Prim.String (attrifyString s))
+      | EWrite (EFfiApp ("Basis", "attrifyString", [(EPrim (Prim.String s), _)]), loc) =>
+        EWrite (EPrim (Prim.String (attrifyString s)), loc)
       | EWrite (EFfiApp ("Basis", "attrifyString", [e]), _) =>
         EFfiApp ("Basis", "attrifyString_w", [e])