47#define callfrealloc(g,block,os,ns) ((*g->frealloc)(g->ud, block, os, ns))
58#define cantryagain(g) (completestate(g) && !g->gcstopem)
63#if defined(EMERGENCYGCTESTS)
69static void *firsttry (
global_State *g,
void *block,
size_t os,
size_t ns) {
70 if (ns > 0 && cantryagain(g))
73 return callfrealloc(g, block, os, ns);
76#define firsttry(g,block,os,ns) callfrealloc(g, block, os, ns)
97void *luaM_growaux_ (
lua_State *L,
void *block,
int nelems,
int *psize,
98 int size_elems,
int limit,
const char *what) {
101 if (nelems + 1 <= size)
103 if (size >= limit / 2) {
104 if (l_unlikely(size >= limit))
105 luaG_runerror(L,
"too many %s (limit is %d)", what, limit);
110 if (size < MINSIZEARRAY)
113 lua_assert(nelems + 1 <= size && size <= limit);
115 newblock = luaM_saferealloc_(L, block, cast_sizet(*psize) * size_elems,
116 cast_sizet(size) * size_elems);
128void *luaM_shrinkvector_ (
lua_State *L,
void *block,
int *size,
129 int final_n,
int size_elem) {
131 size_t oldsize = cast_sizet((*size) * size_elem);
132 size_t newsize = cast_sizet(final_n * size_elem);
133 lua_assert(newsize <= oldsize);
134 newblock = luaM_saferealloc_(L, block, oldsize, newsize);
143 luaG_runerror(L,
"memory allocation error: block too big");
150void luaM_free_ (
lua_State *L,
void *block,
size_t osize) {
152 lua_assert((osize == 0) == (block == NULL));
153 callfrealloc(g, block, osize, 0);
162static void *tryagain (
lua_State *L,
void *block,
163 size_t osize,
size_t nsize) {
165 if (cantryagain(g)) {
167 return callfrealloc(g, block, osize, nsize);
176void *luaM_realloc_ (
lua_State *L,
void *block,
size_t osize,
size_t nsize) {
179 lua_assert((osize == 0) == (block == NULL));
180 newblock = firsttry(g, block, osize, nsize);
181 if (l_unlikely(newblock == NULL && nsize > 0)) {
182 newblock = tryagain(L, block, osize, nsize);
183 if (newblock == NULL)
186 lua_assert((nsize == 0) == (newblock == NULL));
187 g->GCdebt = (g->GCdebt + nsize) - osize;
192void *luaM_saferealloc_ (
lua_State *L,
void *block,
size_t osize,
194 void *newblock = luaM_realloc_(L, block, osize, nsize);
195 if (l_unlikely(newblock == NULL && nsize > 0))
201void *luaM_malloc_ (
lua_State *L,
size_t size,
int tag) {
206 void *newblock = firsttry(g, NULL, tag, size);
207 if (l_unlikely(newblock == NULL)) {
208 newblock = tryagain(L, NULL, tag, size);
209 if (newblock == NULL)