@@ -848,57 +848,62 @@ elimDuplicateEvals (JSAlloc fun (Just (JSFunction args (JSSeq seq)))) =
848848
849849elimDuplicateEvals js = js
850850
851−optimizeEvalTailcalls :: JS -> JS
852−optimizeEvalTailcalls (JSApp (JSIdent "__IDRRT__tailcall") [
853− JSFunction [] (JSReturn (JSApp (JSIdent "__IDR__mEVAL0") args))
854− ]) = JSApp (JSIdent "__IDRRT__EVALTC") $ map optimizeEvalTailcalls args
851+optimizeEvalTailcalls :: (String, String) -> JS -> JS
852+optimizeEvalTailcalls (fun, tc) js =
853+ optHelper js
854+ where
855+ optHelper :: JS -> JS
856+ optHelper (JSApp (JSIdent "__IDRRT__tailcall") [
857+ JSFunction [] (JSReturn (JSApp (JSIdent n) args))
858+ ])
859+ | n == fun = JSApp (JSIdent tc) $ map optHelper args
855860
856−optimizeEvalTailcalls (JSFunction args body) =
857− JSFunction args $ optimizeEvalTailcalls body
861+ optHelper (JSFunction args body) =
862+ JSFunction args $ optHelper body
858863
859−optimizeEvalTailcalls (JSSeq seq) =
860− JSSeq $ map optimizeEvalTailcalls seq
864+ optHelper (JSSeq seq) =
865+ JSSeq $ map optHelper seq
861866
862−optimizeEvalTailcalls (JSReturn ret) =
863− JSReturn $ optimizeEvalTailcalls ret
867+ optHelper (JSReturn ret) =
868+ JSReturn $ optHelper ret
864869
865−optimizeEvalTailcalls (JSApp lhs rhs) =
866− JSApp (optimizeEvalTailcalls lhs) (map optimizeEvalTailcalls rhs)
870+ optHelper (JSApp lhs rhs) =
871+ JSApp (optHelper lhs) (map optHelper rhs)
867872
868−optimizeEvalTailcalls (JSNew con args) =
869− JSNew con $ map optimizeEvalTailcalls args
873+ optHelper (JSNew con args) =
874+ JSNew con $ map optHelper args
870875
871−optimizeEvalTailcalls (JSOp op lhs rhs) =
872− JSOp op (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
876+ optHelper (JSOp op lhs rhs) =
877+ JSOp op (optHelper lhs) (optHelper rhs)
873878
874−optimizeEvalTailcalls (JSProj obj field) =
875− JSProj (optimizeEvalTailcalls obj) field
879+ optHelper (JSProj obj field) =
880+ JSProj (optHelper obj) field
876881
877−optimizeEvalTailcalls (JSArray vals) =
878− JSArray $ map optimizeEvalTailcalls vals
882+ optHelper (JSArray vals) =
883+ JSArray $ map optHelper vals
879884
880−optimizeEvalTailcalls (JSAssign lhs rhs) =
881− JSAssign (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
885+ optHelper (JSAssign lhs rhs) =
886+ JSAssign (optHelper lhs) (optHelper rhs)
882887
883−optimizeEvalTailcalls (JSAlloc var (Just val)) =
884− JSAlloc var (Just $ optimizeEvalTailcalls val)
888+ optHelper (JSAlloc var (Just val)) =
889+ JSAlloc var (Just $ optHelper val)
885890
886−optimizeEvalTailcalls (JSIndex lhs rhs) =
887− JSIndex (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
891+ optHelper (JSIndex lhs rhs) =
892+ JSIndex (optHelper lhs) (optHelper rhs)
888893
889−optimizeEvalTailcalls (JSCond conds) =
890− JSCond $ map (optimizeEvalTailcalls *** optimizeEvalTailcalls) conds
894+ optHelper (JSCond conds) =
895+ JSCond $ map (optHelper *** optHelper) conds
891896
892−optimizeEvalTailcalls (JSTernary c t f) =
893− JSTernary (
894− optimizeEvalTailcalls c
895− ) (
896− optimizeEvalTailcalls t
897− ) (
898− optimizeEvalTailcalls f
899− )
897+ optHelper (JSTernary c t f) =
898+ JSTernary (
899+ optHelper c
900+ ) (
901+ optHelper t
902+ ) (
903+ optHelper f
904+ )
900905
901−optimizeEvalTailcalls js = js
906+ optHelper js = js
902907
903908reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
904909reduceLoop reduced (cons, program) =
@@ -1029,8 +1034,9 @@ codegenJavaScript target definitions filename outputType = do
10291034 deadElim = elimDeadLoop removeAlloc
10301035 inlined = inlineFunctions deadElim
10311036 elimDup = map elimDuplicateEvals inlined
1032− evalTC = map optimizeEvalTailcalls elimDup
1033− js = evalTC in
1037+ evalTC = map (optimizeEvalTailcalls ("__IDR__mEVAL0", "__IDRRT__EVALTC")) elimDup
1038+ applyTC = map (optimizeEvalTailcalls ("__IDR__mAPPLY0", "__IDRRT__APPLYTC")) evalTC
1039+ js = applyTC in
10341040 map compileJS js
10351041
10361042 mainLoop :: JS