@@ -163,11 +163,9 @@ compileJS (JSTernary cond true false) =
163163 f = compileJS false in
164164 "(" ++ c ++ ")?(" ++ t ++ "):(" ++ f ++ ")"
165165
166−jsTailcall :: JS -> JS
167−jsTailcall call =
168− jsCall (idrRTNamespace ++ "tailcall") [
169− JSFunction [] (JSReturn call)
170− ]
166+jsTailcall :: String -> [JS] -> JS
167+jsTailcall fun args =
168+ jsCall (idrRTNamespace ++ "tailcall") [JSRaw fun, JSArray args]
171169
172170jsCall :: String -> [JS] -> JS
173171jsCall fun = JSApp (JSRaw fun)
@@ -214,15 +212,16 @@ jsLet name value body =
214212
215213optimizeJS :: JS -> JS
216214optimizeJS (JSApp
217− (JSFunction [arg] (JSReturn (JSNew con [tag, JSArray vals])))
215+ (JSFunction [arg] (JSReturn ret))
218216 [val]
219− ) =
220− JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
221− where subst :: String -> [JS] -> JS -> [JS]
222− subst _ [] _ = []
223− subst var (x@(JSVar old) : xs) new
224− | var == translateVariableName old = new : xs
225− | otherwise = x : subst var xs new
217+ )
218+ | JSNew con [tag, JSArray vals] <- ret =
219+ JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
220+ where subst :: String -> [JS] -> JS -> [JS]
221+ subst _ [] _ = []
222+ subst var (x@(JSVar old) : xs) new
223+ | var == translateVariableName old = new : xs
224+ | otherwise = x : subst var xs new
226225
227226optimizeJS (JSSeq seq) =
228227 JSSeq (map optimizeJS seq)
@@ -275,7 +274,7 @@ codegenJavaScript target definitions filename outputType = do
275274 mainLoop :: String
276275 mainLoop = compileJS $
277276 JSSeq [ JSAlloc "main" $ Just $ JSFunction [] (
278− jsTailcall $ jsCall mainFun []
277+ jsTailcall mainFun []
279278 )
280279 , jsCall "main" []
281280 ]
@@ -497,14 +496,15 @@ translateExpression (SV var) =
497496
498497translateExpression (SApp tc name vars)
499498 | False <- tc =
500− jsTailcall $ translateFunctionCall name vars
499+ jsTailcall (translateFunctionCall name) (map JSVar vars)
501500 | True <- tc =
502− JSNew (idrRTNamespace ++ "Tailcall") [JSFunction [] (
503− JSReturn $ translateFunctionCall name vars
504− )]
501+ JSNew (idrRTNamespace ++ "Tailcall")
502+ [ JSRaw $ translateFunctionCall name
503+ , JSArray $ map JSVar vars
504+ ]
505505 where
506− translateFunctionCall name vars =
507− jsCall (translateNamespace name ++ translateName name) (map JSVar vars)
506+ translateFunctionCall name =
507+ translateNamespace name ++ translateName name
508508
509509translateExpression (SOp op vars)
510510 | LNoOp <- op = JSVar (last vars)