@@ -243,37 +243,76 @@ jsSubst var new (JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
243243 JSReturn $ JSApp fun (map (jsSubst var new) args)
244244 )]
245245
246+jsSubst var new (JSApp (JSFunction [arg] body) vals)
247+ | var /= arg =
248+ JSApp (JSFunction [arg] (
249+ jsSubst var new body
250+ )) $ map (jsSubst var new) vals
251+
252+jsSubst var new (JSReturn ret) =
253+ JSReturn $ jsSubst var new ret
254+
246255jsSubst _ _ js = js
247256
257+inlineAble :: JS -> Bool
258+inlineAble (JSNew con [tag, args]) = True
259+inlineAble (JSApp (JSRaw "__IDRRT__tailcall") _) = False
260+inlineAble JSNull = True
261+inlineAble (JSString _) = True
262+inlineAble (JSType _) = True
263+inlineAble (JSNum _) = True
264+inlineAble (JSApp (JSRaw "__IDRRT__bigInt") _) = True
265+inlineAble _ = False
266+
248267optimizeJS :: JS -> JS
249268optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
250269 JSApp (JSFunction [] (JSSeq (map optimizeJS ret))) []
251270
252271optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
253− | JSNew con [tag, vals] <- ret =
254− JSNew con [tag, jsSubst arg (optimizeJS val) vals]
255−
256− | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret =
272+ | JSNew con [tag, vals] <- ret
273+ , opt <- optimizeJS val
274+ , inlineAble opt =
275+ JSNew con [tag, jsSubst arg opt vals]
276+
277+ | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret
278+ , opt <- optimizeJS val
279+ , inlineAble opt =
257280 JSNew con [JSFunction [] (
258− JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) vars)
281+ JSReturn $ JSApp fun (map (jsSubst arg opt) vars)
259282 )]
260283
261284 | JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
262285 JSReturn (JSApp fun args)
263− )] <- ret =
286+ )] <- ret
287+ , opt <- optimizeJS val
288+ , inlineAble opt =
264289 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
265− JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) args)
290+ JSReturn $ JSApp fun (map (jsSubst arg opt) args)
266291 )]
267292
293+ | JSApp (JSFunction [x] (JSReturn body)) [y] <- ret
294+ , opt <- optimizeJS val
295+ , inlineAble opt =
296+ optimizeJS (
297+ JSApp (JSFunction [x] $
298+ JSReturn $ jsSubst arg opt (optimizeJS body)
299+ ) [y]
300+ )
301+
302+ | JSIndex (JSProj obj field) idx <- ret
303+ , opt <- optimizeJS val =
304+ JSIndex (JSProj (
305+ jsSubst arg opt obj
306+ ) field
307+ ) (jsSubst arg opt idx)
308+
268309 | JSOp op lhs rhs <- ret =
269310 JSOp op (jsSubst arg (optimizeJS val) lhs) $
270311 (jsSubst arg (optimizeJS val) rhs)
271312
272− | JSIndex (JSProj obj field) idx <- ret =
273− JSIndex (JSProj (
274− jsSubst arg (optimizeJS val) obj
275− ) field
276− ) (jsSubst arg (optimizeJS val) idx)
313+
314+optimizeJS (JSApp fun args) =
315+ JSApp (optimizeJS fun) (map optimizeJS args)
277316
278317optimizeJS (JSAssign lhs rhs) =
279318 JSAssign lhs (optimizeJS rhs)
@@ -287,9 +326,6 @@ optimizeJS (JSFunction args body) =
287326optimizeJS (JSProj (JSFunction args body) "apply") =
288327 JSProj (JSFunction args (optimizeJS body)) "apply"
289328
290−optimizeJS (JSApp fun args) =
291− JSApp (optimizeJS fun) (map optimizeJS args)
292−
293329optimizeJS (JSReturn js) =
294330 JSReturn $ optimizeJS js
295331