summaryrefslogtreecommitdiff
path: root/src/lmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lmem.c')
-rw-r--r--src/lmem.c82
1 files changed, 37 insertions, 45 deletions
diff --git a/src/lmem.c b/src/lmem.c
index f977770a..75b274c9 100644
--- a/src/lmem.c
+++ b/src/lmem.c
@@ -1,11 +1,11 @@
/*
-** $Id: lmem.c,v 1.61 2002/12/04 17:38:31 roberto Exp $
+** $Id: lmem.c,v 1.63 2003/11/27 18:18:37 roberto Exp $
** Interface to Memory Manager
** See Copyright Notice in lua.h
*/
-#include <stdlib.h>
+#include <stddef.h>
#define lmem_c
@@ -20,21 +20,23 @@
/*
-** definition for realloc function. It must assure that l_realloc(NULL,
-** 0, x) allocates a new block (ANSI C assures that). (`os' is the old
-** block size; some allocators may use that.)
+** About the realloc function:
+** void * realloc (void *ud, void *ptr, size_t osize, size_t nsize);
+** (`osize' is the old size, `nsize' is the new size)
+**
+** Lua ensures that (ptr == NULL) iff (osize == 0).
+**
+** * realloc(ud, NULL, 0, x) creates a new block of size `x'
+**
+** * realloc(ud, p, x, 0) frees the block `p'
+** (in this specific case, realloc must return NULL).
+** particularly, realloc(ud, NULL, 0, 0) does nothing
+** (which is equivalent to free(NULL) in ANSI C)
+**
+** realloc returns NULL if it cannot create or reallocate the area
+** (any reallocation to an equal or smaller size cannot fail!)
*/
-#ifndef l_realloc
-#define l_realloc(b,os,s) realloc(b,s)
-#endif
-/*
-** definition for free function. (`os' is the old block size; some
-** allocators may use that.)
-*/
-#ifndef l_free
-#define l_free(b,os) free(b)
-#endif
#define MINSIZEARRAY 4
@@ -43,13 +45,16 @@
void *luaM_growaux (lua_State *L, void *block, int *size, int size_elems,
int limit, const char *errormsg) {
void *newblock;
- int newsize = (*size)*2;
- if (newsize < MINSIZEARRAY)
- newsize = MINSIZEARRAY; /* minimum size */
- else if (*size >= limit/2) { /* cannot double it? */
- if (*size < limit - MINSIZEARRAY) /* try something smaller... */
- newsize = limit; /* still have at least MINSIZEARRAY free places */
- else luaG_runerror(L, errormsg);
+ int newsize;
+ if (*size >= limit/2) { /* cannot double it? */
+ if (*size >= limit - MINSIZEARRAY) /* try something smaller... */
+ luaG_runerror(L, errormsg);
+ newsize = limit; /* still have at least MINSIZEARRAY free places */
+ }
+ else {
+ newsize = (*size)*2;
+ if (newsize < MINSIZEARRAY)
+ newsize = MINSIZEARRAY; /* minimum size */
}
newblock = luaM_realloc(L, block,
cast(lu_mem, *size)*cast(lu_mem, size_elems),
@@ -62,30 +67,17 @@ void *luaM_growaux (lua_State *L, void *block, int *size, int size_elems,
/*
** generic allocation routine.
*/
-void *luaM_realloc (lua_State *L, void *block, lu_mem oldsize, lu_mem size) {
- lua_assert((oldsize == 0) == (block == NULL));
- if (size == 0) {
- if (block != NULL) {
- l_free(block, oldsize);
- block = NULL;
- }
- else return NULL; /* avoid `nblocks' computations when oldsize==size==0 */
- }
- else if (size >= MAX_SIZET)
+void *luaM_realloc (lua_State *L, void *block, lu_mem osize, lu_mem nsize) {
+ global_State *g = G(L);
+ lua_assert((osize == 0) == (block == NULL));
+ if (nsize >= MAX_SIZET)
luaG_runerror(L, "memory allocation error: block too big");
- else {
- block = l_realloc(block, oldsize, size);
- if (block == NULL) {
- if (L)
- luaD_throw(L, LUA_ERRMEM);
- else return NULL; /* error before creating state! */
- }
- }
- if (L) {
- lua_assert(G(L) != NULL && G(L)->nblocks > 0);
- G(L)->nblocks -= oldsize;
- G(L)->nblocks += size;
- }
+ block = (*g->realloc)(g->ud, block, osize, nsize);
+ if (block == NULL && nsize > 0)
+ luaD_throw(L, LUA_ERRMEM);
+ lua_assert((nsize == 0) == (block == NULL));
+ g->nblocks -= osize;
+ g->nblocks += nsize;
return block;
}