# HG changeset patch # User Adam Chlipala # Date 1425827548 14400 # Node ID e0843b2a636df70a9bc33a42a08e47270603450f # Parent 248e2b32954b656cb4a6af7a4f2f5b385b0fccfe Make flattening of reactive HTML trees iterative instead of recursive, to avoid stack overflows diff -r 248e2b32954b -r e0843b2a636d lib/js/urweb.js --- a/lib/js/urweb.js Sun Mar 08 11:05:54 2015 -0400 +++ b/lib/js/urweb.js Sun Mar 08 11:12:28 2015 -0400 @@ -636,21 +636,25 @@ return closures[n]; } -function flattenAcc(a, cls, tr) { - if (tr.cat1 != null) { - flattenAcc(a, cls, tr.cat1); - flattenAcc(a, cls, tr.cat2); - } else if (tr.closure != null) { - var cl = newClosure(tr.closure); - cls.v = cons(cl, cls.v); - a.push("cr(", cl.toString(), ")"); - } else - a.push(tr); +function flattenAcc(a, cls, trs) { + while (trs) { + var tr = trs.data; + trs = trs.next; + + if (tr.cat1 != null) { + trs = cons(tr.cat1, cons(tr.cat2, trs)); + } else if (tr.closure != null) { + var cl = newClosure(tr.closure); + cls.v = cons(cl, cls.v); + a.push("cr(", cl.toString(), ")"); + } else + a.push(tr); + } } function flatten(cls, tr) { var a = []; - flattenAcc(a, cls, tr); + flattenAcc(a, cls, cons(tr, null)); return a.join(""); }