@@ -848,6 +848,58 @@ 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
855+
856+optimizeEvalTailcalls (JSFunction args body) =
857+ JSFunction args $ optimizeEvalTailcalls body
858+
859+optimizeEvalTailcalls (JSSeq seq) =
860+ JSSeq $ map optimizeEvalTailcalls seq
861+
862+optimizeEvalTailcalls (JSReturn ret) =
863+ JSReturn $ optimizeEvalTailcalls ret
864+
865+optimizeEvalTailcalls (JSApp lhs rhs) =
866+ JSApp (optimizeEvalTailcalls lhs) (map optimizeEvalTailcalls rhs)
867+
868+optimizeEvalTailcalls (JSNew con args) =
869+ JSNew con $ map optimizeEvalTailcalls args
870+
871+optimizeEvalTailcalls (JSOp op lhs rhs) =
872+ JSOp op (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
873+
874+optimizeEvalTailcalls (JSProj obj field) =
875+ JSProj (optimizeEvalTailcalls obj) field
876+
877+optimizeEvalTailcalls (JSArray vals) =
878+ JSArray $ map optimizeEvalTailcalls vals
879+
880+optimizeEvalTailcalls (JSAssign lhs rhs) =
881+ JSAssign (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
882+
883+optimizeEvalTailcalls (JSAlloc var (Just val)) =
884+ JSAlloc var (Just $ optimizeEvalTailcalls val)
885+
886+optimizeEvalTailcalls (JSIndex lhs rhs) =
887+ JSIndex (optimizeEvalTailcalls lhs) (optimizeEvalTailcalls rhs)
888+
889+optimizeEvalTailcalls (JSCond conds) =
890+ JSCond $ map (optimizeEvalTailcalls *** optimizeEvalTailcalls) conds
891+
892+optimizeEvalTailcalls (JSTernary c t f) =
893+ JSTernary (
894+ optimizeEvalTailcalls c
895+ ) (
896+ optimizeEvalTailcalls t
897+ ) (
898+ optimizeEvalTailcalls f
899+ )
900+
901+optimizeEvalTailcalls js = js
902+
851903reduceLoop :: [String] -> ([JS], [JS]) -> [JS]
852904reduceLoop reduced (cons, program) =
853905 case partition findConstructors program of
@@ -976,7 +1028,9 @@ codegenJavaScript target definitions filename outputType = do
9761028 removeAlloc = map removeAllocations constrInit
9771029 deadElim = elimDeadLoop removeAlloc
9781030 inlined = inlineFunctions deadElim
979− js = map elimDuplicateEvals inlined in
1031+ elimDup = map elimDuplicateEvals inlined
1032+ evalTC = map optimizeEvalTailcalls elimDup
1033+ js = evalTC in
9801034 map compileJS js
9811035
9821036 mainLoop :: JS