on master help sign in
javascript: handling bigints
commitcecc1fe20c120ae4a528f166578b04dab627f760 authorraichoo <raichoo@googlemail.com> dateSat 21 Jun 2014, 14:26 (12 years ago) parent31f9833
1 file changed+14−8
src/IRTS/CodegenJavaScript.hs+14−8
src/IRTS/CodegenJavaScript.hs+14−8
@@ -45,6 +45,7 @@ data JSType = JSIntTy
4545data JSInteger = JSBigZero
4646 | JSBigOne
4747 | JSBigInt Integer
48+ | JSBigIntExpr JS
4849 deriving Eq
4950
5051
@@ -193,11 +194,12 @@ compileJS (JSString str) =
193194 "\"" ++ str ++ "\""
194195
195196compileJS (JSNum num)
196− | JSInt i <- num = show i
197− | JSFloat f <- num = show f
198− | JSInteger JSBigZero <- num = "__IDRRT__ZERO"
199− | JSInteger JSBigOne <- num = "__IDRRT__ONE"
200− | JSInteger (JSBigInt i) <- num = show i
197+ | JSInt i <- num = show i
198+ | JSFloat f <- num = show f
199+ | JSInteger JSBigZero <- num = "__IDRRT__ZERO"
200+ | JSInteger JSBigOne <- num = "__IDRRT__ONE"
201+ | JSInteger (JSBigInt i) <- num = show i
202+ | JSInteger (JSBigIntExpr e) <- num = "__IDRRT__bigInt(" ++ compileJS e ++ ")"
201203
202204compileJS (JSAssign lhs rhs) =
203205 compileJS lhs ++ " = " ++ compileJS rhs
@@ -348,7 +350,9 @@ translateConstant (AType ATFloat) = JSType JSFloatTy
348350translateConstant (AType (ATInt ITChar)) = JSType JSCharTy
349351translateConstant PtrType = JSType JSPtrTy
350352translateConstant Forgot = JSType JSForgotTy
351−translateConstant (BI i) = jsBigInt $ JSString (show i)
353+translateConstant (BI i) = jsBigInt (JSString $ show i)
354+translateConstant (BI 0) = JSNum (JSInteger JSBigZero)
355+translateConstant (BI 1) = JSNum (JSInteger JSBigOne)
352356translateConstant (B8 b) = JSWord (JSWord8 b)
353357translateConstant (B16 b) = JSWord (JSWord16 b)
354358translateConstant (B32 b) = JSWord (JSWord32 b)
@@ -568,7 +572,9 @@ jsTypeOf :: JS -> JS
568572jsTypeOf js = JSPreOp "typeof " js
569573
570574jsEq :: JS -> JS -> JS
571−jsEq = JSBinOp "=="
575+jsEq lhs@(JSNum (JSInteger _)) rhs = JSApp (JSProj lhs "equals") [rhs]
576+jsEq lhs rhs@(JSNum (JSInteger _)) = JSApp (JSProj lhs "equals") [rhs]
577+jsEq lhs rhs = JSBinOp "==" lhs rhs
572578
573579jsIsNumber :: JS -> JS
574580jsIsNumber js = (jsTypeOf js) `jsEq` (JSString "number")
@@ -577,7 +583,7 @@ jsIsNull :: JS -> JS
577583jsIsNull js = JSBinOp "==" js JSNull
578584
579585jsBigInt :: JS -> JS
580−jsBigInt arg = JSApp (JSIdent "__IDRRT__bigInt") [arg]
586+jsBigInt = JSNum . JSInteger . JSBigIntExpr
581587
582588jsTAG :: JS -> JS
583589jsTAG js =