diff src/jscomp.sml @ 905:7a4b026e45dd

Library improvements; proper list [un]urlification; remove server-side ServerCalls; eta reduction in type inference
author Adam Chlipala <adamc@hcoop.net>
date Sun, 09 Aug 2009 16:13:27 -0400
parents ae9e22822ec5
children c270fb847dc2
line wrap: on
line diff
--- a/src/jscomp.sml	Thu Aug 06 15:23:04 2009 -0400
+++ b/src/jscomp.sml	Sun Aug 09 16:13:27 2009 -0400
@@ -86,7 +86,7 @@
       | ESignalReturn e => varDepth e
       | ESignalBind (e1, e2) => Int.max (varDepth e1, varDepth e2)
       | ESignalSource e => varDepth e
-      | EServerCall (e, ek, _, _) => Int.max (varDepth e, varDepth ek)
+      | EServerCall (e, ek, _, _, _) => Int.max (varDepth e, varDepth ek)
       | ERecv (e, ek, _) => Int.max (varDepth e, varDepth ek)
       | ESleep (e, ek) => Int.max (varDepth e, varDepth ek)
 
@@ -130,7 +130,7 @@
               | ESignalReturn e => cu inner e
               | ESignalBind (e1, e2) => cu inner e1 andalso cu inner e2
               | ESignalSource e => cu inner e
-              | EServerCall (e, ek, _, _) => cu inner e andalso cu inner ek
+              | EServerCall (e, ek, _, _, _) => cu inner e andalso cu inner ek
               | ERecv (e, ek, _) => cu inner e andalso cu inner ek
               | ESleep (e, ek) => cu inner e andalso cu inner ek
     in
@@ -434,6 +434,13 @@
                     ("(t[i++]==\"Some\"?" ^ e ^ ":null)", st)
                 end
 
+              | TList t =>
+                let
+                    val (e, st) = unurlifyExp loc (t, st)
+                in
+                    ("uul(function(){return t[i++];},function(){return " ^ e ^ "})", st)
+                end
+
               | TDatatype (n, ref (dk, cs)) =>
                 (case IM.find (#decoders st, n) of
                      SOME n' => ("(tmp=_n" ^ Int.toString n' ^ "(t,i),i=tmp._1,tmp._2)", st)
@@ -1034,7 +1041,7 @@
                                  st)
                             end
 
-                          | EServerCall (e, ek, t, eff) =>
+                          | EServerCall (e, ek, t, eff, _) =>
                             let
                                 val (e, st) = jsE inner (e, st)
                                 val (ek, st) = jsE inner (ek, st)
@@ -1313,12 +1320,13 @@
                      ((ESignalSource e, loc), st)
                  end
                  
-               | EServerCall (e1, e2, t, ef) =>
+               | EServerCall (e1, e2, t, ef, ue) =>
                  let
                      val (e1, st) = exp outer (e1, st)
                      val (e2, st) = exp outer (e2, st)
+                     val (ue, st) = exp outer (ue, st)
                  in
-                     ((EServerCall (e1, e2, t, ef), loc), st)
+                     ((EServerCall (e1, e2, t, ef, ue), loc), st)
                  end
                | ERecv (e1, e2, t) =>
                  let