aboutsummaryrefslogtreecommitdiff
path: root/luamem.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-03-21 13:33:47 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1996-03-21 13:33:47 -0300
commit9284742a11b92dfe4ef011b963240cfa588515cd (patch)
tree96cc498fcc5ec27546fc0738998319c829df55d0 /luamem.c
parent9704ff4cb14f34077062447d15196d32ace23e95 (diff)
downloadlua-9284742a11b92dfe4ef011b963240cfa588515cd.tar.gz
lua-9284742a11b92dfe4ef011b963240cfa588515cd.tar.bz2
lua-9284742a11b92dfe4ef011b963240cfa588515cd.zip
better control when growing arrays.
Diffstat (limited to 'luamem.c')
-rw-r--r--luamem.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/luamem.c b/luamem.c
index eeceaea2..164cbca2 100644
--- a/luamem.c
+++ b/luamem.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_mem = "$Id: mem.c,v 1.8 1996/02/22 20:34:33 roberto Exp roberto $"; 6char *rcs_mem = "$Id: mem.c,v 1.9 1996/03/14 15:55:49 roberto Exp roberto $";
7 7
8#include <stdlib.h> 8#include <stdlib.h>
9#include <string.h> 9#include <string.h>
@@ -13,6 +13,17 @@ char *rcs_mem = "$Id: mem.c,v 1.8 1996/02/22 20:34:33 roberto Exp roberto $";
13#include "lua.h" 13#include "lua.h"
14#include "table.h" 14#include "table.h"
15 15
16
17char *luaI_memerrormsg[NUMERRMSG] = {
18 "code size overflow",
19 "symbol table overflow",
20 "constant table overflow",
21 "stack size overflow",
22 "lex buffer overflow",
23 "lock table overflow"
24};
25
26
16static void mem_error (void) 27static void mem_error (void)
17{ 28{
18 Long recovered = luaI_collectgarbage(); /* try to collect garbage */ 29 Long recovered = luaI_collectgarbage(); /* try to collect garbage */
@@ -54,6 +65,19 @@ void *luaI_realloc (void *oldblock, unsigned long size)
54} 65}
55 66
56 67
68int luaI_growvector (void **block, unsigned long nelems, int size,
69 enum memerrormsg errormsg, unsigned long limit)
70{
71 if (nelems >= limit)
72 lua_error(luaI_memerrormsg[errormsg]);
73 nelems = (nelems == 0) ? 20 : nelems*2;
74 if (nelems > limit)
75 nelems = limit;
76 *block = luaI_realloc(*block, nelems*size);
77 return (int) nelems;
78}
79
80
57void* luaI_buffer (unsigned long size) 81void* luaI_buffer (unsigned long size)
58{ 82{
59 static unsigned long buffsize = 0; 83 static unsigned long buffsize = 0;