on master help sign in
javascript: add naive optimizer
e391db0raichoo
src/IRTS/CodegenJavaScript.hs+30−1
@@ -212,6 +212,35 @@ jsLet name value body =
212 )
212 )
213 ) [value]
213 ) [value]
214
214
215+optimizeJS :: JS -> JS
216+optimizeJS (JSApp
217+ (JSFunction [arg] (JSReturn (JSNew con [tag, JSArray vals])))
218+ [val]
219+ ) =
220+ JSNew con [tag, JSArray $ subst arg vals (optimizeJS val)]
221+ where subst :: String -> [JS] -> JS -> [JS]
222+ subst _ [] _ = []
223+ subst var (x@(JSVar old) : xs) new
224+ | var == translateVariableName old = new : xs
225+ | otherwise = x : subst var xs new
226+
227+optimizeJS (JSSeq seq) =
228+ JSSeq (map optimizeJS seq)
229+
230+optimizeJS (JSFunction args body) =
231+ JSFunction args (optimizeJS body)
232+
233+optimizeJS (JSApp fun args) =
234+ JSApp (optimizeJS fun) (map optimizeJS args)
235+
236+optimizeJS (JSReturn js) =
237+ JSReturn $ optimizeJS js
238+
239+optimizeJS (JSAlloc name (Just js)) =
240+ JSAlloc name (Just $ optimizeJS js)
241+
242+optimizeJS js = js
243+
215codegenJavaScript
244codegenJavaScript
216 :: JSTarget
245 :: JSTarget
217 -> [(Name, SDecl)]
246 -> [(Name, SDecl)]
@@ -241,7 +270,7 @@ codegenJavaScript target definitions filename outputType = do
241 def = map (first translateNamespace) definitions
270 def = map (first translateNamespace) definitions
242
271
243 functions :: [String]
272 functions :: [String]
244− functions = map (compileJS . translateDeclaration) def
273+ functions = map (compileJS . optimizeJS . translateDeclaration) def
245
274
246 mainLoop :: String
275 mainLoop :: String
247 mainLoop = compileJS $
276 mainLoop = compileJS $