@@ -163,11 +163,9 @@ 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 :: JS -> JS
166+jsTailcall :: String -> [JS] -> JS
167−jsTailcall call =
167+jsTailcall fun args =
168− jsCall (idrRTNamespace ++ "tailcall") [
168+ jsCall (idrRTNamespace ++ "tailcall") [JSRaw fun, JSArray args]
169− JSFunction [] (JSReturn call)
172jsCall :: String -> [JS] -> JS
170jsCall :: String -> [JS] -> JS
173jsCall fun = JSApp (JSRaw fun)
171jsCall fun = JSApp (JSRaw fun)
@@ -214,15 +212,16 @@ jsLet name value body =
215optimizeJS :: JS -> JS
213optimizeJS :: JS -> JS
216optimizeJS (JSApp
214optimizeJS (JSApp
217− (JSFunction [arg] (JSReturn (JSNew con [tag, JSArray vals])))
215+ (JSFunction [arg] (JSReturn ret))
218+ | JSNew con [tag, JSArray vals] <- ret =
220− JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
219+ JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
221− where subst :: String -> [JS] -> JS -> [JS]
220+ where subst :: String -> [JS] -> JS -> [JS]
222− subst _ [] _ = []
221+ subst _ [] _ = []
223− subst var (x@(JSVar old) : xs) new
222+ subst var (x@(JSVar old) : xs) new
224− | var == translateVariableName old = new : xs
223+ | var == translateVariableName old = new : xs
225− | otherwise = x : subst var xs new
224+ | otherwise = x : subst var xs new
227optimizeJS (JSSeq seq) =
226optimizeJS (JSSeq seq) =
228 JSSeq (map optimizeJS seq)
227 JSSeq (map optimizeJS seq)
@@ -275,7 +274,7 @@ codegenJavaScript target definitions filename outputType = do
275 mainLoop :: String
274 mainLoop :: String
276 mainLoop = compileJS $
275 mainLoop = compileJS $
277 JSSeq [ JSAlloc "main" $ Just $ JSFunction [] (
276 JSSeq [ JSAlloc "main" $ Just $ JSFunction [] (
278− jsTailcall $ jsCall mainFun []
277+ jsTailcall mainFun []
280 , jsCall "main" []
279 , jsCall "main" []
@@ -497,14 +496,15 @@ translateExpression (SV var) =
498translateExpression (SApp tc name vars)
497translateExpression (SApp tc name vars)
499 | False <- tc =
498 | False <- tc =
500− jsTailcall $ translateFunctionCall name vars
499+ jsTailcall (translateFunctionCall name) (map JSVar vars)
501 | True <- tc =
500 | True <- tc =
502− JSNew (idrRTNamespace ++ "Tailcall") [JSFunction [] (
501+ JSNew (idrRTNamespace ++ "Tailcall")
503− JSReturn $ translateFunctionCall name vars
502+ [ JSRaw $ translateFunctionCall name
503+ , JSArray $ map JSVar vars
506− translateFunctionCall name vars =
506+ translateFunctionCall name =
507− jsCall (translateNamespace name ++ translateName name) (map JSVar vars)
507+ translateNamespace name ++ translateName name
509translateExpression (SOp op vars)
509translateExpression (SOp op vars)
510 | LNoOp <- op = JSVar (last vars)
510 | LNoOp <- op = JSVar (last vars)