@@ -848,6 +848,58 @@ elimDuplicateEvals (JSAlloc fun (Just (JSFunction args (JSSeq seq)))) =
849elimDuplicateEvals js = js
849elimDuplicateEvals js = js
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
856+optimizeEvalTailcalls (JSFunction args body) =
857+ JSFunction args $ optimizeEvalTailcalls body
859+optimizeEvalTailcalls (JSSeq seq) =
860+ JSSeq $ map optimizeEvalTailcalls seq
862+optimizeEvalTailcalls (JSReturn ret) =
863+ JSReturn $ optimizeEvalTailcalls ret
865+optimizeEvalTailcalls (JSApp lhs rhs) =
866+ JSApp (optimizeEvalTailcalls lhs) (map optimizeEvalTailcalls rhs)
868+optimizeEvalTailcalls (JSNew con args) =
869+ JSNew con $ map optimizeEvalTailcalls args
871+optimizeEvalTailcalls (JSOp op lhs rhs) =
872+ JSOp op (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
874+optimizeEvalTailcalls (JSProj obj field) =
875+ JSProj (optimizeEvalTailcalls obj) field
877+optimizeEvalTailcalls (JSArray vals) =
878+ JSArray $ map optimizeEvalTailcalls vals
880+optimizeEvalTailcalls (JSAssign lhs rhs) =
881+ JSAssign (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
883+optimizeEvalTailcalls (JSAlloc var (Just val)) =
884+ JSAlloc var (Just $ optimizeEvalTailcalls val)
886+optimizeEvalTailcalls (JSIndex lhs rhs) =
887+ JSIndex (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
889+optimizeEvalTailcalls (JSCond conds) =
890+ JSCond $ map (optimizeEvalTailcalls *** optimizeEvalTailcalls) conds
892+optimizeEvalTailcalls (JSTernary c t f) =
894+ optimizeEvalTailcalls c
896+ optimizeEvalTailcalls t
898+ optimizeEvalTailcalls f
901+optimizeEvalTailcalls js = js
851reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
903reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
852reduceLoop reduced (cons, program) =
904reduceLoop reduced (cons, program) =
853 case partition findConstructors program of
905 case partition findConstructors program of
@@ -976,7 +1028,9 @@ codegenJavaScript target definitions filename outputType = do
976 removeAlloc = map removeAllocations constrInit
1028 removeAlloc = map removeAllocations constrInit
977 deadElim = elimDeadLoop removeAlloc
1029 deadElim = elimDeadLoop removeAlloc
978 inlined = inlineFunctions deadElim
1030 inlined = inlineFunctions deadElim
979− js = map elimDuplicateEvals inlined in
1031+ elimDup = map elimDuplicateEvals inlined
1032+ evalTC = map optimizeEvalTailcalls elimDup
980 map compileJS js
1034 map compileJS js
982 mainLoop :: JS
1036 mainLoop :: JS