Index: third_party/lua/src/lmem.c |
diff --git a/third_party/lua/src/lmem.c b/third_party/lua/src/lmem.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3f88496e09d610b041983bcb03884424e1a78fb2 |
--- /dev/null |
+++ b/third_party/lua/src/lmem.c |
@@ -0,0 +1,99 @@ |
+/* |
+** $Id: lmem.c,v 1.84 2012/05/23 15:41:53 roberto Exp $ |
+** Interface to Memory Manager |
+** See Copyright Notice in lua.h |
+*/ |
+ |
+ |
+#include <stddef.h> |
+ |
+#define lmem_c |
+#define LUA_CORE |
+ |
+#include "lua.h" |
+ |
+#include "ldebug.h" |
+#include "ldo.h" |
+#include "lgc.h" |
+#include "lmem.h" |
+#include "lobject.h" |
+#include "lstate.h" |
+ |
+ |
+ |
+/* |
+** About the realloc function: |
+** void * frealloc (void *ud, void *ptr, size_t osize, size_t nsize); |
+** (`osize' is the old size, `nsize' is the new size) |
+** |
+** * frealloc(ud, NULL, x, s) creates a new block of size `s' (no |
+** matter 'x'). |
+** |
+** * frealloc(ud, p, x, 0) frees the block `p' |
+** (in this specific case, frealloc must return NULL); |
+** particularly, frealloc(ud, NULL, 0, 0) does nothing |
+** (which is equivalent to free(NULL) in ANSI C) |
+** |
+** frealloc returns NULL if it cannot create or reallocate the area |
+** (any reallocation to an equal or smaller size cannot fail!) |
+*/ |
+ |
+ |
+ |
+#define MINSIZEARRAY 4 |
+ |
+ |
+void *luaM_growaux_ (lua_State *L, void *block, int *size, size_t size_elems, |
+ int limit, const char *what) { |
+ void *newblock; |
+ int newsize; |
+ if (*size >= limit/2) { /* cannot double it? */ |
+ if (*size >= limit) /* cannot grow even a little? */ |
+ luaG_runerror(L, "too many %s (limit is %d)", what, limit); |
+ newsize = limit; /* still have at least one free place */ |
+ } |
+ else { |
+ newsize = (*size)*2; |
+ if (newsize < MINSIZEARRAY) |
+ newsize = MINSIZEARRAY; /* minimum size */ |
+ } |
+ newblock = luaM_reallocv(L, block, *size, newsize, size_elems); |
+ *size = newsize; /* update only when everything else is OK */ |
+ return newblock; |
+} |
+ |
+ |
+l_noret luaM_toobig (lua_State *L) { |
+ luaG_runerror(L, "memory allocation error: block too big"); |
+} |
+ |
+ |
+ |
+/* |
+** generic allocation routine. |
+*/ |
+void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) { |
+ void *newblock; |
+ global_State *g = G(L); |
+ size_t realosize = (block) ? osize : 0; |
+ lua_assert((realosize == 0) == (block == NULL)); |
+#if defined(HARDMEMTESTS) |
+ if (nsize > realosize && g->gcrunning) |
+ luaC_fullgc(L, 1); /* force a GC whenever possible */ |
+#endif |
+ newblock = (*g->frealloc)(g->ud, block, osize, nsize); |
+ if (newblock == NULL && nsize > 0) { |
+ api_check(L, nsize > realosize, |
+ "realloc cannot fail when shrinking a block"); |
+ if (g->gcrunning) { |
+ luaC_fullgc(L, 1); /* try to free some memory... */ |
+ newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ |
+ } |
+ if (newblock == NULL) |
+ luaD_throw(L, LUA_ERRMEM); |
+ } |
+ lua_assert((nsize == 0) == (newblock == NULL)); |
+ g->GCdebt = (g->GCdebt + nsize) - realosize; |
+ return newblock; |
+} |
+ |