[pure-lang-svn] SF.net SVN: pure-lang: [127] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-05-24 19:29:59
|
Revision: 127 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=127&view=rev Author: agraef Date: 2008-05-24 12:30:07 -0700 (Sat, 24 May 2008) Log Message: ----------- Fix memory allocation bugs in exception handling. Modified Paths: -------------- pure/trunk/ChangeLog pure/trunk/interpreter.cc pure/trunk/runtime.cc Modified: pure/trunk/ChangeLog =================================================================== --- pure/trunk/ChangeLog 2008-05-24 19:27:27 UTC (rev 126) +++ pure/trunk/ChangeLog 2008-05-24 19:30:07 UTC (rev 127) @@ -1,5 +1,8 @@ 2008-05-24 Albert Graef <Dr....@t-...> + * interpreter.cc, runtime.cc: Fix more memory allocation bugs in + exception handling. + * runtime.cc, lib/system.pure: Bugfixes in the scanf functions. Reported by Jiri Spitz. Modified: pure/trunk/interpreter.cc =================================================================== --- pure/trunk/interpreter.cc 2008-05-24 19:27:27 UTC (rev 126) +++ pure/trunk/interpreter.cc 2008-05-24 19:30:07 UTC (rev 127) @@ -3902,7 +3902,7 @@ assert(f); vector<Value*> args; if (tag > 0) - args.push_back(call("pure_new", cbox(tag))); + args.push_back(cbox(tag)); else args.push_back(NullExprPtr); Env& e = act_env(); Modified: pure/trunk/runtime.cc =================================================================== --- pure/trunk/runtime.cc 2008-05-24 19:27:27 UTC (rev 126) +++ pure/trunk/runtime.cc 2008-05-24 19:30:07 UTC (rev 127) @@ -276,14 +276,13 @@ if (!interpreter::g_interp) return 0; pure_expr *f = pure_const(interpreter::g_interp->symtab.signal_sym().f); pure_expr *x = pure_int(sig); - return pure_new_internal(pure_apply2(f, x)); + return pure_apply2(f, x); } static inline pure_expr* stack_exception() { if (!interpreter::g_interp) return 0; - return pure_new_internal - (pure_const(interpreter::g_interp->symtab.segfault_sym().f)); + return pure_const(interpreter::g_interp->symtab.segfault_sym().f); } extern "C" @@ -612,7 +611,6 @@ abort(); // no exception handler, bail out else { interp.estk.front().e = e; - assert(!e || e->refc > 0); longjmp(interp.estk.front().jmp, 1); } } @@ -669,9 +667,7 @@ size_t sz = interp.estk.front().sz; pure_expr *e = interp.estk.front().e; interp.estk.pop_front(); - assert(!e || e->refc > 0); - // make sure that we don't accidentally collect the exception value - if (e) e->refc++; + if (e) pure_new_internal(e); // collect garbage pure_expr *tmps = interp.tmps; while (tmps) { @@ -683,10 +679,13 @@ if (interp.sstk[i] && interp.sstk[i]->refc > 0) pure_free_internal(interp.sstk[i]); interp.sstk_sz = sz; - if (e && e->refc > 1) e->refc--; if (!e) e = pure_new_internal(pure_const(interp.symtab.void_sym().f)); assert(e && e->refc > 0); +#if DEBUG>1 + cerr << "pure_catch: exception " << (void*)e << " (refc = " << e->refc + << "): " << e << endl; +#endif pure_expr *res = pure_apply(h, e); assert(res); res->refc++; @@ -743,9 +742,7 @@ size_t sz = interp.estk.front().sz; e = interp.estk.front().e; interp.estk.pop_front(); - assert(!e || e->refc > 0); - // make sure that we don't accidentally collect the exception value - if (e) e->refc++; + if (e) pure_new_internal(e); // collect garbage pure_expr *tmps = interp.tmps; while (tmps) { @@ -757,7 +754,11 @@ if (interp.sstk[i] && interp.sstk[i]->refc > 0) pure_free_internal(interp.sstk[i]); interp.sstk_sz = sz; - if (e && e->refc > 1) e->refc--; +#if DEBUG>1 + if (e) + cerr << "pure_invoke: exception " << (void*)e << " (refc = " << e->refc + << "): " << e << endl; +#endif MEMDEBUG_SUMMARY(e) return 0; } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |