on master help sign in
Fix runtime code for comparing things
ae6a3b3Evan Czaplicki
compiler/Generate/JavaScript.hs+5−5
@@ -314,7 +314,7 @@ clauseToJS span var (Clause value vars e) = do
314jsNil = "_L.Nil"
314jsNil = "_L.Nil"
315jsCons e1 e2 = "_L.Cons(" ++ e1 ++ "," ++ e2 ++ ")"
315jsCons e1 e2 = "_L.Cons(" ++ e1 ++ "," ++ e2 ++ ")"
316jsRange e1 e2 = "_L.range" ++ parens (e1 ++ "," ++ e2)
316jsRange e1 e2 = "_L.range" ++ parens (e1 ++ "," ++ e2)
317−jsCompare e1 e2 op = parens ("_N.cmp(" ++ e1 ++ "," ++ e2 ++ ").ctor" ++ op)
317+jsCompare e1 e2 op = parens ("_N.cmp(" ++ e1 ++ "," ++ e2 ++ ")" ++ op)
318
318
319
319
320binop op e1 e2 =
320binop op e1 e2 =
@@ -341,9 +341,9 @@ binop op e1 e2 =
341 , ("." , jsFunc "x" . ret $ e1 ++ parens (e2 ++ parens "x"))
341 , ("." , jsFunc "x" . ret $ e1 ++ parens (e2 ++ parens "x"))
342 , ("==", "_N.eq(" ++ e1 ++ "," ++ e2 ++ ")")
342 , ("==", "_N.eq(" ++ e1 ++ "," ++ e2 ++ ")")
343 , ("/=", "!_N.eq(" ++ e1 ++ "," ++ e2 ++ ")")
343 , ("/=", "!_N.eq(" ++ e1 ++ "," ++ e2 ++ ")")
344− , ("<" , jsCompare e1 e2 "==='LT'")
344+ , ("<" , jsCompare e1 e2 "<0")
345− , (">" , jsCompare e1 e2 "==='GT'")
345+ , (">" , jsCompare e1 e2 ">0")
346− , ("<=", jsCompare e1 e2 "!=='GT'")
346+ , ("<=", jsCompare e1 e2 "<1")
347− , (">=", jsCompare e1 e2 "!=='LT'")
347+ , (">=", jsCompare e1 e2 ">-1")
348 , ("div", parens (e1 ++ "/" ++ e2 ++ "|0"))
348 , ("div", parens (e1 ++ "/" ++ e2 ++ "|0"))
349 ])
349 ])
libraries/Native/Utils.js+4−2
@@ -19,8 +19,10 @@ Elm.Native.Utils = function(elm) {
19 return x === y;
19 return x === y;
20 }
20 }
21
21
22+ // code in Generate/JavaScript.hs depends on the particular
23+ // integer values assigned to LT, EQ, and GT
22− var EQ = 0, LT = -1, GT = 1, ord = ['EQ','LT','GT'];
24+ var LT = -1, EQ = 0, GT = 1, ord = ['LT','EQ','GT'];
23− function compare(x,y) { return { ctor: ord[cmp(x,y)] } }
25+ function compare(x,y) { return { ctor: ord[cmp(x,y)+1] } }
24 function cmp(x,y) {
26 function cmp(x,y) {
25 var ord;
27 var ord;
26 if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;
28 if (typeof x !== 'object') return x === y ? EQ : x < y ? LT : GT;