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};