summaryrefslogtreecommitdiff
path: root/AppPkg/Applications/Lua/src/lmem.c
diff options
context:
space:
mode:
authordarylm503 <darylm503@Edk2>2014-11-07 20:18:01 +0000
committerdarylm503 <darylm503@Edk2>2014-11-07 20:18:01 +0000
commit16a5fed65808adf648004b34f98718301d718fa2 (patch)
tree1fd24a832f20c1ce4e1e52e0020513d0d1ef5ae8 /AppPkg/Applications/Lua/src/lmem.c
parentc058d59f40b4a95c218cd171ff976bee1ff487e2 (diff)
downloadedk2-platforms-16a5fed65808adf648004b34f98718301d718fa2.tar.xz
AppPkg: Add the Lua interpreter and library.
StdLib: Add support and include files for Lua. The sources for the Lua standalone interpreter, as well as its library, have been added to AppPkg/Applications/Lua. The Lua library, LuaLib, can be used to embed Lua into new applications. The Lua header files, needed for both building and embedding, are located in StdLib/Include/Lua. The original versions of these header files, in the source directory, have been converted into stubs that reference the include files in StdLib. This allows us to keep the Lua sources as close to the distributed version as possible. Documentation is contained in the Lua/doc directory. Further information is available at www.lua.org. Contributed-under: TianoCore Contribution Agreement 1.0 Signed Off by: Bruce Maynard <Bruce.Maynard@Emulex.Com> Reviewed by: Daryl McDaniel <daryl.mcdaniel@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16313 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'AppPkg/Applications/Lua/src/lmem.c')
-rw-r--r--AppPkg/Applications/Lua/src/lmem.c99
1 files changed, 99 insertions, 0 deletions
diff --git a/AppPkg/Applications/Lua/src/lmem.c b/AppPkg/Applications/Lua/src/lmem.c
new file mode 100644
index 0000000000..ee343e3e03
--- /dev/null
+++ b/AppPkg/Applications/Lua/src/lmem.c
@@ -0,0 +1,99 @@
+/*
+** $Id: lmem.c,v 1.84.1.1 2013/04/12 18:48:47 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;
+}
+