on master help sign in
javascript: tailcalls without exceptions
10f1d1eraichoo
src/IRTS/CodegenJavaScript.hs+6−8
@@ -52,16 +52,14 @@ idrRuntime =
52 , "{this.i = i;this.name = name;this.vars = vars;};\n"
52 , "{this.i = i;this.name = name;this.vars = vars;};\n"
53 , "__IDR__.tailcall = function(f){\n"
53 , "__IDR__.tailcall = function(f){\n"
54 ++ "var __f = f;\n"
54 ++ "var __f = f;\n"
55− ++ "while (__f) {\ntry {\n"
55+ ++ "while (__f) {\n"
56 ++ "var f = __f;\n"
56 ++ "var f = __f;\n"
57 ++ "__f = null;\n"
57 ++ "__f = null;\n"
58− ++ "return f();"
58+ ++ "var ret = f();\n"
59− ++ "\n} catch(ex) {\n"
60− ++ "if (ex instanceof __IDR__.Tailcall) {\n"
59+ ++ "if (ret instanceof __IDR__.Tailcall) {\n"
61− ++ "__f = ex.f;"
60+ ++ "__f = ret.f;"
62 ++ "\n} else {\n"
61 ++ "\n} else {\n"
63− ++ "throw ex;"
62+ ++ "return ret;"
64− ++ "\n}"
65 ++ "\n}"
63 ++ "\n}"
66 ++ "\n}"
64 ++ "\n}"
67 ++ "\n}"
65 ++ "\n}"
@@ -198,7 +196,7 @@ translateExpression modname (SApp False name vars) =
198
196
199translateExpression modname (SApp True name vars) =
197translateExpression modname (SApp True name vars) =
200 "(function(){\n"
198 "(function(){\n"
201− ++ "throw new __IDR__.Tailcall("
199+ ++ "return new __IDR__.Tailcall("
202 ++ "function(){\n"
200 ++ "function(){\n"
203 ++ "return " ++ translateFunctionCall name vars
201 ++ "return " ++ translateFunctionCall name vars
204 ++ ";\n});"
202 ++ ";\n});"