diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-29 14:38:48 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-11-29 14:38:48 -0200 |
commit | c5fa0895e98a3e915f01003f8ae29cde31243cc8 (patch) | |
tree | 873574e37491f10215ce8ee349795ea282036aa5 /lmem.c | |
parent | d015f1fc02e03864b0ed3ad668a6e0660417a718 (diff) | |
download | lua-c5fa0895e98a3e915f01003f8ae29cde31243cc8.tar.gz lua-c5fa0895e98a3e915f01003f8ae29cde31243cc8.tar.bz2 lua-c5fa0895e98a3e915f01003f8ae29cde31243cc8.zip |
table sizes don't need to be primes; power of 2 gives the same performance.
Diffstat (limited to 'lmem.c')
-rw-r--r-- | lmem.c | 21 |
1 files changed, 6 insertions, 15 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lmem.c,v 1.19 1999/10/19 13:33:22 roberto Exp roberto $ | 2 | ** $Id: lmem.c,v 1.20 1999/11/22 13:12:07 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 | */ |
@@ -10,6 +10,7 @@ | |||
10 | #define LUA_REENTRANT | 10 | #define LUA_REENTRANT |
11 | 11 | ||
12 | #include "lmem.h" | 12 | #include "lmem.h" |
13 | #include "lobject.h" | ||
13 | #include "lstate.h" | 14 | #include "lstate.h" |
14 | #include "lua.h" | 15 | #include "lua.h" |
15 | 16 | ||
@@ -24,27 +25,17 @@ | |||
24 | #endif | 25 | #endif |
25 | 26 | ||
26 | 27 | ||
27 | #define MINSIZE 8 /* minimum size for "growing" vectors */ | ||
28 | 28 | ||
29 | 29 | ||
30 | 30 | void *luaM_growaux (lua_State *L, void *block, unsigned long nelems, | |
31 | 31 | int inc, int size, const char *errormsg, unsigned long limit) { | |
32 | static unsigned long power2 (unsigned long n) { | ||
33 | unsigned long p = MINSIZE; | ||
34 | while (p<=n) p<<=1; | ||
35 | return p; | ||
36 | } | ||
37 | |||
38 | |||
39 | void *luaM_growaux (lua_State *L, void *block, unsigned long nelems, int inc, int size, | ||
40 | const char *errormsg, unsigned long limit) { | ||
41 | unsigned long newn = nelems+inc; | 32 | unsigned long newn = nelems+inc; |
42 | if (newn >= limit) lua_error(L, errormsg); | 33 | if (newn >= limit) lua_error(L, errormsg); |
43 | if ((newn ^ nelems) <= nelems || /* still the same power of 2 limit? */ | 34 | if ((newn ^ nelems) <= nelems || /* still the same power of 2 limit? */ |
44 | (nelems > 0 && newn < MINSIZE)) /* or block already is MINSIZE? */ | 35 | (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ |
45 | return block; /* do not need to reallocate */ | 36 | return block; /* do not need to reallocate */ |
46 | else /* it crossed a power of 2 boundary; grow to next power */ | 37 | else /* it crossed a power of 2 boundary; grow to next power */ |
47 | return luaM_realloc(L, block, power2(newn)*size); | 38 | return luaM_realloc(L, block, luaO_power2(newn)*size); |
48 | } | 39 | } |
49 | 40 | ||
50 | 41 | ||