[pure-lang-svn] SF.net SVN: pure-lang:[477] pure/trunk
Status: Beta
Brought to you by:
agraef
|
From: <ag...@us...> - 2008-08-12 23:49:18
|
Revision: 477
http://pure-lang.svn.sourceforge.net/pure-lang/?rev=477&view=rev
Author: agraef
Date: 2008-08-12 23:49:27 +0000 (Tue, 12 Aug 2008)
Log Message:
-----------
Move check for uncollected temporaries after an exception to the toplevel.
Modified Paths:
--------------
pure/trunk/ChangeLog
pure/trunk/interpreter.cc
pure/trunk/runtime.cc
Modified: pure/trunk/ChangeLog
===================================================================
--- pure/trunk/ChangeLog 2008-08-12 19:20:37 UTC (rev 476)
+++ pure/trunk/ChangeLog 2008-08-12 23:49:27 UTC (rev 477)
@@ -1,3 +1,11 @@
+2008-08-13 Albert Graef <Dr....@t-...>
+
+ * runtime.cc (pure_catch, pure_invoke): Collecting temporary
+ values after an exception doesn't seem to be safe while an
+ evaluation is still in progress. Moved this to doeval/dodefn in
+ interpreter.cc where we're back at the toplevel and it is safe to
+ do this.
+
2008-08-12 Albert Graef <Dr....@t-...>
* runtime.cc/h, lib/system.pure: Add 'trap' operation to configure
Modified: pure/trunk/interpreter.cc
===================================================================
--- pure/trunk/interpreter.cc 2008-08-12 19:20:37 UTC (rev 476)
+++ pure/trunk/interpreter.cc 2008-08-12 23:49:27 UTC (rev 477)
@@ -3201,6 +3201,22 @@
else
fptr->refc--;
fptr = save_fptr;
+ if (!res) {
+ // collect garbage
+ pure_expr *t = tmps;
+ while (t) {
+ pure_expr *next = t->xp;
+ pure_freenew(t);
+ t = next;
+ }
+ }
+#if DEBUG>1
+ pure_expr *t = tmps;
+ while (t) {
+ if (t != res) std::cerr << "uncollected temporary: " << t << endl;
+ t = t->xp;
+ }
+#endif
// NOTE: Result (if any) is to be freed by the caller.
return res;
}
@@ -3342,7 +3358,21 @@
globalvars.erase(tag);
}
}
+ // collect garbage
+ pure_expr *t = tmps;
+ while (t) {
+ pure_expr *next = t->xp;
+ pure_freenew(t);
+ t = next;
+ }
}
+#if DEBUG>1
+ pure_expr *t = tmps;
+ while (t) {
+ if (t != res) std::cerr << "uncollected temporary: " << t << endl;
+ t = t->xp;
+ }
+#endif
// NOTE: Result (if any) is to be freed by the caller.
return res;
}
Modified: pure/trunk/runtime.cc
===================================================================
--- pure/trunk/runtime.cc 2008-08-12 19:20:37 UTC (rev 476)
+++ pure/trunk/runtime.cc 2008-08-12 23:49:27 UTC (rev 477)
@@ -1363,6 +1363,8 @@
pure_expr *e = interp.estk.front().e;
interp.estk.pop_front();
if (e) pure_new_internal(e);
+#if 0
+ /* This doesn't seem to be safe here. Defer until later. */
// collect garbage
pure_expr *tmps = interp.tmps;
while (tmps) {
@@ -1370,6 +1372,7 @@
pure_freenew(tmps);
tmps = next;
}
+#endif
for (size_t i = interp.sstk_sz; i-- > sz; )
if (interp.sstk[i] && interp.sstk[i]->refc > 0)
pure_free_internal(interp.sstk[i]);
@@ -1394,7 +1397,7 @@
res = ((pure_expr*(*)())fp)();
// normal return
interp.estk.pop_front();
-#if DEBUG>1
+#if DEBUG>2
pure_expr *tmps = interp.tmps;
while (tmps) {
if (tmps != res) cerr << "uncollected temporary: " << tmps << endl;
@@ -1437,6 +1440,8 @@
e = interp.estk.front().e;
interp.estk.pop_front();
if (e) pure_new_internal(e);
+#if 0
+ /* This doesn't seem to be safe here. Defer until later. */
// collect garbage
pure_expr *tmps = interp.tmps;
while (tmps) {
@@ -1444,6 +1449,7 @@
pure_freenew(tmps);
tmps = next;
}
+#endif
for (size_t i = interp.sstk_sz; i-- > sz; )
if (interp.sstk[i] && interp.sstk[i]->refc > 0)
pure_free_internal(interp.sstk[i]);
@@ -1460,7 +1466,7 @@
// normal return
interp.estk.pop_front();
MEMDEBUG_SUMMARY(res)
-#if DEBUG>1
+#if DEBUG>2
pure_expr *tmps = interp.tmps;
while (tmps) {
if (tmps != res) cerr << "uncollected temporary: " << tmps << endl;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|