diff options
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 51 |
1 files changed, 22 insertions, 29 deletions
@@ -1,11 +1,11 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 1.125 2003/07/16 20:51:47 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.126 2003/09/04 20:19:07 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 | */ |
6 | 6 | ||
7 | 7 | ||
8 | #include <stdlib.h> | 8 | #include <stddef.h> |
9 | 9 | ||
10 | #define lstate_c | 10 | #define lstate_c |
11 | 11 | ||
@@ -34,6 +34,11 @@ union UEXTRASPACE {L_Umaxalign a; LUA_USERSTATE b;}; | |||
34 | #endif | 34 | #endif |
35 | 35 | ||
36 | 36 | ||
37 | #define state_size(x) (sizeof(x) + EXTRASPACE) | ||
38 | #define tostate(l) (cast(lua_State *, cast(lu_byte *, l) + EXTRASPACE)) | ||
39 | #define fromstate(l) (cast(lu_byte *, (l)) - EXTRASPACE) | ||
40 | |||
41 | |||
37 | /* | 42 | /* |
38 | ** Main thread combines a thread state and the global state | 43 | ** Main thread combines a thread state and the global state |
39 | */ | 44 | */ |
@@ -44,23 +49,6 @@ typedef struct LG { | |||
44 | 49 | ||
45 | 50 | ||
46 | 51 | ||
47 | |||
48 | static lua_State *mallocstate (lua_State *L, size_t size) { | ||
49 | lu_byte *block = (lu_byte *)luaM_malloc(L, size + EXTRASPACE); | ||
50 | if (block == NULL) return NULL; | ||
51 | else { | ||
52 | block += EXTRASPACE; | ||
53 | return cast(lua_State *, block); | ||
54 | } | ||
55 | } | ||
56 | |||
57 | |||
58 | static void freestate (lua_State *L, lua_State *L1, size_t size) { | ||
59 | luaM_free(L, cast(lu_byte *, L1) - EXTRASPACE, | ||
60 | size + EXTRASPACE); | ||
61 | } | ||
62 | |||
63 | |||
64 | static void stack_init (lua_State *L1, lua_State *L) { | 52 | static void stack_init (lua_State *L1, lua_State *L) { |
65 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TObject); | 53 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TObject); |
66 | L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; | 54 | L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; |
@@ -122,20 +110,21 @@ static void preinit_state (lua_State *L) { | |||
122 | 110 | ||
123 | 111 | ||
124 | static void close_state (lua_State *L) { | 112 | static void close_state (lua_State *L) { |
113 | global_State *g = G(L); | ||
125 | luaF_close(L, L->stack); /* close all upvalues for this thread */ | 114 | luaF_close(L, L->stack); /* close all upvalues for this thread */ |
126 | luaC_sweep(L, 1); /* collect all elements */ | 115 | luaC_sweep(L, 1); /* collect all elements */ |
127 | lua_assert(G(L)->rootgc == NULL); | 116 | lua_assert(g->rootgc == NULL); |
128 | lua_assert(G(L)->rootudata == NULL); | 117 | lua_assert(g->rootudata == NULL); |
129 | luaS_freeall(L); | 118 | luaS_freeall(L); |
130 | luaZ_freebuffer(L, &G(L)->buff); | 119 | luaZ_freebuffer(L, &g->buff); |
131 | freestack(L, L); | 120 | freestack(L, L); |
132 | lua_assert(G(L)->nblocks == sizeof(LG)); | 121 | lua_assert(g->nblocks == sizeof(LG)); |
133 | freestate(NULL, L, sizeof(LG)); | 122 | (*g->realloc)(g->ud, fromstate(L), state_size(LG), 0); |
134 | } | 123 | } |
135 | 124 | ||
136 | 125 | ||
137 | lua_State *luaE_newthread (lua_State *L) { | 126 | lua_State *luaE_newthread (lua_State *L) { |
138 | lua_State *L1 = mallocstate(L, sizeof(lua_State)); | 127 | lua_State *L1 = tostate(luaM_malloc(L, state_size(lua_State))); |
139 | luaC_link(L, valtogco(L1), LUA_TTHREAD); | 128 | luaC_link(L, valtogco(L1), LUA_TTHREAD); |
140 | preinit_state(L1); | 129 | preinit_state(L1); |
141 | L1->l_G = L->l_G; | 130 | L1->l_G = L->l_G; |
@@ -149,20 +138,24 @@ void luaE_freethread (lua_State *L, lua_State *L1) { | |||
149 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ | 138 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ |
150 | lua_assert(L1->openupval == NULL); | 139 | lua_assert(L1->openupval == NULL); |
151 | freestack(L, L1); | 140 | freestack(L, L1); |
152 | freestate(L, L1, sizeof(lua_State)); | 141 | luaM_free(L, fromstate(L1), state_size(lua_State)); |
153 | } | 142 | } |
154 | 143 | ||
155 | 144 | ||
156 | LUA_API lua_State *lua_open (void) { | 145 | LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) { |
157 | lua_State *L = mallocstate(NULL, sizeof(LG)); | 146 | lua_State *L; |
158 | global_State *g; | 147 | global_State *g; |
159 | if (L == NULL) return NULL; | 148 | void *l = (*f)(ud, NULL, 0, state_size(LG)); |
149 | if (l == NULL) return NULL; | ||
150 | L = tostate(l); | ||
160 | g = &((LG *)L)->g; | 151 | g = &((LG *)L)->g; |
161 | L->tt = LUA_TTHREAD; | 152 | L->tt = LUA_TTHREAD; |
162 | L->marked = 0; | 153 | L->marked = 0; |
163 | L->next = L->gclist = NULL; | 154 | L->next = L->gclist = NULL; |
164 | preinit_state(L); | 155 | preinit_state(L); |
165 | L->l_G = g; | 156 | L->l_G = g; |
157 | g->realloc = f; | ||
158 | g->ud = ud; | ||
166 | g->mainthread = L; | 159 | g->mainthread = L; |
167 | g->GCthreshold = 0; /* mark it as unfinished state */ | 160 | g->GCthreshold = 0; /* mark it as unfinished state */ |
168 | g->strt.size = 0; | 161 | g->strt.size = 0; |