@@ -41,7 +41,6 @@ codegenJavaScript target definitions filename outputType = do
41 writeFile filename ( header
41 writeFile filename ( header
42 ++ idrRuntime
42 ++ idrRuntime
43 ++ tgtRuntime
43 ++ tgtRuntime
45 ++ functions
44 ++ functions
46 ++ mainLoop)
45 ++ mainLoop)
@@ -56,19 +55,10 @@ codegenJavaScript target definitions filename outputType = do
57 mainLoop :: String
56 mainLoop :: String
58 mainLoop = intercalate "\n" [ "\nfunction main() {"
57 mainLoop = intercalate "\n" [ "\nfunction main() {"
59− , createTailcall "__IDR__.runMain0()"
58+ , createTailcall "__IDR__runMain0()"
60 , "}\n\nmain();\n"
59 , "}\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
62translateIdentifier :: String -> String
73translateIdentifier =
63translateIdentifier =
74 replaceReserved . concatMap replaceBadChars
64 replaceReserved . concatMap replaceBadChars
@@ -139,16 +129,16 @@ translateName (MN i name) = translateIdentifier name ++ show i
140translateConstant :: Const -> String
130translateConstant :: Const -> String
141translateConstant (I i) = show i
131translateConstant (I i) = show i
142−translateConstant (BI i) = "__IDRRT__.bigInt('" ++ show i ++ "')"
132+translateConstant (BI i) = "__IDRRT__bigInt('" ++ show i ++ "')"
143translateConstant (Fl f) = show f
133translateConstant (Fl f) = show f
144translateConstant (Ch c) = show c
134translateConstant (Ch c) = show c
145translateConstant (Str s) = show s
135translateConstant (Str s) = show s
146−translateConstant (AType (ATInt ITNative)) = "__IDRRT__.Int"
136+translateConstant (AType (ATInt ITNative)) = "__IDRRT__Int"
147−translateConstant StrType = "__IDRRT__.String"
137+translateConstant StrType = "__IDRRT__String"
148−translateConstant (AType (ATInt ITBig)) = "__IDRRT__.Integer"
138+translateConstant (AType (ATInt ITBig)) = "__IDRRT__Integer"
149−translateConstant (AType ATFloat) = "__IDRRT__.Float"
139+translateConstant (AType ATFloat) = "__IDRRT__Float"
150−translateConstant PtrType = "__IDRRT__.Ptr"
140+translateConstant PtrType = "__IDRRT__Ptr"
151−translateConstant Forgot = "__IDRRT__.Forgot"
141+translateConstant Forgot = "__IDRRT__Forgot"
152translateConstant c =
142translateConstant c =
153 "(function(){throw 'Unimplemented Const: " ++ show c ++ "';})()"
143 "(function(){throw 'Unimplemented Const: " ++ show c ++ "';})()"
@@ -159,7 +149,7 @@ translateParameterlist =
160translateDeclaration :: ([String], SDecl) -> String
150translateDeclaration :: ([String], SDecl) -> String
161translateDeclaration (path, SFun name params stackSize body) =
151translateDeclaration (path, SFun name params stackSize body) =
162− intercalate "." (path ++ [translateName name])
152+ "var " ++ concat (path ++ [translateName name])
163 ++ " = function("
153 ++ " = function("
164 ++ intercalate "," p
154 ++ intercalate "," p
165 ++ "){\n"
155 ++ "){\n"
@@ -205,12 +195,13 @@ translateExpression (SApp False name vars) =
205 createTailcall $ translateFunctionCall name vars
195 createTailcall $ translateFunctionCall name vars
207translateExpression (SApp True name vars) =
197translateExpression (SApp True name vars) =
208− "new __IDRRT__.Tailcall("
198+ "new __IDRRT__Tailcall("
209 ++ "function(){\n"
199 ++ "function(){\n"
210 ++ "return " ++ translateFunctionCall name vars
200 ++ "return " ++ translateFunctionCall name vars
211 ++ ";\n})"
201 ++ ";\n})"
213translateExpression (SOp op vars)
203translateExpression (SOp op vars)
204+ | LNoOp <- op = translateVariableName (last vars) ++ "/* NOOP */"
214 | (LPlus _) <- op
205 | (LPlus _) <- op
215 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
206 , (lhs:rhs:_) <- vars = translateBinaryOp "+" lhs rhs
216 | (LMinus _) <- op
207 | (LMinus _) <- op
@@ -298,13 +289,13 @@ translateExpression (SOp op vars)
298 | (LIntStr ITNative) <- op
289 | (LIntStr ITNative) <- op
299 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
290 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
300 | (LSExt ITNative ITBig) <- op
291 | (LSExt ITNative ITBig) <- op
301− , (arg:_) <- vars = "__IDRRT__.bigInt(" ++ translateVariableName arg ++ ")"
292+ , (arg:_) <- vars = "__IDRRT__bigInt(" ++ translateVariableName arg ++ ")"
302 | (LTrunc ITBig ITNative) <- op
293 | (LTrunc ITBig ITNative) <- op
303 , (arg:_) <- vars = translateVariableName arg ++ ".valueOf()"
294 , (arg:_) <- vars = translateVariableName arg ++ ".valueOf()"
304 | (LIntStr ITBig) <- op
295 | (LIntStr ITBig) <- op
305 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
296 , (arg:_) <- vars = translateVariableName arg ++ ".toString()"
306 | (LStrInt ITBig) <- op
297 | (LStrInt ITBig) <- op
307− , (arg:_) <- vars = "__IDRRT__.bigInt(" ++ translateVariableName arg ++ ")"
298+ , (arg:_) <- vars = "__IDRRT__bigInt(" ++ translateVariableName arg ++ ")"
308 | LFloatStr <- op
299 | LFloatStr <- op
309 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
300 , (arg:_) <- vars = "String(" ++ translateVariableName arg ++ ")"
310 | LStrFloat <- op
301 | LStrFloat <- op
@@ -367,7 +358,7 @@ translateExpression (SError msg) =
367 "(function(){throw \'" ++ msg ++ "\';})()"
358 "(function(){throw \'" ++ msg ++ "\';})()"
369translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
360translateExpression (SForeign _ _ "putStr" [(FString, var)]) =
370− "__IDRRT__.print(" ++ translateVariableName var ++ ")"
361+ "__IDRRT__print(" ++ translateVariableName var ++ ")"
372translateExpression (SForeign _ _ fun args)
363translateExpression (SForeign _ _ fun args)
373 | "[]=" `isSuffixOf` fun
364 | "[]=" `isSuffixOf` fun
@@ -423,8 +414,8 @@ translateExpression (SForeign _ _ fun args)
423 '(' : intercalate "," (map generateWrapper as) ++ ")"
414 '(' : intercalate "," (map generateWrapper as) ++ ")"
425 generateWrapper (ffunc, name)
416 generateWrapper (ffunc, name)
426− | FFunction <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
417+ | FFunction <- ffunc = "__IDRRT__ffiWrap(" ++ translateVariableName name ++ ")"
427− | FFunctionIO <- ffunc = "__IDRRT__.ffiWrap(" ++ translateVariableName name ++ ")"
418+ | FFunctionIO <- ffunc = "__IDRRT__ffiWrap(" ++ translateVariableName name ++ ")"
429 generateWrapper (_, name) =
420 generateWrapper (_, name) =
430 translateVariableName name
421 translateVariableName name
@@ -444,7 +435,7 @@ translateExpression (SCase var cases) =
446translateExpression (SCon i name vars) =
437translateExpression (SCon i name vars) =
447− concat [ "new __IDRRT__.Con("
438+ concat [ "new __IDRRT__Con("
450 , intercalate "," $ map translateVariableName vars
441 , intercalate "," $ map translateVariableName vars
@@ -480,7 +471,7 @@ translateCase var (SConstCase ty e)
480 matchHelper tyName = translateTypeMatch var tyName e
471 matchHelper tyName = translateTypeMatch var tyName e
482translateCase var (SConstCase cst@(BI _) e) =
473translateCase var (SConstCase cst@(BI _) e) =
483− let cond = "__IDRRT__.bigInt(" ++ var ++ ").equals(" ++ translateConstant cst ++ ")" in
474+ let cond = "__IDRRT__bigInt(" ++ var ++ ").equals(" ++ translateConstant cst ++ ")" in
484 createIfBlock cond (translateExpression e)
475 createIfBlock cond (translateExpression e)
486translateCase var (SConstCase cst e) =
477translateCase var (SConstCase cst e) =
@@ -488,7 +479,7 @@ translateCase var (SConstCase cst e) =
488 createIfBlock cond (translateExpression e)
479 createIfBlock cond (translateExpression e)
490translateCase var (SConCase a i name vars e) =
481translateCase var (SConCase a i name vars e) =
491− let isCon = var ++ " instanceof __IDRRT__.Con"
482+ let isCon = var ++ " instanceof __IDRRT__Con"
492 isI = show i ++ " == " ++ var ++ ".i"
483 isI = show i ++ " == " ++ var ++ ".i"
493 params = intercalate "," $ map (("__var_" ++) . show) [a..(a+length vars)]
484 params = intercalate "," $ map (("__var_" ++) . show) [a..(a+length vars)]
494 args = ".apply(this," ++ var ++ ".vars)"
485 args = ".apply(this," ++ var ++ ".vars)"
@@ -503,7 +494,7 @@ translateTypeMatch :: String -> String -> SExp -> String
503translateTypeMatch var ty exp =
494translateTypeMatch var ty exp =
504 let e = translateExpression exp in
495 let e = translateExpression exp in
505 createIfBlock (var
496 createIfBlock (var
506− ++ " instanceof __IDRRT__.Type && "
497+ ++ " instanceof __IDRRT__Type && "
507 ++ var ++ ".type == '"++ ty ++"'") e
498 ++ var ++ ".type == '"++ ty ++"'") e
@@ -513,11 +504,10 @@ createIfBlock cond e =
513 ++ ";\n}"
504 ++ ";\n}"
515createTailcall call =
506createTailcall call =
516− "__IDRRT__.tailcall(function(){return " ++ call ++ "})"
507+ "__IDRRT__tailcall(function(){return " ++ call ++ "})"
518translateFunctionCall name vars =
509translateFunctionCall name vars =
519− concat (intersperse "." $ translateNamespace name)
510+ concat (translateNamespace name)
521 ++ translateName name
511 ++ translateName name
523 ++ intercalate "," (map translateVariableName vars)
513 ++ intercalate "," (map translateVariableName vars)