src/lj_state.c - luajit-2.0-src

Functions defined

Macros defined

Source code

  1. /*
  2. ** State and stack handling.
  3. ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
  4. **
  5. ** Portions taken verbatim or adapted from the Lua interpreter.
  6. ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
  7. */

  8. #define lj_state_c
  9. #define LUA_CORE

  10. #include "lj_obj.h"
  11. #include "lj_gc.h"
  12. #include "lj_err.h"
  13. #include "lj_buf.h"
  14. #include "lj_str.h"
  15. #include "lj_tab.h"
  16. #include "lj_func.h"
  17. #include "lj_meta.h"
  18. #include "lj_state.h"
  19. #include "lj_frame.h"
  20. #if LJ_HASFFI
  21. #include "lj_ctype.h"
  22. #endif
  23. #include "lj_trace.h"
  24. #include "lj_dispatch.h"
  25. #include "lj_vm.h"
  26. #include "lj_lex.h"
  27. #include "lj_alloc.h"
  28. #include "luajit.h"

  29. /* -- Stack handling ------------------------------------------------------ */

  30. /* Stack sizes. */
  31. #define LJ_STACK_MIN        LUA_MINSTACK        /* Min. stack size. */
  32. #define LJ_STACK_MAX        LUAI_MAXSTACK        /* Max. stack size. */
  33. #define LJ_STACK_START        (2*LJ_STACK_MIN)        /* Starting stack size. */
  34. #define LJ_STACK_MAXEX        (LJ_STACK_MAX + 1 + LJ_STACK_EXTRA)

  35. /* Explanation of LJ_STACK_EXTRA:
  36. **
  37. ** Calls to metamethods store their arguments beyond the current top
  38. ** without checking for the stack limit. This avoids stack resizes which
  39. ** would invalidate passed TValue pointers. The stack check is performed
  40. ** later by the function header. This can safely resize the stack or raise
  41. ** an error. Thus we need some extra slots beyond the current stack limit.
  42. **
  43. ** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus
  44. ** one extra slot if mobj is not a function. Only lj_meta_tset needs 5
  45. ** slots above top, but then mobj is always a function. So we can get by
  46. ** with 5 extra slots.
  47. ** LJ_FR2: We need 2 more slots for the frame PC and the continuation PC.
  48. */

  49. /* Resize stack slots and adjust pointers in state. */
  50. static void resizestack(lua_State *L, MSize n)
  51. {
  52.   TValue *st, *oldst = tvref(L->stack);
  53.   ptrdiff_t delta;
  54.   MSize oldsize = L->stacksize;
  55.   MSize realsize = n + 1 + LJ_STACK_EXTRA;
  56.   GCobj *up;
  57.   lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
  58.   st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
  59.                                 (MSize)(oldsize*sizeof(TValue)),
  60.                                 (MSize)(realsize*sizeof(TValue)));
  61.   setmref(L->stack, st);
  62.   delta = (char *)st - (char *)oldst;
  63.   setmref(L->maxstack, st + n);
  64.   while (oldsize < realsize)  /* Clear new slots. */
  65.     setnilV(st + oldsize++);
  66.   L->stacksize = realsize;
  67.   if ((size_t)(mref(G(L)->jit_base, char) - (char *)oldst) < oldsize)
  68.     setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);
  69.   L->base = (TValue *)((char *)L->base + delta);
  70.   L->top = (TValue *)((char *)L->top + delta);
  71.   for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
  72.     setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
  73. }

  74. /* Relimit stack after error, in case the limit was overdrawn. */
  75. void lj_state_relimitstack(lua_State *L)
  76. {
  77.   if (L->stacksize > LJ_STACK_MAXEX && L->top-tvref(L->stack) < LJ_STACK_MAX-1)
  78.     resizestack(L, LJ_STACK_MAX);
  79. }

  80. /* Try to shrink the stack (called from GC). */
  81. void lj_state_shrinkstack(lua_State *L, MSize used)
  82. {
  83.   if (L->stacksize > LJ_STACK_MAXEX)
  84.     return/* Avoid stack shrinking while handling stack overflow. */
  85.   if (4*used < L->stacksize &&
  86.       2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize &&
  87.       /* Don't shrink stack of live trace. */
  88.       (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->cur_L)))
  89.     resizestack(L, L->stacksize >> 1);
  90. }

  91. /* Try to grow stack. */
  92. void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
  93. {
  94.   MSize n;
  95.   if (L->stacksize > LJ_STACK_MAXEX/* Overflow while handling overflow? */
  96.     lj_err_throw(L, LUA_ERRERR);
  97.   n = L->stacksize + need;
  98.   if (n > LJ_STACK_MAX) {
  99.     n += 2*LUA_MINSTACK;
  100.   } else if (n < 2*L->stacksize) {
  101.     n = 2*L->stacksize;
  102.     if (n >= LJ_STACK_MAX)
  103.       n = LJ_STACK_MAX;
  104.   }
  105.   resizestack(L, n);
  106.   if (L->stacksize > LJ_STACK_MAXEX)
  107.     lj_err_msg(L, LJ_ERR_STKOV);
  108. }

  109. void LJ_FASTCALL lj_state_growstack1(lua_State *L)
  110. {
  111.   lj_state_growstack(L, 1);
  112. }

  113. /* Allocate basic stack for new state. */
  114. static void stack_init(lua_State *L1, lua_State *L)
  115. {
  116.   TValue *stend, *st = lj_mem_newvec(L, LJ_STACK_START+LJ_STACK_EXTRA, TValue);
  117.   setmref(L1->stack, st);
  118.   L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA;
  119.   stend = st + L1->stacksize;
  120.   setmref(L1->maxstack, stend - LJ_STACK_EXTRA - 1);
  121.   setthreadV(L1, st++, L1);  /* Needed for curr_funcisL() on empty stack. */
  122.   if (LJ_FR2) setnilV(st++);
  123.   L1->base = L1->top = st;
  124.   while (st < stend)  /* Clear new slots. */
  125.     setnilV(st++);
  126. }

  127. /* -- State handling ------------------------------------------------------ */

  128. /* Open parts that may cause memory-allocation errors. */
  129. static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)
  130. {
  131.   global_State *g = G(L);
  132.   UNUSED(dummy);
  133.   UNUSED(ud);
  134.   stack_init(L, L);
  135.   /* NOBARRIER: State initialization, all objects are white. */
  136.   setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL)));
  137.   settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY));
  138.   lj_str_resize(L, LJ_MIN_STRTAB-1);
  139.   lj_meta_init(L);
  140.   lj_lex_init(L);
  141.   fixstring(lj_err_str(L, LJ_ERR_ERRMEM));  /* Preallocate memory error msg. */
  142.   g->gc.threshold = 4*g->gc.total;
  143.   lj_trace_initstate(g);
  144.   return NULL;
  145. }

  146. static void close_state(lua_State *L)
  147. {
  148.   global_State *g = G(L);
  149.   lj_func_closeuv(L, tvref(L->stack));
  150.   lj_gc_freeall(g);
  151.   lua_assert(gcref(g->gc.root) == obj2gco(L));
  152.   lua_assert(g->strnum == 0);
  153.   lj_trace_freestate(g);
  154. #if LJ_HASFFI
  155.   lj_ctype_freestate(g);
  156. #endif
  157.   lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
  158.   lj_buf_free(g, &g->tmpbuf);
  159.   lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
  160.   lua_assert(g->gc.total == sizeof(GG_State));
  161. #ifndef LUAJIT_USE_SYSMALLOC
  162.   if (g->allocf == lj_alloc_f)
  163.     lj_alloc_destroy(g->allocd);
  164.   else
  165. #endif
  166.     g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);
  167. }

  168. #if LJ_64 && !(defined(LUAJIT_USE_VALGRIND) && defined(LUAJIT_USE_SYSMALLOC))
  169. lua_State *lj_state_newstate(lua_Alloc f, void *ud)
  170. #else
  171. LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
  172. #endif
  173. {
  174.   GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State));
  175.   lua_State *L = &GG->L;
  176.   global_State *g = &GG->g;
  177.   if (GG == NULL || !checkptrGC(GG)) return NULL;
  178.   memset(GG, 0, sizeof(GG_State));
  179.   L->gct = ~LJ_TTHREAD;
  180.   L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED/* Prevent free. */
  181.   L->dummy_ffid = FF_C;
  182.   setmref(L->glref, g);
  183.   g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;
  184.   g->strempty.marked = LJ_GC_WHITE0;
  185.   g->strempty.gct = ~LJ_TSTR;
  186.   g->allocf = f;
  187.   g->allocd = ud;
  188.   setgcref(g->mainthref, obj2gco(L));
  189.   setgcref(g->uvhead.prev, obj2gco(&g->uvhead));
  190.   setgcref(g->uvhead.next, obj2gco(&g->uvhead));
  191.   g->strmask = ~(MSize)0;
  192.   setnilV(registry(L));
  193.   setnilV(&g->nilnode.val);
  194.   setnilV(&g->nilnode.key);
  195. #if !LJ_GC64
  196.   setmref(g->nilnode.freetop, &g->nilnode);
  197. #endif
  198.   lj_buf_init(NULL, &g->tmpbuf);
  199.   g->gc.state = GCSpause;
  200.   setgcref(g->gc.root, obj2gco(L));
  201.   setmref(g->gc.sweep, &g->gc.root);
  202.   g->gc.total = sizeof(GG_State);
  203.   g->gc.pause = LUAI_GCPAUSE;
  204.   g->gc.stepmul = LUAI_GCMUL;
  205.   lj_dispatch_init((GG_State *)L);
  206.   L->status = LUA_ERRERR+1/* Avoid touching the stack upon memory error. */
  207.   if (lj_vm_cpcall(L, NULL, NULL, cpluaopen) != 0) {
  208.     /* Memory allocation error: free partial state. */
  209.     close_state(L);
  210.     return NULL;
  211.   }
  212.   L->status = 0;
  213.   return L;
  214. }

  215. static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud)
  216. {
  217.   UNUSED(dummy);
  218.   UNUSED(ud);
  219.   lj_gc_finalize_cdata(L);
  220.   lj_gc_finalize_udata(L);
  221.   /* Frame pop omitted. */
  222.   return NULL;
  223. }

  224. LUA_API void lua_close(lua_State *L)
  225. {
  226.   global_State *g = G(L);
  227.   int i;
  228.   L = mainthread(g);  /* Only the main thread can be closed. */
  229. #if LJ_HASPROFILE
  230.   luaJIT_profile_stop(L);
  231. #endif
  232.   setgcrefnull(g->cur_L);
  233.   lj_func_closeuv(L, tvref(L->stack));
  234.   lj_gc_separateudata(g, 1);  /* Separate udata which have GC metamethods. */
  235. #if LJ_HASJIT
  236.   G2J(g)->flags &= ~JIT_F_ON;
  237.   G2J(g)->state = LJ_TRACE_IDLE;
  238.   lj_dispatch_update(g);
  239. #endif
  240.   for (i = 0;;) {
  241.     hook_enter(g);
  242.     L->status = 0;
  243.     L->base = L->top = tvref(L->stack) + 1 + LJ_FR2;
  244.     L->cframe = NULL;
  245.     if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {
  246.       if (++i >= 10) break;
  247.       lj_gc_separateudata(g, 1);  /* Separate udata again. */
  248.       if (gcref(g->gc.mmudata) == NULL/* Until nothing is left to do. */
  249.         break;
  250.     }
  251.   }
  252.   close_state(L);
  253. }

  254. lua_State *lj_state_new(lua_State *L)
  255. {
  256.   lua_State *L1 = lj_mem_newobj(L, lua_State);
  257.   L1->gct = ~LJ_TTHREAD;
  258.   L1->dummy_ffid = FF_C;
  259.   L1->status = 0;
  260.   L1->stacksize = 0;
  261.   setmref(L1->stack, NULL);
  262.   L1->cframe = NULL;
  263.   /* NOBARRIER: The lua_State is new (marked white). */
  264.   setgcrefnull(L1->openupval);
  265.   setmrefr(L1->glref, L->glref);
  266.   setgcrefr(L1->env, L->env);
  267.   stack_init(L1, L);  /* init stack */
  268.   lua_assert(iswhite(obj2gco(L1)));
  269.   return L1;
  270. }

  271. void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L)
  272. {
  273.   lua_assert(L != mainthread(g));
  274.   if (obj2gco(L) == gcref(g->cur_L))
  275.     setgcrefnull(g->cur_L);
  276.   lj_func_closeuv(L, tvref(L->stack));
  277.   lua_assert(gcref(L->openupval) == NULL);
  278.   lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
  279.   lj_mem_freet(g, L);
  280. }