on master help sign in
javascript: refactor jsSubst
e5ad9f2raichoo
src/IRTS/CodegenJavaScript.hs+16−15
@@ -218,43 +218,44 @@ jsLet name value body =
218 )
218 )
219 ) [value]
219 ) [value]
220
220
221−jsSubst :: String -> [JS] -> JS -> [JS]
221+jsSubst :: String -> JS -> JS -> JS
222−jsSubst _ [] _ = []
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
226−jsSubst _ xs _ = xs
227
224
228−optimizeJS :: JS -> JS
225+jsSubst var new (JSArray fields) =
226+ JSArray (map (jsSubst var new) fields)
227+
228+jsSubst _ _ js = js
229
229
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))) []
232
233
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]
236
237
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)
240 )]
241 )]
241
242
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)
247 )]
248 )]
248
249
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)
252
253
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
256 ) field
257 ) field
257− ) (head $ jsSubst arg [idx] (optimizeJS val))
258+ ) (jsSubst arg (optimizeJS val) idx)
258
259
259optimizeJS (JSAssign lhs rhs) =
260optimizeJS (JSAssign lhs rhs) =
260 JSAssign lhs (optimizeJS rhs)
261 JSAssign lhs (optimizeJS rhs)