aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c61
1 files changed, 47 insertions, 14 deletions
diff --git a/lstate.c b/lstate.c
index df62f3e3..f9aa89c5 100644
--- a/lstate.c
+++ b/lstate.c
@@ -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
49CallInfo *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
65void 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
43static void stack_init (lua_State *L1, lua_State *L) { 77static 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
63static void freestack (lua_State *L, lua_State *L1) { 92static 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