diff options
Diffstat (limited to 'lstate.c')
-rw-r--r-- | lstate.c | 39 |
1 files changed, 26 insertions, 13 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstate.c,v 1.28 2000/06/30 14:35:17 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.29 2000/06/30 19:17:08 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 | */ |
@@ -28,8 +28,14 @@ lua_State *lua_state = NULL; | |||
28 | 28 | ||
29 | 29 | ||
30 | lua_State *lua_newstate (int stacksize, int put_builtin) { | 30 | lua_State *lua_newstate (int stacksize, int put_builtin) { |
31 | struct lua_longjmp myErrorJmp; | ||
31 | lua_State *L = luaM_new(NULL, lua_State); | 32 | lua_State *L = luaM_new(NULL, lua_State); |
32 | L->errorJmp = NULL; | 33 | if (L == NULL) return NULL; /* memory allocation error */ |
34 | L->stack = NULL; | ||
35 | L->strt.size = L->udt.size = 0; | ||
36 | L->strt.nuse = L->udt.nuse = 0; | ||
37 | L->strt.hash = NULL; | ||
38 | L->udt.hash = NULL; | ||
33 | L->Mbuffer = NULL; | 39 | L->Mbuffer = NULL; |
34 | L->Mbuffbase = 0; | 40 | L->Mbuffbase = 0; |
35 | L->Mbuffsize = 0; | 41 | L->Mbuffsize = 0; |
@@ -40,6 +46,7 @@ lua_State *lua_newstate (int stacksize, int put_builtin) { | |||
40 | L->rootcl = NULL; | 46 | L->rootcl = NULL; |
41 | L->roottable = NULL; | 47 | L->roottable = NULL; |
42 | L->IMtable = NULL; | 48 | L->IMtable = NULL; |
49 | L->last_tag = -1; | ||
43 | L->refArray = NULL; | 50 | L->refArray = NULL; |
44 | L->refSize = 0; | 51 | L->refSize = 0; |
45 | L->refFree = NONEXT; | 52 | L->refFree = NONEXT; |
@@ -49,16 +56,23 @@ lua_State *lua_newstate (int stacksize, int put_builtin) { | |||
49 | L->callhook = NULL; | 56 | L->callhook = NULL; |
50 | L->linehook = NULL; | 57 | L->linehook = NULL; |
51 | L->allowhooks = 1; | 58 | L->allowhooks = 1; |
52 | L->gt = luaH_new(L, 10); | 59 | L->errorJmp = &myErrorJmp; |
53 | if (stacksize == 0) stacksize = DEFAULT_STACK_SIZE; | 60 | if (setjmp(myErrorJmp.b) == 0) { /* to catch memory allocation errors */ |
54 | luaD_init(L, stacksize); | 61 | L->gt = luaH_new(L, 10); |
55 | luaS_init(L); | 62 | luaD_init(L, (stacksize == 0) ? DEFAULT_STACK_SIZE : stacksize); |
56 | luaX_init(L); | 63 | luaS_init(L); |
57 | luaT_init(L); | 64 | luaX_init(L); |
58 | if (put_builtin) | 65 | luaT_init(L); |
59 | luaB_predefine(L); | 66 | if (put_builtin) |
60 | L->GCthreshold = L->nblocks*4; | 67 | luaB_predefine(L); |
61 | return L; | 68 | L->GCthreshold = L->nblocks*4; |
69 | L->errorJmp = NULL; | ||
70 | return L; | ||
71 | } | ||
72 | else { /* memory allocation error: free partial state */ | ||
73 | lua_close(L); | ||
74 | return NULL; | ||
75 | } | ||
62 | } | 76 | } |
63 | 77 | ||
64 | 78 | ||
@@ -75,7 +89,6 @@ void lua_close (lua_State *L) { | |||
75 | luaM_free(L, L->Cblocks); | 89 | luaM_free(L, L->Cblocks); |
76 | LUA_ASSERT(L->numCblocks == 0, "Cblocks still open"); | 90 | LUA_ASSERT(L->numCblocks == 0, "Cblocks still open"); |
77 | LUA_ASSERT(L->nblocks == 0, "wrong count for nblocks"); | 91 | LUA_ASSERT(L->nblocks == 0, "wrong count for nblocks"); |
78 | LUA_ASSERT(L->Cstack.base == L->top, "C2Lua not empty"); | ||
79 | luaM_free(L, L); | 92 | luaM_free(L, L); |
80 | if (L == lua_state) { | 93 | if (L == lua_state) { |
81 | LUA_ASSERT(memdebug_numblocks == 0, "memory leak!"); | 94 | LUA_ASSERT(memdebug_numblocks == 0, "memory leak!"); |