@@ -210,18 +210,22 @@ jsLet name value body =
211 ) [value]
211 ) [value]
213+jsSubst :: String -> [JS] -> JS -> [JS]
215+jsSubst var (x@(JSVar old) : xs) new
216+ | var == translateVariableName old = new : xs
217+ | otherwise = x : jsSubst var xs new
213optimizeJS :: JS -> JS
220optimizeJS :: JS -> JS
214optimizeJS (JSApp
221optimizeJS (JSApp
215 (JSFunction [arg] (JSReturn ret))
222 (JSFunction [arg] (JSReturn ret))
218 | JSNew con [tag, JSArray vals] <- ret =
225 | JSNew con [tag, JSArray vals] <- ret =
219− JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
226+ JSNew con [tag, JSArray $ jsSubst arg vals (optimizeJS val)]
220− where subst :: String -> [JS] -> JS -> [JS]
227+ | JSApp (JSRaw tc@"__IDRRT__tailcall") [fun, JSArray args] <- ret =
221− subst _ [] _ = []
228+ JSApp (JSRaw tc) [fun, JSArray $ jsSubst arg args (optimizeJS val)]
222− subst var (x@(JSVar old) : xs) new
223− | var == translateVariableName old = new : xs
224− | otherwise = x : subst var xs new
226optimizeJS (JSSeq seq) =
230optimizeJS (JSSeq seq) =
227 JSSeq (map optimizeJS seq)
231 JSSeq (map optimizeJS seq)
@@ -240,6 +244,9 @@ optimizeJS (JSAlloc name (Just js)) =
241optimizeJS js = js
245optimizeJS js = js
247+optJS :: Int -> JS -> JS
248+optJS c = foldr (.) id $ take c $ repeat optimizeJS
243codegenJavaScript
250codegenJavaScript
244 :: JSTarget
251 :: JSTarget
245 -> [(Name, SDecl)]
252 -> [(Name, SDecl)]
@@ -269,7 +276,7 @@ codegenJavaScript target definitions filename outputType = do
269 def = map (first translateNamespace) definitions
276 def = map (first translateNamespace) definitions
271 functions :: [String]
278 functions :: [String]
272− functions = map (compileJS . optimizeJS . translateDeclaration) def
279+ functions = map (compileJS . optJS 1 . translateDeclaration) def
274 mainLoop :: String
281 mainLoop :: String
275 mainLoop = compileJS $
282 mainLoop = compileJS $