aboutsummaryrefslogtreecommitdiff
path: root/lmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'lmem.c')
-rw-r--r--lmem.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/lmem.c b/lmem.c
index 23dc14d6..afacbb9f 100644
--- a/lmem.c
+++ b/lmem.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lmem.c,v 1.92 2017/12/06 18:36:31 roberto Exp roberto $ 2** $Id: lmem.c,v 1.93 2017/12/07 18:59:52 roberto Exp roberto $
3** Interface to Memory Manager 3** Interface to Memory Manager
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -69,9 +69,12 @@ void *luaM_growaux_ (lua_State *L, void *block, int nelems, int *psize,
69 if (size < MINSIZEARRAY) 69 if (size < MINSIZEARRAY)
70 size = MINSIZEARRAY; /* minimum size */ 70 size = MINSIZEARRAY; /* minimum size */
71 } 71 }
72 lua_assert(nelems + 1 <= size && size <= limit);
72 /* 'limit' ensures that multiplication will not overflow */ 73 /* 'limit' ensures that multiplication will not overflow */
73 newblock = luaM_realloc(L, block, cast(size_t, *psize) * size_elems, 74 newblock = luaM_realloc_(L, block, cast(size_t, *psize) * size_elems,
74 cast(size_t, size) * size_elems); 75 cast(size_t, size) * size_elems);
76 if (newblock == NULL)
77 luaM_error(L);
75 *psize = size; /* update only when everything else is OK */ 78 *psize = size; /* update only when everything else is OK */
76 return newblock; 79 return newblock;
77} 80}
@@ -115,20 +118,20 @@ void luaM_free_ (lua_State *L, void *block, size_t osize) {
115/* 118/*
116** generic allocation routine. 119** generic allocation routine.
117*/ 120*/
118void *luaM_realloc (lua_State *L, void *block, size_t osize, size_t nsize) { 121void *luaM_realloc_ (lua_State *L, void *block, size_t osize, size_t nsize) {
119 void *newblock; 122 void *newblock;
120 global_State *g = G(L); 123 global_State *g = G(L);
121 lua_assert((osize == 0) == (block == NULL)); 124 lua_assert((osize == 0) == (block == NULL));
122 hardtest(L, osize, nsize); 125 hardtest(L, osize, nsize);
123 newblock = (*g->frealloc)(g->ud, block, osize, nsize); 126 newblock = (*g->frealloc)(g->ud, block, osize, nsize);
124 if (newblock == NULL && nsize > 0) { 127 if (newblock == NULL && nsize > 0) {
125 lua_assert(nsize > osize); /* cannot fail when shrinking a block */ 128 /* Is state fully built? Not shrinking a block? */
126 if (g->version) { /* is state fully built? */ 129 if (g->version && nsize > osize) {
127 luaC_fullgc(L, 1); /* try to free some memory... */ 130 luaC_fullgc(L, 1); /* try to free some memory... */
128 newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */ 131 newblock = (*g->frealloc)(g->ud, block, osize, nsize); /* try again */
129 } 132 }
130 if (newblock == NULL) 133 if (newblock == NULL)
131 luaD_throw(L, LUA_ERRMEM); 134 return NULL;
132 } 135 }
133 lua_assert((nsize == 0) == (newblock == NULL)); 136 lua_assert((nsize == 0) == (newblock == NULL));
134 g->GCdebt = (g->GCdebt + nsize) - osize; 137 g->GCdebt = (g->GCdebt + nsize) - osize;
@@ -136,7 +139,16 @@ void *luaM_realloc (lua_State *L, void *block, size_t osize, size_t nsize) {
136} 139}
137 140
138 141
139void *luaM_malloc (lua_State *L, size_t size, int tag) { 142void *luaM_saferealloc_ (lua_State *L, void *block, size_t osize,
143 size_t nsize) {
144 void *newblock = luaM_realloc_(L, block, osize, nsize);
145 if (newblock == NULL && nsize > 0) /* allocation failed? */
146 luaM_error(L);
147 return newblock;
148}
149
150
151void *luaM_malloc_ (lua_State *L, size_t size, int tag) {
140 hardtest(L, 0, size); 152 hardtest(L, 0, size);
141 if (size == 0) 153 if (size == 0)
142 return NULL; /* that's all */ 154 return NULL; /* that's all */
@@ -149,7 +161,7 @@ void *luaM_malloc (lua_State *L, size_t size, int tag) {
149 newblock = (*g->frealloc)(g->ud, NULL, tag, size); /* try again */ 161 newblock = (*g->frealloc)(g->ud, NULL, tag, size); /* try again */
150 } 162 }
151 if (newblock == NULL) 163 if (newblock == NULL)
152 luaD_throw(L, LUA_ERRMEM); 164 luaM_error(L);
153 } 165 }
154 g->GCdebt += size; 166 g->GCdebt += size;
155 return newblock; 167 return newblock;