@@ -210,18 +210,22 @@ jsLet name value body =
210210 )
211211 ) [value]
212212
213+jsSubst :: String -> [JS] -> JS -> [JS]
214+jsSubst _ [] _ = []
215+jsSubst var (x@(JSVar old) : xs) new
216+ | var == translateVariableName old = new : xs
217+ | otherwise = x : jsSubst var xs new
218+jsSubst _ xs _ = xs
219+
213220optimizeJS :: JS -> JS
214221optimizeJS (JSApp
215222 (JSFunction [arg] (JSReturn ret))
216223 [val]
217224 )
218225 | 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
226+ JSNew con [tag, JSArray $ jsSubst arg vals (optimizeJS val)]
227+ | JSApp (JSRaw tc@"__IDRRT__tailcall") [fun, JSArray args] <- ret =
228+ JSApp (JSRaw tc) [fun, JSArray $ jsSubst arg args (optimizeJS val)]
225229
226230optimizeJS (JSSeq seq) =
227231 JSSeq (map optimizeJS seq)
@@ -240,6 +244,9 @@ optimizeJS (JSAlloc name (Just js)) =
240244
241245optimizeJS js = js
242246
247+optJS :: Int -> JS -> JS
248+optJS c = foldr (.) id $ take c $ repeat optimizeJS
249+
243250codegenJavaScript
244251 :: JSTarget
245252 -> [(Name, SDecl)]
@@ -269,7 +276,7 @@ codegenJavaScript target definitions filename outputType = do
269276 def = map (first translateNamespace) definitions
270277
271278 functions :: [String]
272− functions = map (compileJS . optimizeJS . translateDeclaration) def
279+ functions = map (compileJS . optJS 1 . translateDeclaration) def
273280
274281 mainLoop :: String
275282 mainLoop = compileJS $