@@ -1,5 +1,4 @@
1−{-# LANGUAGE PatternGuards #-}
1+{-# LANGUAGE PatternGuards #-}
3module IRTS.CodegenJavaScript (codegenJavaScript, codegenNode, JSTarget(..)) where
2module IRTS.CodegenJavaScript (codegenJavaScript, codegenNode, JSTarget(..)) where
5import Idris.AbsSyntax hiding (TypeCase)
4import Idris.AbsSyntax hiding (TypeCase)
@@ -290,6 +289,10 @@ codegenJS_all target definitions includes filename outputType = do
290 jsbn <- readFile $ path ++ "jsbn/jsbn.js"
289 jsbn <- readFile $ path ++ "jsbn/jsbn.js"
291 let runtime = header ++ jsbn ++ idrRuntime ++ tgtRuntime
290 let runtime = header ++ jsbn ++ idrRuntime ++ tgtRuntime
292 writeFile filename $ runtime ++ concat code ++ main ++ invokeMain
291 writeFile filename $ runtime ++ concat code ++ main ++ invokeMain
292+ setPermissions filename (emptyPermissions { readable = True
293+ , executable = target == Node
294 main :: String
297 main :: String
295 main = compileJS $
298 main = compileJS $
@@ -585,6 +588,28 @@ jsIsNull js = JSBinOp "==" js JSNull
585jsBigInt :: JS -> JS
588jsBigInt :: JS -> JS
586jsBigInt = JSNum . JSInteger . JSBigIntExpr
589jsBigInt = JSNum . JSInteger . JSBigIntExpr
591+jsUnPackBits :: JS -> JS
592+jsUnPackBits js = JSIndex js $ JSNum (JSInt 0)
595+jsPackUBits8 :: JS -> JS
596+jsPackUBits8 js = JSNew "Uint8Array" [JSArray [js]]
598+jsPackUBits16 :: JS -> JS
599+jsPackUBits16 js = JSNew "Uint16Array" [JSArray [js]]
601+jsPackUBits32 :: JS -> JS
602+jsPackUBits32 js = JSNew "Uint32Array" [JSArray [js]]
604+jsPackSBits8 :: JS -> JS
605+jsPackSBits8 js = JSNew "Int8Array" [JSArray [js]]
607+jsPackSBits16 :: JS -> JS
608+jsPackSBits16 js = JSNew "Int16Array" [JSArray [js]]
610+jsPackSBits32 :: JS -> JS
611+jsPackSBits32 js = JSNew "Int32Array" [JSArray [js]]
588jsTAG :: JS -> JS
613jsTAG :: JS -> JS
589jsTAG js =
614jsTAG js =
590 JSTernary (jsIsNumber js `jsOr` jsIsNull js) (
615 JSTernary (jsIsNumber js `jsOr` jsIsNull js) (
@@ -635,9 +660,9 @@ jsOP reg op args = JSAssign (translateReg reg) jsOP'
636 | LNoOp <- op = translateReg (last args)
661 | LNoOp <- op = translateReg (last args)
638− {-| (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ JSVar (last args)-}
663+ | (LZExt (ITFixed IT8) ITNative) <- op = jsUnPackBits $ translateReg (last args)
639− {-| (LZExt (ITFixed IT16) ITNative) <- op = jsUnPackBits $ JSVar (last args)-}
664+ | (LZExt (ITFixed IT16) ITNative) <- op = jsUnPackBits $ translateReg (last args)
640− {-| (LZExt (ITFixed IT32) ITNative) <- op = jsUnPackBits $ JSVar (last args)-}
665+ | (LZExt (ITFixed IT32) ITNative) <- op = jsUnPackBits $ translateReg (last args)
642 | (LZExt _ ITBig) <- op = jsBigInt $ JSApp (JSIdent "String") [translateReg (last args)]
667 | (LZExt _ ITBig) <- op = jsBigInt $ JSApp (JSIdent "String") [translateReg (last args)]
643 | (LPlus (ATInt ITBig)) <- op
668 | (LPlus (ATInt ITBig)) <- op
@@ -1206,16 +1231,17 @@ jsOP reg op args = JSAssign (translateReg reg) jsOP'
1206 , (arg:_) <- args = JSProj (translateReg arg) "split('').reverse().join('')"
1231 , (arg:_) <- args = JSProj (translateReg arg) "split('').reverse().join('')"
1207 | LStrIndex <- op
1232 | LStrIndex <- op
1208 , (lhs:rhs:_) <- args = JSIndex (translateReg lhs) (translateReg rhs)
1233 , (lhs:rhs:_) <- args = JSIndex (translateReg lhs) (translateReg rhs)
1209− {-| LStrTail <- op-}
1234+ | LStrTail <- op
1210− {-, (arg:_) <- args = let v = translateVariableName arg in-}
1235+ , (arg:_) <- args = let v = translateReg arg in
1211− {-JSApp (JSProj (JSIdent v) "substr") [-}
1236+ JSApp (JSProj v "substr") [
1212− {-JSNum (JSInt 1),-}
1237+ JSNum (JSInt 1),
1213− {-JSBinOp "-" (JSProj (JSIdent v) "length") (JSNum (JSInt 1))-}
1238+ JSBinOp "-" (JSProj v "length") (JSNum (JSInt 1))
1215 {-| LSystemInfo <- op-}
1240 {-| LSystemInfo <- op-}
1216 {-, (arg:_) <- args = jsCall "__IDRRT__systemInfo" [JSVar arg]-}
1241 {-, (arg:_) <- args = jsCall "__IDRRT__systemInfo" [JSVar arg]-}
1217 | LNullPtr <- op
1242 | LNullPtr <- op
1218 , (_) <- args = JSNull
1243 , (_) <- args = JSNull
1244+ | otherwise = JSError $ "Not implemented: " ++ show op
1220 translateBinaryOp :: String -> Reg -> Reg -> JS
1246 translateBinaryOp :: String -> Reg -> Reg -> JS
1221 translateBinaryOp op lhs rhs =
1247 translateBinaryOp op lhs rhs =
@@ -1258,7 +1284,7 @@ translateBC bc
1258 | CONSTCASE r c d <- bc = jsCONSTCASE r c d
1284 | CONSTCASE r c d <- bc = jsCONSTCASE r c d
1259 | PROJECT r l a <- bc = jsPROJECT r l a
1285 | PROJECT r l a <- bc = jsPROJECT r l a
1260 | OP r o a <- bc = jsOP r o a
1286 | OP r o a <- bc = jsOP r o a
1287+ | ERROR e <- bc = jsERROR e
1261 | otherwise = JSRaw $ show bc
1288 | otherwise = JSRaw $ show bc
1262 {-| PROJECTINTO _ _ _ <- bc = undefined-}
1289 {-| PROJECTINTO _ _ _ <- bc = undefined-}
1263− {-| ERROR e <- bc = jsERROR e-}