diff lib/js/urweb.js @ 967:1b80b9df0d32

Plugged a JavaScript memory leak
author Adam Chlipala <adamc@hcoop.net>
date Sat, 19 Sep 2009 15:59:22 -0400
parents 8c37699de273
children 001edfbe2561
line wrap: on
line diff
--- a/lib/js/urweb.js	Sat Sep 19 14:56:03 2009 -0400
+++ b/lib/js/urweb.js	Sat Sep 19 15:59:22 2009 -0400
@@ -189,6 +189,7 @@
 }
 function sv(s, v) {
   s.data = v;
+
   for (var ls = s.dyns; ls; ls = ls.next)
     if (!ls.dead)
       populate(ls.data);
@@ -262,6 +263,14 @@
 
 // Dynamic tree entry points
 
+function killScript(scr) {
+  scr.dead = true;
+  for (var ls = scr.sources; ls; ls = ls.next)
+    ls.data.dyns = remove(scr, ls.data.dyns);
+  for (var ls = scr.closures; ls; ls = ls.next)
+    freeClosure(ls.data);
+}
+
 function dyn(pnode, s) {
   var x = document.createElement("script");
   x.dead = false;
@@ -278,16 +287,11 @@
     var next;
     for (var child = firstChild; child && child != x; child = next) {
       next = child.nextSibling;
+      killScript(child);
       if (child.getElementsByTagName) {
         var arr = child.getElementsByTagName("script");
-        for (var i = 0; i < arr.length; ++i) {
-          var span = arr[i];
-          span.dead = true;
-          for (var ls = span.sources; ls; ls = ls.next)
-            ls.data.dyns = remove(span, ls.data.dyns);
-          for (var ls = span.closures; ls; ls = ls.next)
-            freeClosure(ls.data);
-        }
+        for (var i = 0; i < arr.length; ++i)
+          killScript(arr[i]);
       }
 
       if (child.parentNode)