From b79ffdc4cef96ababe0cc068a6c11afdc71782eb Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 19 Nov 1997 15:31:19 -0200 Subject: [PATCH] global state for Lua interpreter --- lstate.c | 52 +++++++++++++++++++++++++++++++++++ lstate.h | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 lstate.c create mode 100644 lstate.h diff --git a/lstate.c b/lstate.c new file mode 100644 index 00000000..653c4ba3 --- /dev/null +++ b/lstate.c @@ -0,0 +1,52 @@ +/* +** $Id: $ +** Global State +** See Copyright Notice in lua.h +*/ + + +#include "lbuiltin.h" +#include "ldo.h" +#include "llex.h" +#include "lmem.h" +#include "lstate.h" +#include "lstring.h" +#include "ltable.h" +#include "ltm.h" + + +LState *lua_state = NULL; + + +void lua_open (void) +{ + if (lua_state) return; + lua_state = luaM_new(LState); + L->numCblocks = 0; + L->Cstack.base = 0; + L->Cstack.lua2C = 0; + L->Cstack.num = 0; + L->errorJmp = NULL; + L->rootproto.next = NULL; + L->rootproto.marked = 0; + L->rootcl.next = NULL; + L->rootcl.marked = 0; + L->rootglobal.next = NULL; + L->rootglobal.marked = 0; + L->roottable.next = NULL; + L->roottable.marked = 0; + L->refArray = NULL; + L->refSize = 0; + L->Mbuffsize = 0; + L->Mbuffer = NULL; + L->GCthreshold = GARBAGE_BLOCK; + L->nblocks = 0; + luaD_init(); + luaS_init(); + luaX_init(); + luaT_init(); + L->globalbag.ttype = LUA_T_ARRAY; + L->globalbag.value.a = luaH_new(0); + luaB_predefine(); +} + diff --git a/lstate.h b/lstate.h new file mode 100644 index 00000000..45897d5b --- /dev/null +++ b/lstate.h @@ -0,0 +1,82 @@ +/* +** $Id: $ +** Global State +** See Copyright Notice in lua.h +*/ + +#ifndef lstate_h +#define lstate_h + +#include "lobject.h" + + +#define MAX_C_BLOCKS 10 + +#define GARBAGE_BLOCK 150 + + +typedef int StkId; /* index to stack elements */ + +struct Stack { + TObject *last; + TObject *stack; + TObject *top; +}; + +struct C_Lua_Stack { + StkId base; /* when Lua calls C or C calls Lua, points to */ + /* the first slot after the last parameter. */ + StkId lua2C; /* points to first element of "array" lua2C */ + int num; /* size of "array" lua2C */ +}; + + +typedef struct { + int size; + int nuse; /* number of elements (including EMPTYs) */ + TaggedString **hash; +} stringtable; + + +struct ref { + TObject o; + enum {LOCK, HOLD, FREE, COLLECTED} status; +}; + + +typedef struct LState { + struct C_Lua_Stack Cblocks[MAX_C_BLOCKS]; + int numCblocks; /* number of nested Cblocks */ + TObject *functofind; /* auxiliar */ + struct Stack stack; /* Lua stack */ + struct C_Lua_Stack Cstack; /* C2lua struct */ + int stacklimit; /* limit for stack overflow */ + void *errorJmp; /* current error recover point */ + TObject errorim; /* error tag method */ + GCnode rootproto; /* list of all prototypes */ + GCnode rootcl; /* list of all closures */ + GCnode roottable; /* list of all tables */ + GCnode rootglobal; /* list of strings with global values */ + stringtable *string_root; /* array of hash tables for strings and udata */ + struct IM *IMtable; /* table for tag methods */ + int IMtable_size; /* size of IMtable */ + int last_tag; /* last used tag in IMtable */ + struct FuncState *mainState, *currState; /* point to local structs in yacc */ + struct LexState *lexstate; /* point to local struct in yacc */ + struct ref *refArray; /* locked objects */ + int refSize; /* size of refArray */ + unsigned long GCthreshold; + unsigned long nblocks; /* number of 'blocks' currently allocated */ + TObject globalbag; /* table for generic use by C */ + char *Mbuffer; /* global buffer, used by luaM_buffer */ + unsigned long Mbuffsize; /* size of Mbuffer */ +} LState; + + +extern LState *lua_state; + + +#define L lua_state + + +#endif