aboutsummaryrefslogtreecommitdiff
path: root/lstate.c
diff options
context:
space:
mode:
Diffstat (limited to 'lstate.c')
-rw-r--r--lstate.c39
1 files changed, 26 insertions, 13 deletions
diff --git a/lstate.c b/lstate.c
index 34c86bb1..2d7de542 100644
--- a/lstate.c
+++ b/lstate.c
@@ -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
30lua_State *lua_newstate (int stacksize, int put_builtin) { 30lua_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!");