Mercurial > urweb
comparison lib/js/urweb.js @ 2129:e0843b2a636d
Make flattening of reactive HTML trees iterative instead of recursive, to avoid stack overflows
author | Adam Chlipala <adam@chlipala.net> |
---|---|
date | Sun, 08 Mar 2015 11:12:28 -0400 |
parents | 248e2b32954b |
children | e8863d9f8c59 |
comparison
equal
deleted
inserted
replaced
2128:248e2b32954b | 2129:e0843b2a636d |
---|---|
634 | 634 |
635 function cr(n) { | 635 function cr(n) { |
636 return closures[n]; | 636 return closures[n]; |
637 } | 637 } |
638 | 638 |
639 function flattenAcc(a, cls, tr) { | 639 function flattenAcc(a, cls, trs) { |
640 if (tr.cat1 != null) { | 640 while (trs) { |
641 flattenAcc(a, cls, tr.cat1); | 641 var tr = trs.data; |
642 flattenAcc(a, cls, tr.cat2); | 642 trs = trs.next; |
643 } else if (tr.closure != null) { | 643 |
644 var cl = newClosure(tr.closure); | 644 if (tr.cat1 != null) { |
645 cls.v = cons(cl, cls.v); | 645 trs = cons(tr.cat1, cons(tr.cat2, trs)); |
646 a.push("cr(", cl.toString(), ")"); | 646 } else if (tr.closure != null) { |
647 } else | 647 var cl = newClosure(tr.closure); |
648 a.push(tr); | 648 cls.v = cons(cl, cls.v); |
649 a.push("cr(", cl.toString(), ")"); | |
650 } else | |
651 a.push(tr); | |
652 } | |
649 } | 653 } |
650 | 654 |
651 function flatten(cls, tr) { | 655 function flatten(cls, tr) { |
652 var a = []; | 656 var a = []; |
653 flattenAcc(a, cls, tr); | 657 flattenAcc(a, cls, cons(tr, null)); |
654 return a.join(""); | 658 return a.join(""); |
655 } | 659 } |
656 | 660 |
657 function flattenLocal(s) { | 661 function flattenLocal(s) { |
658 var cls = {v : null}; | 662 var cls = {v : null}; |