summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adamc@hcoop.net>2009-09-19 15:59:22 -0400
committerGravatar Adam Chlipala <adamc@hcoop.net>2009-09-19 15:59:22 -0400
commit227518271107a924e0b45906626c4e3b50be3c51 (patch)
tree9c49713d79b4b07ee4913ea4e274cf65337ba067 /lib
parent8ba030d9f3ca612405f36db1fc6b1fbaa08448b2 (diff)
Plugged a JavaScript memory leak
Diffstat (limited to 'lib')
-rw-r--r--lib/js/urweb.js20
1 files changed, 12 insertions, 8 deletions
diff --git a/lib/js/urweb.js b/lib/js/urweb.js
index 638bb2b9..93822b17 100644
--- a/lib/js/urweb.js
+++ b/lib/js/urweb.js
@@ -189,6 +189,7 @@ function sc(v) {
}
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 @@ function runScripts(node) {
// 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 @@ function dyn(pnode, s) {
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)