@@ -766,9 +766,9 @@ elimDuplicateEvals (JSAlloc fun (Just (JSFunction args (JSSeq seq)))) =
766elimDuplicateEvals js = js
766elimDuplicateEvals js = js
769−optimizeEvalTailcalls :: (String, String) -> JS -> JS
769+optimizeRuntimeCalls :: String -> String -> [JS] -> [JS]
770−optimizeEvalTailcalls (fun, tc) js =
770+optimizeRuntimeCalls fun tc js =
771− optHelper js
771+ optTC tc : map optHelper js
773 optHelper :: JS -> JS
773 optHelper :: JS -> JS
774 optHelper (JSApp (JSIdent "__IDRRT__tailcall") [
774 optHelper (JSApp (JSIdent "__IDRRT__tailcall") [
@@ -779,6 +779,62 @@ optimizeEvalTailcalls (fun, tc) js =
779 optHelper js = transformJS optHelper js
779 optHelper js = transformJS optHelper js
782+ optTC :: String -> JS
783+ optTC tc@"__IDRRT__EVALTC" =
784+ JSAlloc tc (Just $ JSFunction ["arg0"] (
785+ JSSeq [ JSAlloc "ret" $ Just (
787+ (JSIdent "arg0" `jsInstanceOf` jsCon) `jsAnd`
788+ (hasProp "__IDRLT__mEVAL0" "arg0")
791+ (JSIdent "__IDRLT__mEVAL0")
792+ (JSProj (JSIdent "arg0") "tag")
797+ , JSWhile (JSIdent "ret" `jsInstanceOf` (JSIdent "__IDRRT__Cont")) (
798+ JSAssign (JSIdent "ret") (
799+ JSApp (JSProj (JSIdent "ret") "k") []
802+ , JSReturn $ JSIdent "ret"
806+ optTC tc@"__IDRRT__APPLYTC" =
807+ JSAlloc tc (Just $ JSFunction ["fn0", "arg0"] (
808+ JSSeq [ JSAlloc "ev" $ Just (JSApp
809+ (JSIdent "__IDRRT__EVALTC") [JSIdent "fn0"]
811+ , JSAlloc "ret" $ Just (
813+ (JSIdent "ev" `jsInstanceOf` jsCon) `jsAnd`
814+ (hasProp "__IDRLT__mAPPLY0" "ev")
817+ (JSIdent "__IDRLT__mAPPLY0")
818+ (JSProj (JSIdent "ev") "tag")
820+ [JSIdent "fn0", JSIdent "arg0", JSIdent "ev"]
823+ , JSWhile (JSIdent "ret" `jsInstanceOf` (JSIdent "__IDRRT__Cont")) (
824+ JSAssign (JSIdent "ret") (
825+ JSApp (JSProj (JSIdent "ret") "k") []
828+ , JSReturn $ JSIdent "ret"
833+ hasProp :: String -> String -> JS
835+ JSIndex (JSIdent table) (JSProj (JSIdent var) "tag")
782unfoldLookupTable :: [JS] -> [JS]
838unfoldLookupTable :: [JS] -> [JS]
783unfoldLookupTable input =
839unfoldLookupTable input =
784 let (evals, evalunfold) = unfoldLT "__IDRLT__mEVAL0" input
840 let (evals, evalunfold) = unfoldLT "__IDRLT__mEVAL0" input
@@ -967,8 +1023,8 @@ codegenJavaScript target definitions filename outputType = do
967 , map removeAllocations
1023 , map removeAllocations
968 , elimDeadLoop
1024 , elimDeadLoop
969 , map elimDuplicateEvals
1025 , map elimDuplicateEvals
970− , map (optimizeEvalTailcalls ("__IDR__mEVAL0", "__IDRRT__EVALTC"))
1026+ , optimizeRuntimeCalls "__IDR__mEVAL0" "__IDRRT__EVALTC"
971− , map (optimizeEvalTailcalls ("__IDR__mAPPLY0", "__IDRRT__APPLYTC"))
1027+ , optimizeRuntimeCalls "__IDR__mAPPLY0" "__IDRRT__APPLYTC"
972 , map removeInstanceChecks
1028 , map removeInstanceChecks
973 , inlineFunctions
1029 , inlineFunctions
974 , map reduceContinuations
1030 , map reduceContinuations