diff options
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 61 |
1 files changed, 47 insertions, 14 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 2.49 2009/02/18 17:20:56 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.50 2009/03/10 17:14:37 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 | */ |
@@ -40,12 +40,41 @@ typedef struct LG { | |||
40 | 40 | ||
41 | 41 | ||
42 | 42 | ||
43 | /* | ||
44 | ** maximum number of nested calls made by error-handling function | ||
45 | */ | ||
46 | #define LUAI_EXTRACALLS 10 | ||
47 | |||
48 | |||
49 | CallInfo *luaE_extendCI (lua_State *L) { | ||
50 | CallInfo *ci = luaM_new(L, CallInfo); | ||
51 | lua_assert(L->ci->next == NULL); | ||
52 | L->ci->next = ci; | ||
53 | ci->previous = L->ci; | ||
54 | ci->next = NULL; | ||
55 | if (++L->nci >= LUAI_MAXCALLS) { | ||
56 | if (L->nci == LUAI_MAXCALLS) /* overflow? */ | ||
57 | luaG_runerror(L, "stack overflow"); | ||
58 | if (L->nci >= LUAI_MAXCALLS + LUAI_EXTRACALLS) /* again? */ | ||
59 | luaD_throw(L, LUA_ERRERR); /* error while handling overflow */ | ||
60 | } | ||
61 | return ci; | ||
62 | } | ||
63 | |||
64 | |||
65 | void luaE_freeCI (lua_State *L) { | ||
66 | CallInfo *ci = L->ci; | ||
67 | CallInfo *next = ci->next; | ||
68 | ci->next = NULL; | ||
69 | while ((ci = next) != NULL) { | ||
70 | next = ci->next; | ||
71 | luaM_free(L, ci); | ||
72 | L->nci--; | ||
73 | } | ||
74 | } | ||
75 | |||
76 | |||
43 | static void stack_init (lua_State *L1, lua_State *L) { | 77 | static void stack_init (lua_State *L1, lua_State *L) { |
44 | /* initialize CallInfo array */ | ||
45 | L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); | ||
46 | L1->ci = L1->base_ci; | ||
47 | L1->size_ci = BASIC_CI_SIZE; | ||
48 | L1->end_ci = L1->base_ci + L1->size_ci - 1; | ||
49 | /* initialize stack array */ | 78 | /* initialize stack array */ |
50 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); | 79 | L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TValue); |
51 | L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; | 80 | L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; |
@@ -53,16 +82,18 @@ static void stack_init (lua_State *L1, lua_State *L) { | |||
53 | L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; | 82 | L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; |
54 | /* initialize first ci */ | 83 | /* initialize first ci */ |
55 | L1->ci->func = L1->top; | 84 | L1->ci->func = L1->top; |
56 | setnilvalue(L1->top++); /* `function' entry for this `ci' */ | 85 | setnilvalue(L1->top++); /* 'function' entry for this 'ci' */ |
57 | L1->base = L1->ci->base = L1->top; | 86 | L1->base = L1->ci->base = L1->top; |
58 | L1->ci->top = L1->top + LUA_MINSTACK; | 87 | L1->ci->top = L1->top + LUA_MINSTACK; |
59 | L1->ci->callstatus = 0; | 88 | L1->ci->callstatus = 0; |
60 | } | 89 | } |
61 | 90 | ||
62 | 91 | ||
63 | static void freestack (lua_State *L, lua_State *L1) { | 92 | static void freestack (lua_State *L) { |
64 | luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); | 93 | L->ci = &L->base_ci; /* reset 'ci' list */ |
65 | luaM_freearray(L, L1->stack, L1->stacksize, TValue); | 94 | luaE_freeCI(L); |
95 | lua_assert(L->nci == 0); | ||
96 | luaM_freearray(L, L->stack, L->stacksize, TValue); | ||
66 | } | 97 | } |
67 | 98 | ||
68 | 99 | ||
@@ -94,10 +125,11 @@ static void preinit_state (lua_State *L, global_State *g) { | |||
94 | L->allowhook = 1; | 125 | L->allowhook = 1; |
95 | resethookcount(L); | 126 | resethookcount(L); |
96 | L->openupval = NULL; | 127 | L->openupval = NULL; |
97 | L->size_ci = 0; | ||
98 | L->nny = 1; | 128 | L->nny = 1; |
99 | L->status = LUA_OK; | 129 | L->status = LUA_OK; |
100 | L->base_ci = L->ci = NULL; | 130 | L->base_ci.next = L->base_ci.previous = NULL; |
131 | L->ci = &L->base_ci; | ||
132 | L->nci = 0; | ||
101 | L->savedpc = NULL; | 133 | L->savedpc = NULL; |
102 | L->errfunc = 0; | 134 | L->errfunc = 0; |
103 | setnilvalue(gt(L)); | 135 | setnilvalue(gt(L)); |
@@ -110,7 +142,7 @@ static void close_state (lua_State *L) { | |||
110 | luaC_freeall(L); /* collect all objects */ | 142 | luaC_freeall(L); /* collect all objects */ |
111 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); | 143 | luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); |
112 | luaZ_freebuffer(L, &g->buff); | 144 | luaZ_freebuffer(L, &g->buff); |
113 | freestack(L, L); | 145 | freestack(L); |
114 | lua_assert(g->totalbytes == sizeof(LG)); | 146 | lua_assert(g->totalbytes == sizeof(LG)); |
115 | (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); | 147 | (*g->frealloc)(g->ud, fromstate(L), state_size(LG), 0); |
116 | } | 148 | } |
@@ -142,7 +174,7 @@ void luaE_freethread (lua_State *L, lua_State *L1) { | |||
142 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ | 174 | luaF_close(L1, L1->stack); /* close all upvalues for this thread */ |
143 | lua_assert(L1->openupval == NULL); | 175 | lua_assert(L1->openupval == NULL); |
144 | luai_userstatefree(L1); | 176 | luai_userstatefree(L1); |
145 | freestack(L, L1); | 177 | freestack(L1); |
146 | luaM_freemem(L, fromstate(L1), state_size(lua_State)); | 178 | luaM_freemem(L, fromstate(L1), state_size(lua_State)); |
147 | } | 179 | } |
148 | 180 | ||
@@ -211,3 +243,4 @@ LUA_API void lua_close (lua_State *L) { | |||
211 | close_state(L); | 243 | close_state(L); |
212 | } | 244 | } |
213 | 245 | ||
246 | |||