diff options
Diffstat (limited to 'src/lmem.c')
-rw-r--r-- | src/lmem.c | 82 |
1 files changed, 37 insertions, 45 deletions
@@ -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; } |