diff options
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 23 |
1 files changed, 15 insertions, 8 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 1.98 2002/07/08 18:21:33 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.99 2002/07/16 14:26:56 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 | */ |
@@ -35,17 +35,19 @@ static int default_panic (lua_State *L) { | |||
35 | 35 | ||
36 | 36 | ||
37 | static void stack_init (lua_State *L, lua_State *OL) { | 37 | static void stack_init (lua_State *L, lua_State *OL) { |
38 | L->stack = luaM_newvector(OL, BASIC_STACK_SIZE, TObject); | 38 | L->stack = luaM_newvector(OL, BASIC_STACK_SIZE + EXTRA_STACK, TObject); |
39 | L->stacksize = BASIC_STACK_SIZE; | 39 | L->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; |
40 | L->top = L->stack; | 40 | L->top = L->stack; |
41 | L->stack_last = L->stack+(BASIC_STACK_SIZE-EXTRA_STACK)-1; | 41 | L->stack_last = L->stack+(L->stacksize - EXTRA_STACK)-1; |
42 | L->base_ci = luaM_newvector(OL, BASIC_CI_SIZE, CallInfo); | 42 | L->base_ci = luaM_newvector(OL, BASIC_CI_SIZE, CallInfo); |
43 | L->ci = L->base_ci; | 43 | L->ci = L->base_ci; |
44 | L->ci->savedpc = NULL; | 44 | L->ci->pc = NULL; /* not a Lua function */ |
45 | L->ci->base = L->top; | 45 | L->ci->base = L->top; |
46 | L->ci->top = L->top + LUA_MINSTACK; | 46 | L->ci->top = L->top + LUA_MINSTACK; |
47 | L->size_ci = BASIC_CI_SIZE; | 47 | L->size_ci = BASIC_CI_SIZE; |
48 | L->end_ci = L->base_ci + L->size_ci; | 48 | L->end_ci = L->base_ci + L->size_ci; |
49 | L->toreset = luaM_newvector(OL, 2, Protection); | ||
50 | L->size_toreset = 2; | ||
49 | } | 51 | } |
50 | 52 | ||
51 | 53 | ||
@@ -98,7 +100,12 @@ static void preinit_state (lua_State *L) { | |||
98 | resethookcount(L); | 100 | resethookcount(L); |
99 | L->openupval = NULL; | 101 | L->openupval = NULL; |
100 | L->size_ci = 0; | 102 | L->size_ci = 0; |
101 | L->base_ci = NULL; | 103 | L->base_ci = L->ci = NULL; |
104 | L->toreset = NULL; | ||
105 | L->size_toreset = L->number_toreset = 0; | ||
106 | setnilvalue(defaultmeta(L)); | ||
107 | setnilvalue(gt(L)); | ||
108 | setnilvalue(registry(L)); | ||
102 | } | 109 | } |
103 | 110 | ||
104 | 111 | ||
@@ -124,13 +131,12 @@ LUA_API lua_State *lua_newthread (lua_State *OL) { | |||
124 | 131 | ||
125 | LUA_API lua_State *lua_open (void) { | 132 | LUA_API lua_State *lua_open (void) { |
126 | lua_State *L; | 133 | lua_State *L; |
127 | TObject dummy[2]; | ||
128 | L = luaM_new(NULL, lua_State); | 134 | L = luaM_new(NULL, lua_State); |
129 | if (L) { /* allocation OK? */ | 135 | if (L) { /* allocation OK? */ |
130 | preinit_state(L); | 136 | preinit_state(L); |
131 | L->l_G = NULL; | 137 | L->l_G = NULL; |
132 | L->next = L->previous = L; | 138 | L->next = L->previous = L; |
133 | if (luaD_runprotected(L, f_luaopen, dummy) != 0) { | 139 | if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { |
134 | /* memory allocation error: free partial state */ | 140 | /* memory allocation error: free partial state */ |
135 | close_state(L); | 141 | close_state(L); |
136 | L = NULL; | 142 | L = NULL; |
@@ -147,6 +153,7 @@ void luaE_closethread (lua_State *OL, lua_State *L) { | |||
147 | L->previous->next = L->next; | 153 | L->previous->next = L->next; |
148 | L->next->previous = L->previous; | 154 | L->next->previous = L->previous; |
149 | luaM_freearray(OL, L->base_ci, L->size_ci, CallInfo); | 155 | luaM_freearray(OL, L->base_ci, L->size_ci, CallInfo); |
156 | luaM_freearray(OL, L->toreset, L->size_toreset, Protection); | ||
150 | luaM_freearray(OL, L->stack, L->stacksize, TObject); | 157 | luaM_freearray(OL, L->stack, L->stacksize, TObject); |
151 | luaM_freelem(OL, L); | 158 | luaM_freelem(OL, L); |
152 | } | 159 | } |