?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. /*
  2. ** $Id: lstate.h,v 2.133.1.1 2017/04/19 17:39:34 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, so all objects always
  21. ** belong to one (and only one) of these lists, using field 'next' of
  22. ** the 'CommonHeader' for the link:
  23. **
  24. ** 'allgc': all objects not marked for finalization;
  25. ** 'finobj': all objects marked for finalization;
  26. ** 'tobefnz': all objects ready to be finalized;
  27. ** 'fixedgc': all objects that are not to be collected (currently
  28. ** only small strings, such as reserved words).
  29. **
  30. ** Moreover, there is another set of lists that control gray objects.
  31. ** These lists are linked by fields 'gclist'. (All objects that
  32. ** can become gray have such a field. The field is not the same
  33. ** in all objects, but it always has this name.)  Any gray object
  34. ** must belong to one of these lists, and all objects in these lists
  35. ** must be gray:
  36. **
  37. ** 'gray': regular gray objects, still waiting to be visited.
  38. ** 'grayagain': objects that must be revisited at the atomic phase.
  39. **   That includes
  40. **   - black objects got in a write barrier;
  41. **   - all kinds of weak tables during propagation phase;
  42. **   - all threads.
  43. ** 'weak': tables with weak values to be cleared;
  44. ** 'ephemeron': ephemeron tables with white->white entries;
  45. ** 'allweak': tables with weak keys and/or weak values to be cleared.
  46. ** The last three lists are used only during the atomic phase.
  47.  
  48. */
  49.  
  50.  
  51. struct lua_longjmp;  /* defined in ldo.c */
  52.  
  53.  
  54. /*
  55. ** Atomic type (relative to signals) to better ensure that 'lua_sethook'
  56. ** is thread safe
  57. */
  58. #if !defined(l_signalT)
  59. #include <signal.h>
  60. #define l_signalT       sig_atomic_t
  61. #endif
  62.  
  63.  
  64. /* extra stack space to handle TM calls and some other extras */
  65. #define EXTRA_STACK   5
  66.  
  67.  
  68. #define BASIC_STACK_SIZE        (2*LUA_MINSTACK)
  69.  
  70.  
  71. /* kinds of Garbage Collection */
  72. #define KGC_NORMAL      0
  73. #define KGC_EMERGENCY   1       /* gc was forced by an allocation failure */
  74.  
  75.  
  76. typedef struct stringtable {
  77.   TString **hash;
  78.   int nuse;  /* number of elements */
  79.   int size;
  80. } stringtable;
  81.  
  82.  
  83. /*
  84. ** Information about a call.
  85. ** When a thread yields, 'func' is adjusted to pretend that the
  86. ** top function has only the yielded values in its stack; in that
  87. ** case, the actual 'func' value is saved in field 'extra'.
  88. ** When a function calls another with a continuation, 'extra' keeps
  89. ** the function index so that, in case of errors, the continuation
  90. ** function can be called with the correct top.
  91. */
  92. typedef struct CallInfo {
  93.   StkId func;  /* function index in the stack */
  94.   StkId top;  /* top for this function */
  95.   struct CallInfo *previous, *next;  /* dynamic call link */
  96.   union {
  97.     struct {  /* only for Lua functions */
  98.       StkId base;  /* base for this function */
  99.       const Instruction *savedpc;
  100.     } l;
  101.     struct {  /* only for C functions */
  102.       lua_KFunction k;  /* continuation in case of yields */
  103.       ptrdiff_t old_errfunc;
  104.       lua_KContext ctx;  /* context info. in case of yields */
  105.     } c;
  106.   } u;
  107.   ptrdiff_t extra;
  108.   short nresults;  /* expected number of results from this function */
  109.   unsigned short callstatus;
  110. } CallInfo;
  111.  
  112.  
  113. /*
  114. ** Bits in CallInfo status
  115. */
  116. #define CIST_OAH        (1<<0)  /* original value of 'allowhook' */
  117. #define CIST_LUA        (1<<1)  /* call is running a Lua function */
  118. #define CIST_HOOKED     (1<<2)  /* call is running a debug hook */
  119. #define CIST_FRESH      (1<<3)  /* call is running on a fresh invocation
  120.                                    of luaV_execute */
  121. #define CIST_YPCALL     (1<<4)  /* call is a yieldable protected call */
  122. #define CIST_TAIL       (1<<5)  /* call was tail called */
  123. #define CIST_HOOKYIELD  (1<<6)  /* last hook called yielded */
  124. #define CIST_LEQ        (1<<7)  /* using __lt for __le */
  125. #define CIST_FIN        (1<<8)  /* call is running a finalizer */
  126.  
  127. #define isLua(ci)       ((ci)->callstatus & CIST_LUA)
  128.  
  129. /* assume that CIST_OAH has offset 0 and that 'v' is strictly 0/1 */
  130. #define setoah(st,v)    ((st) = ((st) & ~CIST_OAH) | (v))
  131. #define getoah(st)      ((st) & CIST_OAH)
  132.  
  133.  
  134. /*
  135. ** 'global state', shared by all threads of this state
  136. */
  137. typedef struct global_State {
  138.   lua_Alloc frealloc;  /* function to reallocate memory */
  139.   void *ud;         /* auxiliary data to 'frealloc' */
  140.   l_mem totalbytes;  /* number of bytes currently allocated - GCdebt */
  141.   l_mem GCdebt;  /* bytes allocated not yet compensated by the collector */
  142.   lu_mem GCmemtrav;  /* memory traversed by the GC */
  143.   lu_mem GCestimate;  /* an estimate of the non-garbage memory in use */
  144.   stringtable strt;  /* hash table for strings */
  145.   TValue l_registry;
  146.   unsigned int seed;  /* randomized seed for hashes */
  147.   lu_byte currentwhite;
  148.   lu_byte gcstate;  /* state of garbage collector */
  149.   lu_byte gckind;  /* kind of GC running */
  150.   lu_byte gcrunning;  /* true if GC is running */
  151.   GCObject *allgc;  /* list of all collectable objects */
  152.   GCObject **sweepgc;  /* current position of sweep in list */
  153.   GCObject *finobj;  /* list of collectable objects with finalizers */
  154.   GCObject *gray;  /* list of gray objects */
  155.   GCObject *grayagain;  /* list of objects to be traversed atomically */
  156.   GCObject *weak;  /* list of tables with weak values */
  157.   GCObject *ephemeron;  /* list of ephemeron tables (weak keys) */
  158.   GCObject *allweak;  /* list of all-weak tables */
  159.   GCObject *tobefnz;  /* list of userdata to be GC */
  160.   GCObject *fixedgc;  /* list of objects not to be collected */
  161.   struct lua_State *twups;  /* list of threads with open upvalues */
  162.   unsigned int gcfinnum;  /* number of finalizers to call in each GC step */
  163.   int gcpause;  /* size of pause between successive GCs */
  164.   int gcstepmul;  /* GC 'granularity' */
  165.   lua_CFunction panic;  /* to be called in unprotected errors */
  166.   struct lua_State *mainthread;
  167.   const lua_Number *version;  /* pointer to version number */
  168.   TString *memerrmsg;  /* memory-error message */
  169.   TString *tmname[TM_N];  /* array with tag-method names */
  170.   struct Table *mt[LUA_NUMTAGS];  /* metatables for basic types */
  171.   TString *strcache[STRCACHE_N][STRCACHE_M];  /* cache for strings in API */
  172. } global_State;
  173.  
  174.  
  175. /*
  176. ** 'per thread' state
  177. */
  178. struct lua_State {
  179.   CommonHeader;
  180.   unsigned short nci;  /* number of items in 'ci' list */
  181.   lu_byte status;
  182.   StkId top;  /* first free slot in the stack */
  183.   global_State *l_G;
  184.   CallInfo *ci;  /* call info for current function */
  185.   const Instruction *oldpc;  /* last pc traced */
  186.   StkId stack_last;  /* last free slot in the stack */
  187.   StkId stack;  /* stack base */
  188.   UpVal *openupval;  /* list of open upvalues in this stack */
  189.   GCObject *gclist;
  190.   struct lua_State *twups;  /* list of threads with open upvalues */
  191.   struct lua_longjmp *errorJmp;  /* current error recover point */
  192.   CallInfo base_ci;  /* CallInfo for first level (C calling Lua) */
  193.   volatile lua_Hook hook;
  194.   ptrdiff_t errfunc;  /* current error handling function (stack index) */
  195.   int stacksize;
  196.   int basehookcount;
  197.   int hookcount;
  198.   unsigned short nny;  /* number of non-yieldable calls in stack */
  199.   unsigned short nCcalls;  /* number of nested C calls */
  200.   l_signalT hookmask;
  201.   lu_byte allowhook;
  202. };
  203.  
  204.  
  205. #define G(L)    (L->l_G)
  206.  
  207.  
  208. /*
  209. ** Union of all collectable objects (only for conversions)
  210. */
  211. union GCUnion {
  212.   GCObject gc;  /* common header */
  213.   struct TString ts;
  214.   struct Udata u;
  215.   union Closure cl;
  216.   struct Table h;
  217.   struct Proto p;
  218.   struct lua_State th;  /* thread */
  219. };
  220.  
  221.  
  222. #define cast_u(o)       cast(union GCUnion *, (o))
  223.  
  224. /* macros to convert a GCObject into a specific value */
  225. #define gco2ts(o)  \
  226.         check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts))
  227. #define gco2u(o)  check_exp((o)->tt == LUA_TUSERDATA, &((cast_u(o))->u))
  228. #define gco2lcl(o)  check_exp((o)->tt == LUA_TLCL, &((cast_u(o))->cl.l))
  229. #define gco2ccl(o)  check_exp((o)->tt == LUA_TCCL, &((cast_u(o))->cl.c))
  230. #define gco2cl(o)  \
  231.         check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl))
  232. #define gco2t(o)  check_exp((o)->tt == LUA_TTABLE, &((cast_u(o))->h))
  233. #define gco2p(o)  check_exp((o)->tt == LUA_TPROTO, &((cast_u(o))->p))
  234. #define gco2th(o)  check_exp((o)->tt == LUA_TTHREAD, &((cast_u(o))->th))
  235.  
  236.  
  237. /* macro to convert a Lua object into a GCObject */
  238. #define obj2gco(v) \
  239.         check_exp(novariant((v)->tt) < LUA_TDEADKEY, (&(cast_u(v)->gc)))
  240.  
  241.  
  242. /* actual number of total bytes allocated */
  243. #define gettotalbytes(g)        cast(lu_mem, (g)->totalbytes + (g)->GCdebt)
  244.  
  245. LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
  246. LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
  247. LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
  248. LUAI_FUNC void luaE_freeCI (lua_State *L);
  249. LUAI_FUNC void luaE_shrinkCI (lua_State *L);
  250.  
  251.  
  252. #endif
  253.  
  254.