@@ -694,106 +694,17 @@ inlineFunctions :: [JS] -> [JS]
694694inlineFunctions js =
695695 let funs = collectFunctions js
696696 occurences = map ((id . fst) &&& countAll js) funs in
697− inlineSingleOccur occurences $ removeDeadFunctions occurences js
697+ removeDeadFunctions occurences js
698698 where
699699 removeDeadFunctions :: [(String, (Int, JS))] -> [JS] -> [JS]
700700 removeDeadFunctions _ [] = []
701701 removeDeadFunctions funOccur ((JSAlloc fun (Just (JSFunction _ _))):js)
702702 | Just (o, _) <- lookup fun funOccur
703− , o == 0 || o == 1 = removeDeadFunctions funOccur js
703+ , o == 0 = removeDeadFunctions funOccur js
704704
705705 removeDeadFunctions funOccur (j:js) = j : removeDeadFunctions funOccur js
706706
707707
708− inlineSingleOccur :: [(String, (Int, JS))] -> [JS] -> [JS]
709− inlineSingleOccur occur js =
710− let funs = map (id *** snd) $ filter ((== 1) . fst . snd) occur in
711− inlineHelper funs js
712−
713−
714− inlineHelper :: [(String, JS)] -> [JS] -> [JS]
715− inlineHelper [] js = js
716− inlineHelper ((name, fun):funs) js =
717− let njs = map (inlineFun name fun) js
718− nfuns = map (id *** (inlineFun name fun)) funs in
719− inlineHelper nfuns njs
720−
721−
722− inlineArgs args vals js =
723− let (njs, vars) = putPlaceHolders args 0 js in
724− inlineArgsHelper (map (("__repvar_" ++) . show) [0 .. vars - 1]) vals njs
725−
726− where
727− inlineArgsHelper :: [String] -> [JS] -> JS -> JS
728− inlineArgsHelper [] _ js = js
729− inlineArgsHelper (a:as) (v:vs) js = jsSubst a v (inlineArgsHelper as vs js)
730−
731−
732− putPlaceHolders :: [String] -> Int -> JS -> (JS, Int)
733− putPlaceHolders [] n js = (js, n)
734− putPlaceHolders (a:as) n js
735− | (njs, nn) <- putPlaceHolders as (n + 1) js =
736− (jsSubst a (JSIdent ("__repvar_" ++ show n)) njs, nn)
737−
738−
739− inlineFun :: String -> JS -> JS -> JS
740− inlineFun name (JSFunction args (JSReturn js)) (JSApp (JSIdent lhs) rhs)
741− | name == lhs = inlineArgs args rhs js
742−
743− inlineFun name (JSFunction args (JSSeq js)) (JSReturn (JSApp (JSIdent lhs) rhs))
744− | name == lhs = JSSeq $ map (inlineArgs args rhs) js
745−
746− inlineFun name (JSFunction args (JSSeq js)) (JSApp (JSIdent lhs) rhs)
747− | name == lhs = JSSeq $ map (inlineArgs args rhs) js
748−
749− inlineFun name fun (JSFunction args body) =
750− JSFunction args (inlineFun name fun body)
751−
752− inlineFun name fun (JSSeq seq) =
753− JSSeq $ map (inlineFun name fun) seq
754−
755− inlineFun name fun (JSReturn ret) =
756− JSReturn $ inlineFun name fun ret
757−
758− inlineFun name fun (JSApp lhs rhs) =
759− JSApp (inlineFun name fun lhs) $ map (inlineFun name fun) rhs
760−
761− inlineFun name fun (JSNew con args) =
762− JSNew con $ map (inlineFun name fun) args
763−
764− inlineFun name fun (JSOp op lhs rhs) =
765− JSOp op (inlineFun name fun lhs) (inlineFun name fun rhs)
766−
767− inlineFun name fun (JSProj obj field) =
768− JSProj (inlineFun name fun obj) field
769−
770− inlineFun name fun (JSArray vals) =
771− JSArray $ map (inlineFun name fun) vals
772−
773− inlineFun name fun (JSAssign lhs rhs) =
774− JSAssign (inlineFun name fun lhs) (inlineFun name fun rhs)
775−
776− inlineFun name fun (JSAlloc var (Just val)) =
777− JSAlloc var (Just $ inlineFun name fun val)
778−
779− inlineFun name fun (JSIndex lhs rhs) =
780− JSIndex (inlineFun name fun lhs) (inlineFun name fun rhs)
781−
782− inlineFun name fun (JSCond conds) =
783− JSCond $ map (inlineFun name fun *** inlineFun name fun) conds
784−
785− inlineFun name fun (JSTernary c t f) =
786− JSTernary (
787− inlineFun name fun c
788− ) (
789− inlineFun name fun t
790− ) (
791− inlineFun name fun f
792− )
793−
794− inlineFun name fun js = js
795−
796−
797708 collectFunctions :: [JS] -> [(String, JS)]
798709 collectFunctions js =
799710 catMaybes $ map collectHelper js