?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2. ** $Id: lstate.h,v 2.82.1.1 2013/04/12 18:48:47 roberto Exp $
  3. ** Global State
  4. ** See Copyright Notice in lua.h
  5. */
  6.  
  7. #ifndef lstate_h
  8. #define lstate_h
  9.  
  10. #include "lua.h"
  11.  
  12. #include "lobject.h"
  13. #include "ltm.h"
  14. #include "lzio.h"
  15.  
  16.  
  17. /*
  18.  
  19. ** Some notes about garbage-collected objects:  All objects in Lua must
  20. ** be kept somehow accessible until being freed.
  21. **
  22. ** Lua keeps most objects linked in list g->allgc. The link uses field
  23. ** 'next' of the CommonHeader.
  24. **
  25. ** Strings are kept in several lists headed by the array g->strt.hash.
  26. **
  27. ** Open upvalues are not subject to independent garbage collection. They
  28. ** are collected together with their respective threads. Lua keeps a
  29. ** double-linked list with all open upvalues (g->uvhead) so that it can
  30. ** mark objects referred by them. (They are always gray, so they must
  31. ** be remarked in the atomic step. Usually their contents would be marked
  32. ** when traversing the respective threads, but the thread may already be
  33. ** dead, while the upvalue is still accessible through closures.)
  34. **
  35. ** Objects with finalizers are kept in the list g->finobj.
  36. **
  37. ** The list g->tobefnz links all objects being finalized.
  38.  
  39. */
  40.  
  41.  
  42. struct lua_longjmp;  /* defined in ldo.c */
  43.  
  44.  
  45.  
  46. /* extra stack space to handle TM calls and some other extras */
  47. #define EXTRA_STACK   5
  48.  
  49.  
  50. #define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
  51.  
  52.  
  53. /* kinds of Garbage Collection */
  54. #define KGC_NORMAL      0
  55. #define KGC_EMERGENCY   1       /* gc was forced by an allocation failure */
  56. #define KGC_GEN         2       /* generational collection */
  57.  
  58.  
  59. typedef struct stringtable {
  60.   GCObject **hash;
  61.   lu_int32 nuse;  /* number of elements */
  62.   int size;
  63. } stringtable;
  64.  
  65.  
  66. /*
  67. ** information about a call
  68. */
  69. typedef struct CallInfo {
  70.   StkId func;  /* function index in the stack */
  71.   StkId top;  /* top for this function */
  72.   struct CallInfo *previous, *next;  /* dynamic call link */
  73.   short nresults;  /* expected number of results from this function */
  74.   lu_byte callstatus;
  75.   ptrdiff_t extra;
  76.   union {
  77.     struct {  /* only for Lua functions */
  78.       StkId base;  /* base for this function */
  79.       const Instruction *savedpc;
  80.     } l;
  81.     struct {  /* only for C functions */
  82.       int ctx;  /* context info. in case of yields */
  83.       lua_CFunction k;  /* continuation in case of yields */
  84.       ptrdiff_t old_errfunc;
  85.       lu_byte old_allowhook;
  86.       lu_byte status;
  87.     } c;
  88.   } u;
  89. } CallInfo;
  90.  
  91.  
  92. /*
  93. ** Bits in CallInfo status
  94. */
  95. #define CIST_LUA        (1<<0)  /* call is running a Lua function */
  96. #define CIST_HOOKED     (1<<1)  /* call is running a debug hook */
  97. #define CIST_REENTRY    (1<<2)  /* call is running on same invocation of
  98.                                    luaV_execute of previous call */
  99. #define CIST_YIELDED    (1<<3)  /* call reentered after suspension */
  100. #define CIST_YPCALL     (1<<4)  /* call is a yieldable protected call */
  101. #define CIST_STAT       (1<<5)  /* call has an error status (pcall) */
  102. #define CIST_TAIL       (1<<6)  /* call was tail called */
  103. #define CIST_HOOKYIELD  (1<<7)  /* last hook called yielded */
  104.  
  105.  
  106. #define isLua(ci)       ((ci)->callstatus & CIST_LUA)
  107.  
  108.  
  109. /*
  110. ** `global state', shared by all threads of this state
  111. */
  112. typedef struct global_State {
  113.   lua_Alloc frealloc;  /* function to reallocate memory */
  114.   void *ud;         /* auxiliary data to `frealloc' */
  115.   lu_mem totalbytes;  /* number of bytes currently allocated - GCdebt */
  116.   l_mem GCdebt;  /* bytes allocated not yet compensated by the collector */
  117.   lu_mem GCmemtrav;  /* memory traversed by the GC */
  118.   lu_mem GCestimate;  /* an estimate of the non-garbage memory in use */
  119.   stringtable strt;  /* hash table for strings */
  120.   TValue l_registry;
  121.   unsigned int seed;  /* randomized seed for hashes */
  122.   lu_byte currentwhite;
  123.   lu_byte gcstate;  /* state of garbage collector */
  124.   lu_byte gckind;  /* kind of GC running */
  125.   lu_byte gcrunning;  /* true if GC is running */
  126.   int sweepstrgc;  /* position of sweep in `strt' */
  127.   GCObject *allgc;  /* list of all collectable objects */
  128.   GCObject *finobj;  /* list of collectable objects with finalizers */
  129.   GCObject **sweepgc;  /* current position of sweep in list 'allgc' */
  130.   GCObject **sweepfin;  /* current position of sweep in list 'finobj' */
  131.   GCObject *gray;  /* list of gray objects */
  132.   GCObject *grayagain;  /* list of objects to be traversed atomically */
  133.   GCObject *weak;  /* list of tables with weak values */
  134.   GCObject *ephemeron;  /* list of ephemeron tables (weak keys) */
  135.   GCObject *allweak;  /* list of all-weak tables */
  136.   GCObject *tobefnz;  /* list of userdata to be GC */
  137.   UpVal uvhead;  /* head of double-linked list of all open upvalues */
  138.   Mbuffer buff;  /* temporary buffer for string concatenation */
  139.   int gcpause;  /* size of pause between successive GCs */
  140.   int gcmajorinc;  /* pause between major collections (only in gen. mode) */
  141.   int gcstepmul;  /* GC `granularity' */
  142.   lua_CFunction panic;  /* to be called in unprotected errors */
  143.   struct lua_State *mainthread;
  144.   const lua_Number *version;  /* pointer to version number */
  145.   TString *memerrmsg;  /* memory-error message */
  146.   TString *tmname[TM_N];  /* array with tag-method names */
  147.   struct Table *mt[LUA_NUMTAGS];  /* metatables for basic types */
  148. } global_State;
  149.  
  150.  
  151. /*
  152. ** `per thread' state
  153. */
  154. struct lua_State {
  155.   CommonHeader;
  156.   lu_byte status;
  157.   StkId top;  /* first free slot in the stack */
  158.   global_State *l_G;
  159.   CallInfo *ci;  /* call info for current function */
  160.   const Instruction *oldpc;  /* last pc traced */
  161.   StkId stack_last;  /* last free slot in the stack */
  162.   StkId stack;  /* stack base */
  163.   int stacksize;
  164.   unsigned short nny;  /* number of non-yieldable calls in stack */
  165.   unsigned short nCcalls;  /* number of nested C calls */
  166.   lu_byte hookmask;
  167.   lu_byte allowhook;
  168.   int basehookcount;
  169.   int hookcount;
  170.   lua_Hook hook;
  171.   GCObject *openupval;  /* list of open upvalues in this stack */
  172.   GCObject *gclist;
  173.   struct lua_longjmp *errorJmp;  /* current error recover point */
  174.   ptrdiff_t errfunc;  /* current error handling function (stack index) */
  175.   CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
  176. };
  177.  
  178.  
  179. #define G(L)    (L->l_G)
  180.  
  181.  
  182. /*
  183. ** Union of all collectable objects
  184. */
  185. union GCObject {
  186.   GCheader gch;  /* common header */
  187.   union TString ts;
  188.   union Udata u;
  189.   union Closure cl;
  190.   struct Table h;
  191.   struct Proto p;
  192.   struct UpVal uv;
  193.   struct lua_State th;  /* thread */
  194. };
  195.  
  196.  
  197. #define gch(o)          (&(o)->gch)
  198.  
  199. /* macros to convert a GCObject into a specific value */
  200. #define rawgco2ts(o)  \
  201.         check_exp(novariant((o)->gch.tt) == LUA_TSTRING, &((o)->ts))
  202. #define gco2ts(o)       (&rawgco2ts(o)->tsv)
  203. #define rawgco2u(o)     check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u))
  204. #define gco2u(o)        (&rawgco2u(o)->uv)
  205. #define gco2lcl(o)      check_exp((o)->gch.tt == LUA_TLCL, &((o)->cl.l))
  206. #define gco2ccl(o)      check_exp((o)->gch.tt == LUA_TCCL, &((o)->cl.c))
  207. #define gco2cl(o)  \
  208.         check_exp(novariant((o)->gch.tt) == LUA_TFUNCTION, &((o)->cl))
  209. #define gco2t(o)        check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h))
  210. #define gco2p(o)        check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p))
  211. #define gco2uv(o)       check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv))
  212. #define gco2th(o)       check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th))
  213.  
  214. /* macro to convert any Lua object into a GCObject */
  215. #define obj2gco(v)      (cast(GCObject *, (v)))
  216.  
  217.  
  218. /* actual number of total bytes allocated */
  219. #define gettotalbytes(g)        ((g)->totalbytes + (g)->GCdebt)
  220.  
  221. LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
  222. LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
  223. LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
  224. LUAI_FUNC void luaE_freeCI (lua_State *L);
  225.  
  226.  
  227. #endif
  228.  
  229.