@@ -254,15 +254,29 @@ jsSubst var new (JSReturn ret) =
255jsSubst _ _ js = js
255jsSubst _ _ js = js
257−inlineAble :: JS -> Bool
257+inlineAble :: Bool -> JS -> JS -> Bool
258−inlineAble (JSNew con [tag, args]) = True
258+inlineAble _ (JSNew con [tag, args]) _ = True
259−inlineAble (JSApp (JSRaw "__IDRRT__tailcall") _) = False
260−inlineAble JSNull = True
259+inlineAble _ JSNull _ = True
261−inlineAble (JSString _) = True
260+inlineAble _ (JSString _) _ = True
262−inlineAble (JSType _) = True
261+inlineAble _ (JSType _) _ = True
263−inlineAble (JSNum _) = True
262+inlineAble _ (JSNum _) _ = True
264−inlineAble (JSApp (JSRaw "__IDRRT__bigInt") _) = True
263+inlineAble _ (JSApp (JSRaw "__IDRRT__bigInt") _) _ = True
264+inlineAble insideTC (JSApp (JSRaw "__IDRRT__tailcall") _) into =
265+ not insideTC && not (doesTailcall into)
267+ doesTailcall :: JS -> Bool
268+ doesTailcall (JSApp (JSRaw "__IDRRT__tailcall") _) = True
269+ doesTailcall (JSApp (JSRaw _) args) = any id (map doesTailcall args)
270+ doesTailcall (JSApp f args) = doesTailcall f || any id (map doesTailcall args)
271+ doesTailcall (JSReturn ret) = doesTailcall ret
272+ doesTailcall (JSFunction [_] body) = doesTailcall body
273+ doesTailcall (JSNew _ [tag, args]) = doesTailcall args
274+ doesTailcall (JSNew _ [JSFunction [] body]) = doesTailcall body
275+ doesTailcall (JSArray vals) = any id (map doesTailcall vals)
276+ doesTailcall (JSVar _) = False
277+ doesTailcall _ = True
265−inlineAble _ = False
279+inlineAble _ _ _ = False
267optimizeJS :: JS -> JS
281optimizeJS :: JS -> JS
268optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
282optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
@@ -271,12 +285,12 @@ optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
271optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
285optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
272 | JSNew con [tag, vals] <- ret
286 | JSNew con [tag, vals] <- ret
273 , opt <- optimizeJS val
287 , opt <- optimizeJS val
274− , inlineAble opt =
288+ , inlineAble False opt vals =
275 JSNew con [tag, jsSubst arg opt vals]
289 JSNew con [tag, jsSubst arg opt vals]
277 | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret
291 | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret
278 , opt <- optimizeJS val
292 , opt <- optimizeJS val
279− , inlineAble opt =
293+ , all id $ map (inlineAble False opt) vars =
280 JSNew con [JSFunction [] (
294 JSNew con [JSFunction [] (
281 JSReturn $ JSApp fun (map (jsSubst arg opt) vars)
295 JSReturn $ JSApp fun (map (jsSubst arg opt) vars)
@@ -285,17 +299,18 @@ optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
285 JSReturn (JSApp fun args)
299 JSReturn (JSApp fun args)
286 )] <- ret
300 )] <- ret
287 , opt <- optimizeJS val
301 , opt <- optimizeJS val
288− , inlineAble opt =
302+ , all id $ map (inlineAble True opt) args =
289 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
303 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
290 JSReturn $ JSApp fun (map (jsSubst arg opt) args)
304 JSReturn $ JSApp fun (map (jsSubst arg opt) args)
293 | JSApp (JSFunction [x] (JSReturn body)) [y] <- ret
307 | JSApp (JSFunction [x] (JSReturn body)) [y] <- ret
294− , opt <- optimizeJS val
308+ , opt <- optimizeJS val
309+ , optBody <- optimizeJS body
295− , inlineAble opt =
310+ , inlineAble False opt optBody =
296 optimizeJS (
311 optimizeJS (
297 JSApp (JSFunction [x] $
312 JSApp (JSFunction [x] $
298− JSReturn $ jsSubst arg opt (optimizeJS body)
313+ JSReturn $ jsSubst arg opt optBody