@@ -163,9 +163,11 @@ compileJS (JSTernary cond true false) =
163 f = compileJS false in
163 f = compileJS false in
164 "(" ++ c ++ ")?(" ++ t ++ "):(" ++ f ++ ")"
164 "(" ++ c ++ ")?(" ++ t ++ "):(" ++ f ++ ")"
166−jsTailcall :: String -> [JS] -> JS
166+jsTailcall :: JS -> JS
167−jsTailcall fun args =
167+jsTailcall call =
168− jsCall (idrRTNamespace ++ "tailcall") [JSRaw fun, JSArray args]
168+ jsCall (idrRTNamespace ++ "tailcall") [
169+ JSFunction [] (JSReturn call)
170jsCall :: String -> [JS] -> JS
172jsCall :: String -> [JS] -> JS
171jsCall fun = JSApp (JSRaw fun)
173jsCall fun = JSApp (JSRaw fun)
@@ -265,7 +267,7 @@ codegenJavaScript target definitions filename outputType = do
265 writeFile filename $ intercalate "\n" $ [ header
267 writeFile filename $ intercalate "\n" $ [ header
266 , idrRuntime
268 , idrRuntime
267 , tgtRuntime
269 , tgtRuntime
268− ] ++ functions ++ [mainLoop]
270+ ] ++ functions ++ [compileJS mainLoop]
270 setPermissions filename (emptyPermissions { readable = True
272 setPermissions filename (emptyPermissions { readable = True
271 , executable = target == Node
273 , executable = target == Node
@@ -276,15 +278,20 @@ codegenJavaScript target definitions filename outputType = do
276 def = map (first translateNamespace) definitions
278 def = map (first translateNamespace) definitions
278 functions :: [String]
280 functions :: [String]
279− functions = map (compileJS . optJS 1 . translateDeclaration) def
281+ functions = map (compileJS . translateDeclaration) def
281− mainLoop :: String
283+ mainLoop :: JS
282− mainLoop = compileJS $
284+ mainLoop =
283− JSSeq [ JSAlloc "main" $ Just $ JSFunction [] (
292+ loop = JSAlloc "main" $ Just $ JSFunction [] (
284− jsTailcall mainFun []
293+ jsTailcall $ jsCall mainFun []
289 mainFun :: String
296 mainFun :: String
290 mainFun = idrNamespace ++ translateName (MN 0 "runMain")
297 mainFun = idrNamespace ++ translateName (MN 0 "runMain")
@@ -503,15 +510,14 @@ translateExpression (SV var) =
504translateExpression (SApp tc name vars)
511translateExpression (SApp tc name vars)
505 | False <- tc =
512 | False <- tc =
506− jsTailcall (translateFunctionCall name) (map JSVar vars)
513+ jsTailcall $ translateFunctionCall name vars
507 | True <- tc =
514 | True <- tc =
508− JSNew (idrRTNamespace ++ "Tailcall")
515+ JSNew (idrRTNamespace ++ "Cont") [JSFunction [] (
509− [ JSRaw $ translateFunctionCall name
516+ JSReturn $ translateFunctionCall name vars
510− , JSArray $ map JSVar vars
513− translateFunctionCall name =
519+ translateFunctionCall name vars =
514− translateNamespace name ++ translateName name
520+ jsCall (translateNamespace name ++ translateName name) (map JSVar vars)
516translateExpression (SOp op vars)
522translateExpression (SOp op vars)
517 | LNoOp <- op = JSVar (last vars)
523 | LNoOp <- op = JSVar (last vars)