static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { lua_State *L = (lua_State *)ud; int mode = L == NULL ? 0 : G(L)->egcmode; void *nptr; if (nsize == 0) { c_free(ptr); return NULL; } if (L != NULL && (mode & EGC_ALWAYS)) /* always collect memory if requested */ luaC_fullgc(L); if(nsize > osize && L != NULL) { #if defined(LUA_STRESS_EMERGENCY_GC) luaC_fullgc(L); #endif if(G(L)->memlimit > 0 && (mode & EGC_ON_MEM_LIMIT) && l_check_memlimit(L, nsize - osize)) return NULL; } nptr = (void *)c_realloc(ptr, nsize); if (nptr == NULL && L != NULL && (mode & EGC_ON_ALLOC_FAILURE)) { luaC_fullgc(L); /* emergency full collection. */ nptr = (void *)c_realloc(ptr, nsize); /* try allocation again */ } return nptr; }
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) { lua_State *L = (lua_State *)ud; void *nptr; if (nsize == 0) { free(ptr); return NULL; } if(nsize > osize && L != NULL) { if(G(L)->memlimit > 0 && l_check_memlimit(L, nsize - osize)) return NULL; } nptr = realloc(ptr, nsize); if (nptr == NULL && L != NULL) { luaC_fullgc(L); /* emergency full collection. */ nptr = realloc(ptr, nsize); /* try allocation again */ } return nptr; }