[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. |