mirror of https://github.com/lua/lua.git
Roberto Ierusalimschy
27 years ago
2 changed files with 134 additions and 0 deletions
@ -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(); |
|||
} |
|||
|
@ -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 |
Loading…
Reference in new issue