diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-14 13:27:30 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-12-14 13:27:30 -0200 |
commit | 15b823ce4fde81d20486428e52a5a608d62f2465 (patch) | |
tree | 05cc1aa379caa41eac41c161aaf54a5be12df3a2 | |
parent | 8da245bfd2a767e1a738c2a85492d1f64d68f016 (diff) | |
download | lua-15b823ce4fde81d20486428e52a5a608d62f2465.tar.gz lua-15b823ce4fde81d20486428e52a5a608d62f2465.tar.bz2 lua-15b823ce4fde81d20486428e52a5a608d62f2465.zip |
cleaner way to add extra space in a lua state.
-rw-r--r-- | lstate.c | 33 | ||||
-rw-r--r-- | ltests.h | 3 | ||||
-rw-r--r-- | luaconf.h | 12 |
3 files changed, 29 insertions, 19 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 2.63 2009/10/23 19:12:19 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.64 2009/11/18 13:13:47 roberto Exp roberto $ |
3 | ** Global State | 3 | ** Global State |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -25,21 +25,31 @@ | |||
25 | #include "ltm.h" | 25 | #include "ltm.h" |
26 | 26 | ||
27 | 27 | ||
28 | #define state_size(x) (sizeof(x) + LUAI_EXTRASPACE) | 28 | /* |
29 | #define fromstate(l) (cast(lu_byte *, (l)) - LUAI_EXTRASPACE) | 29 | ** thread state + extra space |
30 | #define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + LUAI_EXTRASPACE)) | 30 | */ |
31 | typedef struct LX { | ||
32 | #if defined(LUAI_EXTRASPACE) | ||
33 | char buff[LUAI_EXTRASPACE]; | ||
34 | #endif | ||
35 | lua_State l; | ||
36 | } LX; | ||
31 | 37 | ||
32 | 38 | ||
33 | /* | 39 | /* |
34 | ** Main thread combines a thread state and the global state | 40 | ** Main thread combines a thread state and the global state |
35 | */ | 41 | */ |
36 | typedef struct LG { | 42 | typedef struct LG { |
37 | lua_State l; | 43 | LX l; |
38 | global_State g; | 44 | global_State g; |
39 | } LG; | 45 | } LG; |
40 | 46 | ||
41 | 47 | ||
42 | 48 | ||
49 | #define fromstate(L) (cast(LX *, cast(lu_byte *, (L)) - offsetof(LX, l))) | ||
50 | |||
51 | |||
52 | |||
43 | /* | 53 | /* |
44 | ** maximum number of nested calls made by error-handling function | 54 | ** maximum number of nested calls made by error-handling function |
45 | */ | 55 | */ |
@@ -174,7 +184,7 @@ static void close_state (lua_State *L) { | |||
174 | luaZ_freebuffer(L, &g->buff); | 184 | luaZ_freebuffer(L, &g->buff); |
175 | freestack(L); | 185 | freestack(L); |
176 | lua_assert(g->totalbytes == sizeof(LG)); | 186 | lua_assert(g->totalbytes == sizeof(LG)); |
177 | (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); | 187 | (*g->frealloc)(g->ud, fromstate(L), sizeof(LG), 0); |
178 | } | 188 | } |
179 | 189 | ||
180 | 190 | ||
@@ -182,7 +192,7 @@ LUA_API lua_State *lua_newthread (lua_State *L) { | |||
182 | lua_State *L1; | 192 | lua_State *L1; |
183 | lua_lock(L); | 193 | lua_lock(L); |
184 | luaC_checkGC(L); | 194 | luaC_checkGC(L); |
185 | L1 = tostate(luaM_malloc(L, state_size(lua_State))); | 195 | L1 = &luaM_new(L, LX)->l; |
186 | luaC_link(L, obj2gco(L1), LUA_TTHREAD); | 196 | luaC_link(L, obj2gco(L1), LUA_TTHREAD); |
187 | setthvalue(L, L->top, L1); | 197 | setthvalue(L, L->top, L1); |
188 | api_incr_top(L); | 198 | api_incr_top(L); |
@@ -200,11 +210,12 @@ LUA_API lua_State *lua_newthread (lua_State *L) { | |||
200 | 210 | ||
201 | 211 | ||
202 | void luaE_freethread (lua_State *L, lua_State *L1) { | 212 | void luaE_freethread (lua_State *L, lua_State *L1) { |
213 | LX *l = fromstate(L1); | ||
203 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ | 214 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ |
204 | lua_assert(L1->openupval == NULL); | 215 | lua_assert(L1->openupval == NULL); |
205 | luai_userstatefree(L1); | 216 | luai_userstatefree(L1); |
206 | freestack(L1); | 217 | freestack(L1); |
207 | luaM_freemem(L, fromstate(L1), state_size(lua_State)); | 218 | luaM_free(L, l); |
208 | } | 219 | } |
209 | 220 | ||
210 | 221 | ||
@@ -212,10 +223,10 @@ LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { | |||
212 | int i; | 223 | int i; |
213 | lua_State *L; | 224 | lua_State *L; |
214 | global_State *g; | 225 | global_State *g; |
215 | void *l = (*f)(ud, NULL, 0, state_size(LG)); | 226 | LG *l = cast(LG *, (*f)(ud, NULL, 0, sizeof(LG))); |
216 | if (l == NULL) return NULL; | 227 | if (l == NULL) return NULL; |
217 | L = tostate(l); | 228 | L = &l->l.l; |
218 | g = &((LG *)L)->g; | 229 | g = &l->g; |
219 | L->next = NULL; | 230 | L->next = NULL; |
220 | L->tt = LUA_TTHREAD; | 231 | L->tt = LUA_TTHREAD; |
221 | g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); | 232 | g->currentwhite = bit2mask(WHITE0BIT, FIXEDBIT); |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltests.h,v 2.25 2009/04/17 22:00:01 roberto Exp roberto $ | 2 | ** $Id: ltests.h,v 2.26 2009/11/19 19:06:52 roberto Exp roberto $ |
3 | ** Internal Header for Debugging of the Lua Implementation | 3 | ** Internal Header for Debugging of the Lua Implementation |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -58,7 +58,6 @@ int lua_checkmemory (lua_State *L); | |||
58 | #undef luai_userstatethread | 58 | #undef luai_userstatethread |
59 | #undef lua_lock | 59 | #undef lua_lock |
60 | #undef lua_unlock | 60 | #undef lua_unlock |
61 | #undef LUAI_EXTRASPACE | ||
62 | 61 | ||
63 | struct L_EXTRA { int lock; int *plock; }; | 62 | struct L_EXTRA { int lock; int *plock; }; |
64 | #define LUAI_EXTRASPACE sizeof(struct L_EXTRA) | 63 | #define LUAI_EXTRASPACE sizeof(struct L_EXTRA) |
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: luaconf.h,v 1.119 2009/11/26 17:34:49 roberto Exp roberto $ | 2 | ** $Id: luaconf.h,v 1.120 2009/12/10 19:00:33 roberto Exp roberto $ |
3 | ** Configuration file for Lua | 3 | ** Configuration file for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -753,12 +753,12 @@ union luai_Cast { double l_d; long l_l; }; | |||
753 | 753 | ||
754 | 754 | ||
755 | /* | 755 | /* |
756 | @@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State | 756 | @@ LUAI_EXTRASPACE allows you to add user-specific data in a lua_State. |
757 | @* (the data goes just *before* the lua_State pointer). | 757 | @* (This data goes just *before* the lua_State pointer.) |
758 | ** CHANGE (define) this if you really need that. This value must be | 758 | ** CHANGE (define) this if you really need that. If defined, this value |
759 | ** a multiple of the maximum alignment required for your machine. | 759 | ** cannot be zero. |
760 | */ | 760 | */ |
761 | #define LUAI_EXTRASPACE 0 | 761 | /* #define LUAI_EXTRASPACE ?? */ |
762 | 762 | ||
763 | 763 | ||
764 | /* | 764 | /* |