[pure-lang-svn] SF.net SVN: pure-lang: [100] pure/trunk
Status: Beta
Brought to you by:
agraef
From: <ag...@us...> - 2008-05-18 10:44:41
|
Revision: 100 http://pure-lang.svn.sourceforge.net/pure-lang/?rev=100&view=rev Author: agraef Date: 2008-05-18 03:44:48 -0700 (Sun, 18 May 2008) Log Message: ----------- STL containers are too darn slow, we do our own implementation of the shadow stack instead. Modified Paths: -------------- pure/trunk/interpreter.cc pure/trunk/interpreter.hh pure/trunk/runtime.cc Modified: pure/trunk/interpreter.cc =================================================================== --- pure/trunk/interpreter.cc 2008-05-18 10:04:41 UTC (rev 99) +++ pure/trunk/interpreter.cc 2008-05-18 10:44:48 UTC (rev 100) @@ -62,6 +62,9 @@ stackdir = c_stack_dir(); } + sstk_sz = 0; sstk_cap = 0x10000; // 64K + sstk = (pure_expr**)malloc(sstk_cap*sizeof(pure_expr*)); + // Initialize the JIT. using namespace llvm; Modified: pure/trunk/interpreter.hh =================================================================== --- pure/trunk/interpreter.hh 2008-05-18 10:04:41 UTC (rev 99) +++ pure/trunk/interpreter.hh 2008-05-18 10:44:48 UTC (rev 100) @@ -12,7 +12,6 @@ #include <llvm/Support/LLVMBuilder.h> #include <time.h> -#include <stack> #include <set> #include <string> #include "expr.hh" @@ -395,7 +394,7 @@ map<int32_t,GlobalVar> globalvars; map<int32_t,Env> globalfuns; list<pure_exception> estk; - stack<pure_expr*> sstk; + pure_expr** sstk; size_t sstk_cap, sstk_sz; #if DEBUG set<pure_expr*> mem_allocations; #endif Modified: pure/trunk/runtime.cc =================================================================== --- pure/trunk/runtime.cc 2008-05-18 10:04:41 UTC (rev 99) +++ pure/trunk/runtime.cc 2008-05-18 10:44:48 UTC (rev 100) @@ -683,9 +683,16 @@ { va_list ap; interpreter& interp = *interpreter::g_interp; + pure_expr**& sstk = interp.sstk; + size_t cap = interp.sstk_cap, sz = interp.sstk_sz; + if (cap < sz+MAXARGS) { + cap = cap << 1; + sstk = (pure_expr**)realloc(sstk, cap*sizeof(pure_expr*)); + interp.sstk_cap = cap; + } va_start(ap, x); while (x) { - interp.sstk.push(x); + sstk[sz++] = x; if (x->refc > 0) x->refc++; else @@ -693,13 +700,14 @@ x = va_arg(ap, pure_expr*); }; va_end(ap); + interp.sstk_sz = sz; } extern "C" 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) { @@ -709,9 +717,11 @@ x->refc--; else pure_free_internal(x); - interp.sstk.pop(); + count++; }; va_end(ap); + assert(interpreter::g_interp->sstk_sz >= count); + interpreter::g_interp->sstk_sz -= count; } extern "C" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |