[pure-lang-svn] SF.net SVN: pure-lang: [98] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-05-18 09:51:44
|
Revision: 98 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=98&view=rev Author: agraef Date: 2008-05-18 02:51:44 -0700 (Sun, 18 May 2008) Log Message: ----------- Add shadow stack to keep track of allocated function arguments. Modified Paths: -------------- pure/trunk/interpreter.hh pure/trunk/runtime.cc Modified: pure/trunk/interpreter.hh =================================================================== --- pure/trunk/interpreter.hh 2008-05-18 09:28:00 UTC (rev 97) +++ pure/trunk/interpreter.hh 2008-05-18 09:51:44 UTC (rev 98) @@ -394,6 +394,7 @@ map<int32_t,GlobalVar> globalvars; map<int32_t,Env> globalfuns; list<pure_exception> estk; + vector<pure_expr*> sstk; #if DEBUG set<pure_expr*> mem_allocations; #endif Modified: pure/trunk/runtime.cc =================================================================== --- pure/trunk/runtime.cc 2008-05-18 09:28:00 UTC (rev 97) +++ pure/trunk/runtime.cc 2008-05-18 09:51:44 UTC (rev 98) @@ -682,8 +682,18 @@ void pure_new_args(pure_expr *x, ...) { va_list ap; + interpreter& interp = *interpreter::g_interp; + size_t cap = interp.sstk.capacity(), sz = interp.sstk.size(); + if (cap < sz+MAXARGS) { + if (sz == 0) + cap = 0x10000; // 64K + else + cap = cap << 1; + interp.sstk.reserve(cap); + } va_start(ap, x); while (x) { + interp.sstk.push_back(x); if (x->refc > 0) x->refc++; else @@ -697,6 +707,8 @@ void pure_free_args(pure_expr *x, ...) { va_list ap; + interpreter& interp = *interpreter::g_interp; + size_t count = 0; va_start(ap, x); if (x) x->refc++; while (1) { @@ -706,8 +718,12 @@ x->refc--; else pure_free_internal(x); + count++; }; va_end(ap); + size_t sz = interp.sstk.size(); + assert(sz >= count); + interp.sstk.resize(sz-count); } extern "C" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |