瀏覽代碼

global state for Lua interpreter

Roberto Ierusalimschy 28 年之前
父節點
當前提交
b79ffdc4ce
共有 2 個文件被更改,包括 134 次插入0 次删除
  1. 52 0
      lstate.c
  2. 82 0
      lstate.h

+ 52 - 0
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();
+}
+

+ 82 - 0
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