diff --git a/effekt/shared/src/main/scala/effekt/generator/js/TransformerCps.scala b/effekt/shared/src/main/scala/effekt/generator/js/TransformerCps.scala index 1d7ea0920..38049f365 100644 --- a/effekt/shared/src/main/scala/effekt/generator/js/TransformerCps.scala +++ b/effekt/shared/src/main/scala/effekt/generator/js/TransformerCps.scala @@ -300,8 +300,7 @@ object TransformerCps extends Transformer { } case cps.Stmt.Jump(k, vargs, ks) => - pure(js.Return(maybeThunking(js.Call(nameRef(k), - vargs.map(toJS) ++ List(toJS(ks))))) :: Nil) + pure(List(js.Return(js.Call(js.Variable(js.JSName("THUNK_K")), nameRef(k) :: vargs.map(toJS) ++ List(toJS(ks)))))) case cps.Stmt.App(Recursive(id, label, vparams, bparams, ks1, k1, used), vargs, bargs, MetaCont(ks), k) => diff --git a/libraries/js/effekt_runtime.js b/libraries/js/effekt_runtime.js index bb149178d..ce9d965f7 100644 --- a/libraries/js/effekt_runtime.js +++ b/libraries/js/effekt_runtime.js @@ -135,6 +135,27 @@ function RESUME(cont, c, ks, k) { return () => c(meta, k1) } +let _depth = 0 + +function THUNK_K(k, v, ks) { + const threshold = 512 + if (_depth >= threshold) { + return () => k(v, ks) + } else { + _depth += 1 + return k(v, ks) + } +} + +function THUNK(prog) { + if (_depth >= threshold) { + return () => prog() + } else { + _depth += 1 + return prog() + } +} + function RUN_TOPLEVEL(comp) { try { let a = comp(TOPLEVEL_KS, TOPLEVEL_K)