on master help sign in
javascript: tailcalls without exceptions
commit10f1d1ee57c47440c76a5751982d3d580593f906 authorraichoo <raichoo@googlemail.com> dateFri 11 Jan 2013, 21:44 (14 years ago) parent468f0d5
1 file changed+6−8
src/IRTS/CodegenJavaScript.hs+6−8
src/IRTS/CodegenJavaScript.hs+6−8
@@ -52,16 +52,14 @@ idrRuntime =
5252 , "{this.i = i;this.name = name;this.vars = vars;};\n"
5353 , "__IDR__.tailcall = function(f){\n"
5454 ++ "var __f = f;\n"
55− ++ "while (__f) {\ntry {\n"
55+ ++ "while (__f) {\n"
5656 ++ "var f = __f;\n"
5757 ++ "__f = null;\n"
58− ++ "return f();"
59− ++ "\n} catch(ex) {\n"
60− ++ "if (ex instanceof __IDR__.Tailcall) {\n"
61− ++ "__f = ex.f;"
58+ ++ "var ret = f();\n"
59+ ++ "if (ret instanceof __IDR__.Tailcall) {\n"
60+ ++ "__f = ret.f;"
6261 ++ "\n} else {\n"
63− ++ "throw ex;"
64− ++ "\n}"
62+ ++ "return ret;"
6563 ++ "\n}"
6664 ++ "\n}"
6765 ++ "\n}"
@@ -198,7 +196,7 @@ translateExpression modname (SApp False name vars) =
198196
199197translateExpression modname (SApp True name vars) =
200198 "(function(){\n"
201− ++ "throw new __IDR__.Tailcall("
199+ ++ "return new __IDR__.Tailcall("
202200 ++ "function(){\n"
203201 ++ "return " ++ translateFunctionCall name vars
204202 ++ ";\n});"