@@ -1,4 +1,4 @@
1−{-# LANGUAGE PatternGuards #-}
1+{-# LANGUAGE PatternGuards #-}
2module IRTS.CodegenJavaScript (codegenJavaScript, codegenNode, JSTarget(..)) where
2module IRTS.CodegenJavaScript (codegenJavaScript, codegenNode, JSTarget(..)) where
4import Idris.AbsSyntax hiding (TypeCase)
4import Idris.AbsSyntax hiding (TypeCase)
@@ -582,7 +582,9 @@ jsIsNull :: JS -> JS
582jsIsNull js = JSBinOp "==" js JSNull
582jsIsNull js = JSBinOp "==" js JSNull
584jsBigInt :: JS -> JS
584jsBigInt :: JS -> JS
585+jsBigInt (JSString "0") = JSNum (JSInteger JSBigZero)
586+jsBigInt (JSString "1") = JSNum (JSInteger JSBigOne)
585−jsBigInt = JSNum . JSInteger . JSBigIntExpr
587+jsBigInt js = JSNum $ JSInteger $ JSBigIntExpr js
587jsUnPackBits :: JS -> JS
589jsUnPackBits :: JS -> JS
588jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
590jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
@@ -606,32 +608,32 @@ jsPackSBits16 js = JSNew "Int16Array" [JSArray [js]]
606jsPackSBits32 :: JS -> JS
608jsPackSBits32 :: JS -> JS
607jsPackSBits32 js = JSNew "Int32Array" [JSArray [js]]
609jsPackSBits32 js = JSNew "Int32Array" [JSArray [js]]
611− JSTernary (jsIsNumber js `jsOr` jsIsNull js) (
612− JSNum (JSInt $ negate 1)
613− ) (JSTernary (js `jsInstanceOf` "i$CON") (
615− ) (JSNum (JSInt $ negate 1)))
618−jsCTAG js = JSProj js "tag"
620-- TODO unsafe
611-- TODO unsafe
621jsCASE :: Bool -> Reg -> [(Int, [BC])] -> Maybe [BC] -> JS
612jsCASE :: Bool -> Reg -> [(Int, [BC])] -> Maybe [BC] -> JS
622jsCASE safe reg cases def =
613jsCASE safe reg cases def =
623− {-JSSwitch (tag safe (translateReg reg)) (-}
614+ JSSwitch (tag safe $ translateReg reg) (
624− JSSwitch (JSTernary (translateReg reg `jsInstanceOf` "i$CON") (
625− JSProj (translateReg reg) "tag") (JSNum (JSInt $ negate 1))) (
626 map ((JSNum . JSInt) *** prepBranch) cases
615 map ((JSNum . JSInt) *** prepBranch) cases
627 ) (fmap prepBranch def)
616 ) (fmap prepBranch def)
629 tag :: Bool -> JS -> JS
618 tag :: Bool -> JS -> JS
630 tag True = jsCTAG
619 tag True = jsCTAG
631 tag False = jsTAG
620 tag False = jsTAG
632 prepBranch :: [BC] -> JS
622 prepBranch :: [BC] -> JS
633 prepBranch bc = JSSeq $ map translateBC bc
623 prepBranch bc = JSSeq $ map translateBC bc
627+ JSTernary (jsIsNumber js `jsOr` jsIsNull js) (
628+ JSNum (JSInt $ negate 1)
629+ ) (JSTernary (js `jsInstanceOf` "i$CON") (
631+ ) (JSNum (JSInt $ negate 1)))
634+ jsCTAG js = JSProj js "tag"
635jsCONSTCASE :: Reg -> [(Const, [BC])] -> Maybe [BC] -> JS
637jsCONSTCASE :: Reg -> [(Const, [BC])] -> Maybe [BC] -> JS
636jsCONSTCASE reg cases def =
638jsCONSTCASE reg cases def =
637 JSCond $ (
639 JSCond $ (