@@ -218,43 +218,44 @@ jsLet name value body =
219 ) [value]
219 ) [value]
221−jsSubst :: String -> [JS] -> JS -> [JS]
221+jsSubst :: String -> JS -> JS -> JS
223−jsSubst var (x@(JSVar old) : xs) new
222+jsSubst var new (JSVar old)
224− | var == translateVariableName old = new : xs
223+ | var == translateVariableName old = new
225− | otherwise = x : jsSubst var xs new
228−optimizeJS :: JS -> JS
225+jsSubst var new (JSArray fields) =
226+ JSArray (map (jsSubst var new) fields)
230+optimizeJS :: JS -> JS
230optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
231optimizeJS (JSApp (JSFunction [] (JSSeq ret)) []) =
231 JSApp (JSFunction [] (JSSeq (map optimizeJS ret))) []
232 JSApp (JSFunction [] (JSSeq (map optimizeJS ret))) []
233optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
234optimizeJS (JSApp (JSFunction [arg] (JSReturn ret)) [val])
234− | JSNew con [tag, JSArray vals] <- ret =
235+ | JSNew con [tag, vals] <- ret =
235− JSNew con [tag, JSArray $ jsSubst arg vals (optimizeJS val)]
236+ JSNew con [tag, jsSubst arg (optimizeJS val) vals]
237 | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret =
238 | JSNew con [JSFunction [] (JSReturn (JSApp fun vars))] <- ret =
238 JSNew con [JSFunction [] (
239 JSNew con [JSFunction [] (
239− JSReturn $ JSApp fun (jsSubst arg vars (optimizeJS val))
240+ JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) vars)
242 | JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
243 | JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
243 JSReturn (JSApp fun args)
244 JSReturn (JSApp fun args)
244 )] <- ret =
245 )] <- ret =
245 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
246 JSApp (JSRaw "__IDRRT__tailcall") [JSFunction [] (
246− JSReturn $ JSApp fun (jsSubst arg args (optimizeJS val))
247+ JSReturn $ JSApp fun (map (jsSubst arg (optimizeJS val)) args)
249 | JSOp op lhs rhs <- ret =
250 | JSOp op lhs rhs <- ret =
250− JSOp op (head $ jsSubst arg [lhs] (optimizeJS val)) $
251+ JSOp op (jsSubst arg (optimizeJS val) lhs) $
251− (head $ jsSubst arg [rhs] (optimizeJS val))
252+ (jsSubst arg (optimizeJS val) rhs)
253 | JSIndex (JSProj obj field) idx <- ret =
254 | JSIndex (JSProj obj field) idx <- ret =
254 JSIndex (JSProj (
255 JSIndex (JSProj (
255− head $ jsSubst arg [obj] (optimizeJS val)
256+ jsSubst arg (optimizeJS val) obj
257− ) (head $ jsSubst arg [idx] (optimizeJS val))
258+ ) (jsSubst arg (optimizeJS val) idx)
259optimizeJS (JSAssign lhs rhs) =
260optimizeJS (JSAssign lhs rhs) =
260 JSAssign lhs (optimizeJS rhs)
261 JSAssign lhs (optimizeJS rhs)