diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-03-21 13:33:47 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-03-21 13:33:47 -0300 |
commit | 9284742a11b92dfe4ef011b963240cfa588515cd (patch) | |
tree | 96cc498fcc5ec27546fc0738998319c829df55d0 /luamem.c | |
parent | 9704ff4cb14f34077062447d15196d32ace23e95 (diff) | |
download | lua-9284742a11b92dfe4ef011b963240cfa588515cd.tar.gz lua-9284742a11b92dfe4ef011b963240cfa588515cd.tar.bz2 lua-9284742a11b92dfe4ef011b963240cfa588515cd.zip |
better control when growing arrays.
Diffstat (limited to 'luamem.c')
-rw-r--r-- | luamem.c | 26 |
1 files changed, 25 insertions, 1 deletions
@@ -3,7 +3,7 @@ | |||
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | */ | 4 | */ |
5 | 5 | ||
6 | char *rcs_mem = "$Id: mem.c,v 1.8 1996/02/22 20:34:33 roberto Exp roberto $"; | 6 | char *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 | |||
17 | char *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 | |||
16 | static void mem_error (void) | 27 | static 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 | ||
68 | int 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 | |||
57 | void* luaI_buffer (unsigned long size) | 81 | void* luaI_buffer (unsigned long size) |
58 | { | 82 | { |
59 | static unsigned long buffsize = 0; | 83 | static unsigned long buffsize = 0; |