# HG changeset patch # User Adam Chlipala # Date 1230919402 18000 # Node ID 55829473f6a72bbb892d50704ba39704f440b7ad # Parent f277f5faebcd1fd16f9ece71f7142ffff880ef73 Injected an option diff -r f277f5faebcd -r 55829473f6a7 src/jscomp.sml --- a/src/jscomp.sml Fri Jan 02 12:42:39 2009 -0500 +++ b/src/jscomp.sml Fri Jan 02 13:03:22 2009 -0500 @@ -156,6 +156,12 @@ fun str loc s = (EPrim (Prim.String s), loc) + fun isNullable (t, _) = + case t of + TOption _ => true + | TRecord [] => true + | _ => false + fun quoteExp loc (t : typ) (e, st) = case #1 t of TSource => (strcat loc [str loc "s", @@ -207,6 +213,23 @@ result = (TFfi ("Basis", "string"), loc)}), loc), st) + | TOption t => + let + val (e', st) = quoteExp loc t ((ERel 0, loc), st) + in + ((ECase (e, + [((PNone t, loc), + str loc "null"), + ((PSome (t, (PVar ("x", t), loc)), loc), + if isNullable t then + strcat loc [str loc "{v:", e', str loc "}"] + else + e')], + {disc = (TOption t, loc), + result = (TFfi ("Basis", "string"), loc)}), loc), + st) + end + | _ => (EM.errorAt loc "Don't know how to embed type in JavaScript"; Print.prefaces "Can't embed" [("t", MonoPrint.p_typ MonoEnv.empty t)]; (str loc "ERROR", st)) @@ -228,12 +251,6 @@ | PConFfi {mod = "Basis", con = "False", ...} => str "false" | PConFfi {con, ...} => str ("\"_" ^ con ^ "\"") - fun isNullable (t, _) = - case t of - TOption _ => true - | TRecord [] => true - | _ => false - fun unsupported s = (EM.errorAt loc (s ^ " in code to be compiled to JavaScript[2]"); (str "ERROR", st)) @@ -320,11 +337,16 @@ str ":", succ, str ")"] - | PSome (_, p) => strcat [str ("(d" ^ Int.toString depth ^ "?"), - jsPat depth inner p succ fail, - str ":", - fail, - str ")"] + | PSome (t, p) => strcat (str ("(d" ^ Int.toString depth ^ "?") + :: (if isNullable t then + [str ("d" ^ Int.toString depth + ^ "=d" ^ Int.toString depth ^ ".v")] + else + []) + @ [jsPat depth inner p succ fail, + str ":", + fail, + str ")"]) fun deStrcat (e, _) = case e of diff -r f277f5faebcd -r 55829473f6a7 tests/jsinj.ur --- a/tests/jsinj.ur Fri Jan 02 12:42:39 2009 -0500 +++ b/tests/jsinj.ur Fri Jan 02 13:03:22 2009 -0500 @@ -8,6 +8,7 @@ cookie string : string cookie bool : bool cookie pair : int * float +cookie option : option int fun main () : transaction page = n <- getCookie int; @@ -30,6 +31,10 @@ p <- return (getOpt p (1, 2.3)); sp <- source (4, 5.6); + o <- getCookie option; + o <- return (getOpt o (Some 1)); + op <- source None; + return {[n]}}/> CHANGE
@@ -45,4 +50,9 @@ {[p.1]}, {[p.2]}}/> CHANGE
+ + return None + | Some x => return {[x]}}/> + CHANGE