/* ** $Id: lstate.c,v 1.23 1999/12/21 18:04:41 roberto Exp roberto $ ** Global State ** See Copyright Notice in lua.h */ #include #define LUA_REENTRANT #include "lauxlib.h" #include "lbuiltin.h" #include "ldo.h" #include "lgc.h" #include "llex.h" #include "lmem.h" #include "lref.h" #include "lstate.h" #include "lstring.h" #include "ltm.h" #ifndef DEFAULT_STACK_SIZE #define DEFAULT_STACK_SIZE 1024 #endif lua_State *lua_state = NULL; static lua_State *newstate_aux (int stacksize, int put_builtin) { lua_State *L = luaM_new(NULL, lua_State); L->errorJmp = NULL; L->Mbuffer = NULL; L->Mbuffbase = 0; L->Mbuffsize = 0; L->Mbuffnext = 0; L->Cblocks = NULL; L->numCblocks = 0; L->rootproto = NULL; L->rootcl = NULL; L->rootglobal = NULL; L->roottable = NULL; L->IMtable = NULL; L->refArray = NULL; L->refSize = 0; L->refFree = NONEXT; L->nblocks = 0; L->GCthreshold = MAX_INT; /* to avoid GC during pre-definitions */ L->debug = 0; L->callhook = NULL; L->linehook = NULL; L->allowhooks = 1; luaD_init(L, stacksize); luaS_init(L); luaX_init(L); luaT_init(L); if (put_builtin) luaB_predefine(L); L->GCthreshold = L->nblocks*4; return L; } lua_State *lua_newstate (const char *s, ...) { static const char *const ops[] = {"stack", "builtin", NULL}; va_list ap; int stacksize = DEFAULT_STACK_SIZE; int put_builtin = 1; va_start(ap, s); while (s) { switch (luaL_findstring(s, ops)) { case 0: /* stack */ stacksize = va_arg(ap, int); break; case 1: /* builtin */ put_builtin = va_arg(ap, int); break; default: /* invalid argument */ va_end(ap); return NULL; } s = va_arg(ap, const char *); } va_end(ap); return newstate_aux(stacksize, put_builtin); } void lua_close (lua_State *L) { luaC_collect(L, 1); /* collect all elements */ LUA_ASSERT(L, L->rootproto == NULL, "list should be empty"); LUA_ASSERT(L, L->rootcl == NULL, "list should be empty"); LUA_ASSERT(L, L->rootglobal == NULL, "list should be empty"); LUA_ASSERT(L, L->roottable == NULL, "list should be empty"); luaS_freeall(L); luaM_free(L, L->stack); luaM_free(L, L->IMtable); luaM_free(L, L->refArray); luaM_free(L, L->Mbuffer); luaM_free(L, L->Cblocks); LUA_ASSERT(L, L->numCblocks == 0, "Cblocks still open"); LUA_ASSERT(L, L->nblocks == 0, "wrong count for nblocks"); LUA_ASSERT(L, L->Cstack.base == L->top, "C2Lua not empty"); luaM_free(L, L); if (L == lua_state) { LUA_ASSERT(L, memdebug_numblocks == 0, "memory leak!"); LUA_ASSERT(L, memdebug_total == 0,"memory leak!"); lua_state = NULL; } }