on master help sign in
javascript: optimize apply tailcalls
commit6a1e21ea8e52acf6e1a41a3fffe5e375e335fd20 authorraichoo <raichoo@googlemail.com> dateWed 29 Jan 2014, 22:15 (13 years ago) parentdac0a39
2 files changed+54−39
jsrts/Runtime-common.js+9 src/IRTS/CodegenJavaScript.hs+45−39
jsrts/Runtime-common.js+9
@@ -57,3 +57,12 @@ var __IDRRT__EVALTC = function(arg0) {
5757
5858 return ret;
5959};
60+
61+var __IDRRT__APPLYTC = function(fn0, arg0) {
62+ var ev = __IDRRT__EVALTC(fn0);
63+ var ret = (ev instanceof __IDRRT__Con && __IDRLT__mAPPLY0[ev.tag])?(__IDRLT__mAPPLY0[ev.tag](fn0,arg0,ev)):(null)
64+ while (ret instanceof __IDRRT__Cont)
65+ ret = ret.k();
66+
67+ return ret;
68+}
src/IRTS/CodegenJavaScript.hs+45−39
@@ -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