@@ -20,6 +20,7 @@ import System.Directory
21idrNamespace :: String
21idrNamespace :: String
22idrNamespace = "__IDR__"
22idrNamespace = "__IDR__"
23+idrRTNamespace = "__IDRRT__"
24data JSTarget = Node | JavaScript deriving Eq
25data JSTarget = Node | JavaScript deriving Eq
@@ -41,7 +42,6 @@ codegenJavaScript target definitions filename outputType = do
41 writeFile filename ( header
42 writeFile filename ( header
42 ++ idrRuntime
43 ++ idrRuntime
43 ++ tgtRuntime
44 ++ tgtRuntime
45 ++ functions
45 ++ functions
46 ++ mainLoop)
46 ++ mainLoop)
@@ -56,19 +56,10 @@ codegenJavaScript target definitions filename outputType = do
57 mainLoop :: String
57 mainLoop :: String
58 mainLoop = intercalate "\n" [ "\nfunction main() {"
58 mainLoop = intercalate "\n" [ "\nfunction main() {"
59− , createTailcall "__IDR__.runMain0()"
59+ , createTailcall "__IDR__runMain0()"
60 , "}\n\nmain();\n"
60 , "}\n\nmain();\n"
64− concatMap allocMod mods
66− allocMod m = intercalate "." m ++ " = {};\n"
67− sortMods a b = compare (length a) (length b)
70− drop 1 $ sortBy sortMods $ nub $ concatMap (inits . fst) def
72translateIdentifier :: String -> String
63translateIdentifier :: String -> String
73translateIdentifier =
64translateIdentifier =
74 replaceReserved . concatMap replaceBadChars
65 replaceReserved . concatMap replaceBadChars
@@ -127,10 +118,10 @@ translateIdentifier =
127 , "yield"
118 , "yield"
130−translateNamespace :: Name -> [String]
121+translateNamespace :: Name -> String
131−translateNamespace (UN _) = [idrNamespace]
122+translateNamespace (UN _) = idrNamespace
132−translateNamespace (NS _ ns) = idrNamespace : map translateIdentifier ns
123+translateNamespace (NS _ ns) = idrNamespace ++ concatMap translateIdentifier ns
133−translateNamespace (MN _ _) = [idrNamespace]
124+translateNamespace (MN _ _) = idrNamespace
135translateName :: Name -> String
126translateName :: Name -> String
136translateName (UN name) = translateIdentifier name
127translateName (UN name) = translateIdentifier name
@@ -139,16 +130,17 @@ translateName (MN i name) = translateIdentifier name ++ show i
140translateConstant :: Const -> String
131translateConstant :: Const -> String
141translateConstant (I i) = show i
132translateConstant (I i) = show i
142−translateConstant (BI i) = "__IDRRT__.bigInt('" ++ show i ++ "')"
133+translateConstant (BI i) = idrRTNamespace ++ "bigInt('" ++ show i ++ "')"
143translateConstant (Fl f) = show f
134translateConstant (Fl f) = show f
144translateConstant (Ch c) = show c
135translateConstant (Ch c) = show c
145translateConstant (Str s) = show s
136translateConstant (Str s) = show s
146−translateConstant (AType (ATInt ITNative)) = "__IDRRT__.Int"
137+translateConstant (AType (ATInt ITNative)) = idrRTNamespace ++ "Int"
147−translateConstant StrType = "__IDRRT__.String"
138+translateConstant StrType = idrRTNamespace ++ "String"
148−translateConstant (AType (ATInt ITBig)) = "__IDRRT__.Integer"
139+translateConstant (AType (ATInt ITBig)) = idrRTNamespace ++ "Integer"
149−translateConstant (AType ATFloat) = "__IDRRT__.Float"
140+translateConstant (AType ATFloat) = idrRTNamespace ++ "Float"
150−translateConstant PtrType = "__IDRRT__.Ptr"
141+translateConstant (AType (ATInt ITChar)) = idrRTNamespace ++ "Char"
142+translateConstant PtrType = idrRTNamespace ++ "Ptr"
151−translateConstant Forgot = "__IDRRT__.Forgot"
143+translateConstant Forgot = idrRTNamespace ++ "Forgot"
152translateConstant c =
144translateConstant c =
153 "(function(){throw 'Unimplemented Const: " ++ show c ++ "';})()"
145 "(function(){throw 'Unimplemented Const: " ++ show c ++ "';})()"
@@ -157,9 +149,9 @@ translateParameterlist =
157 where translateParameter (MN i name) = translateIdentifier name ++ show i
149 where translateParameter (MN i name) = translateIdentifier name ++ show i
158 translateParameter (UN name) = translateIdentifier name
150 translateParameter (UN name) = translateIdentifier name
160−translateDeclaration :: ([String], SDecl) -> String
152+translateDeclaration :: (String, SDecl) -> String
161translateDeclaration (path, SFun name params stackSize body) =
153translateDeclaration (path, SFun name params stackSize body) =
162− intercalate "." (path ++ [translateName name])
154+ "var " ++ path ++ translateName name
163 ++ " = function("
155 ++ " = function("
164 ++ intercalate "," p
156 ++ intercalate "," p
165 ++ "){\n"
157 ++ "){\n"
@@ -205,44 +197,16 @@ translateExpression (SApp False name vars) =
205 createTailcall $ translateFunctionCall name vars
197 createTailcall $ translateFunctionCall name vars
207translateExpression (SApp True name vars) =
199translateExpression (SApp True name vars) =
208− "new __IDRRT__.Tailcall("
200+ "new " ++ idrRTNamespace ++ "Tailcall("
209 ++ "function(){\n"
201 ++ "function(){\n"
210 ++ "return " ++ translateFunctionCall name vars
202 ++ "return " ++ translateFunctionCall name vars
211 ++ ";\n})"
203 ++ ";\n})"
213translateExpression (SOp op vars)
205translateExpression (SOp op vars)
214− | (LPlus _) <- op
206+ | LNoOp <- op = translateVariableName (last vars)
215− , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
207+
216− | (LMinus _) <- op
208+ | (LZExt _ ITBig) <- op =
217− , (lhs:rhs:_) <- vars = translateBinaryOp "-" lhs rhs
209+ idrRTNamespace ++ "bigInt(" ++ translateVariableName (last vars) ++ ")"
219− , (lhs:rhs:_) <- vars = translateBinaryOp "*" lhs rhs
221− , (lhs:rhs:_) <- vars = translateBinaryOp "/" lhs rhs
223− , (lhs:rhs:_) <- vars = translateBinaryOp "%" lhs rhs
225− , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
227− , (lhs:rhs:_) <- vars = translateBinaryOp "<" lhs rhs
229− , (lhs:rhs:_) <- vars = translateBinaryOp "<=" lhs rhs
231− , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
233− , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
235− , (lhs:rhs:_) <- vars = translateBinaryOp "&" lhs rhs
237− , (lhs:rhs:_) <- vars = translateBinaryOp "|" lhs rhs
239− , (lhs:rhs:_) <- vars = translateBinaryOp "^" lhs rhs
241− , (lhs:rhs:_) <- vars = translateBinaryOp "<<" rhs lhs
243− , (lhs:rhs:_) <- vars = translateBinaryOp ">>" rhs lhs
245− , (arg:_) <- vars = '~' : translateVariableName arg
247 | (LPlus (ATInt ITBig)) <- op
211 | (LPlus (ATInt ITBig)) <- op
248 , (lhs:rhs:_) <- vars = translateBinaryOp ".add(" lhs rhs ++ ")"
212 , (lhs:rhs:_) <- vars = translateBinaryOp ".add(" lhs rhs ++ ")"
@@ -284,6 +248,39 @@ translateExpression (SOp op vars)
284 | (LGe ATFloat) <- op
248 | (LGe ATFloat) <- op
285 , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
249 , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
252+ , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
254+ , (lhs:rhs:_) <- vars = translateBinaryOp "-" lhs rhs
256+ , (lhs:rhs:_) <- vars = translateBinaryOp "*" lhs rhs
258+ , (lhs:rhs:_) <- vars = translateBinaryOp "/" lhs rhs
260+ , (lhs:rhs:_) <- vars = translateBinaryOp "%" lhs rhs
262+ , (lhs:rhs:_) <- vars = translateBinaryOp "==" lhs rhs
264+ , (lhs:rhs:_) <- vars = translateBinaryOp "<" lhs rhs
266+ , (lhs:rhs:_) <- vars = translateBinaryOp "<=" lhs rhs
268+ , (lhs:rhs:_) <- vars = translateBinaryOp ">" lhs rhs
270+ , (lhs:rhs:_) <- vars = translateBinaryOp ">=" lhs rhs
272+ , (lhs:rhs:_) <- vars = translateBinaryOp "&" lhs rhs
274+ , (lhs:rhs:_) <- vars = translateBinaryOp "|" lhs rhs
276+ , (lhs:rhs:_) <- vars = translateBinaryOp "^" lhs rhs
278+ , (lhs:rhs:_) <- vars = translateBinaryOp "<<" rhs lhs
280+ , (lhs:rhs:_) <- vars = translateBinaryOp ">>" rhs lhs
282+ , (arg:_) <- vars = '~' : translateVariableName arg
287 | LStrConcat <- op
284 | LStrConcat <- op
288 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
285 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
289 | LStrEq <- op
286 | LStrEq <- op
@@ -298,13 +295,13 @@ translateExpression (SOp op vars)
298 | (LIntStr ITNative) <- op
295 | (LIntStr ITNative) <- op
299 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
296 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
300 | (LSExt ITNative ITBig) <- op
297 | (LSExt ITNative ITBig) <- op
301− , (arg:_) <- vars = "__IDRRT__.bigInt(" ++ translateVariableName arg ++ ")"
298+ , (arg:_) <- vars = idrRTNamespace ++ "bigInt(" ++ translateVariableName arg ++ ")"
302 | (LTrunc ITBig ITNative) <- op
299 | (LTrunc ITBig ITNative) <- op
303 , (arg:_) <- vars = translateVariableName arg ++ ".valueOf()"
300 , (arg:_) <- vars = translateVariableName arg ++ ".valueOf()"
304 | (LIntStr ITBig) <- op
301 | (LIntStr ITBig) <- op
305 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
302 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
306 | (LStrInt ITBig) <- op
303 | (LStrInt ITBig) <- op
307− , (arg:_) <- vars = "__IDRRT__.bigInt(" ++ translateVariableName arg ++ ")"
304+ , (arg:_) <- vars = idrRTNamespace ++ "bigInt(" ++ translateVariableName arg ++ ")"
308 | LFloatStr <- op
305 | LFloatStr <- op
309 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
306 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
310 | LStrFloat <- op
307 | LStrFloat <- op
@@ -367,7 +364,7 @@ translateExpression (SError msg) =
367 "(function(){throw \'" ++ msg ++ "\';})()"
364 "(function(){throw \'" ++ msg ++ "\';})()"
369translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
366translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
370− "__IDRRT__.print(" ++ translateVariableName var ++ ")"
367+ idrRTNamespace ++ "print(" ++ translateVariableName var ++ ")"
372translateExpression (SForeign _ _ fun args)
369translateExpression (SForeign _ _ fun args)
373 | "[]=" `isSuffixOf` fun
370 | "[]=" `isSuffixOf` fun
@@ -423,8 +420,8 @@ translateExpression (SForeign _ _ fun args)
423 '(' : intercalate "," (map generateWrapper as) ++ ")"
420 '(' : intercalate "," (map generateWrapper as) ++ ")"
425 generateWrapper (ffunc, name)
422 generateWrapper (ffunc, name)
426− | FFunction <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
423+ | FFunction <- ffunc = idrRTNamespace ++ "ffiWrap(" ++ translateVariableName name ++ ")"
427− | FFunctionIO <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
424+ | FFunctionIO <- ffunc = idrRTNamespace ++ "ffiWrap(" ++ translateVariableName name ++ ")"
429 generateWrapper (_, name) =
426 generateWrapper (_, name) =
430 translateVariableName name
427 translateVariableName name
@@ -444,7 +441,7 @@ translateExpression (SCase var cases) =
446translateExpression (SCon i name vars) =
443translateExpression (SCon i name vars) =
447− concat [ "new __IDRRT__.Con("
444+ concat [ "new " ++ idrRTNamespace ++ "Con("
450 , intercalate "," $ map translateVariableName vars
447 , intercalate "," $ map translateVariableName vars
@@ -480,7 +477,7 @@ translateCase var (SConstCase ty e)
480 matchHelper tyName = translateTypeMatch var tyName e
477 matchHelper tyName = translateTypeMatch var tyName e
482translateCase var (SConstCase cst@(BI _) e) =
479translateCase var (SConstCase cst@(BI _) e) =
483− let cond = "__IDRRT__.bigInt(" ++ var ++ ").equals(" ++ translateConstant cst ++ ")" in
480+ let cond = idrRTNamespace ++ "bigInt(" ++ var ++ ").equals(" ++ translateConstant cst ++ ")" in
484 createIfBlock cond (translateExpression e)
481 createIfBlock cond (translateExpression e)
486translateCase var (SConstCase cst e) =
483translateCase var (SConstCase cst e) =
@@ -488,7 +485,7 @@ translateCase var (SConstCase cst e) =
488 createIfBlock cond (translateExpression e)
485 createIfBlock cond (translateExpression e)
490translateCase var (SConCase a i name vars e) =
487translateCase var (SConCase a i name vars e) =
491− let isCon = var ++ " instanceof __IDRRT__.Con"
488+ let isCon = var ++ " instanceof " ++ idrRTNamespace ++ "Con"
492 isI = show i ++ " == " ++ var ++ ".i"
489 isI = show i ++ " == " ++ var ++ ".i"
493 params = intercalate "," $ map (("__var_" ++) . show) [a..(a+length vars)]
490 params = intercalate "," $ map (("__var_" ++) . show) [a..(a+length vars)]
494 args = ".apply(this," ++ var ++ ".vars)"
491 args = ".apply(this," ++ var ++ ".vars)"
@@ -503,7 +500,7 @@ translateTypeMatch :: String -> String -> SExp -> String
503translateTypeMatch var ty exp =
500translateTypeMatch var ty exp =
504 let e = translateExpression exp in
501 let e = translateExpression exp in
505 createIfBlock (var
502 createIfBlock (var
506− ++ " instanceof __IDRRT__.Type && "
503+ ++ " instanceof " ++ idrRTNamespace ++ "Type && "
507 ++ var ++ ".type == '"++ ty ++"'") e
504 ++ var ++ ".type == '"++ ty ++"'") e
@@ -513,11 +510,10 @@ createIfBlock cond e =
513 ++ ";\n}"
510 ++ ";\n}"
515createTailcall call =
512createTailcall call =
516− "__IDRRT__.tailcall(function(){return " ++ call ++ "})"
513+ idrRTNamespace ++ "tailcall(function(){return " ++ call ++ "})"
518translateFunctionCall name vars =
515translateFunctionCall name vars =
519− concat (intersperse "." $ translateNamespace name)
516+ translateNamespace name
521 ++ translateName name
517 ++ translateName name
523 ++ intercalate "," (map translateVariableName vars)
519 ++ intercalate "," (map translateVariableName vars)