lj_state.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. /*
  2. ** State and stack handling.
  3. ** Copyright (C) 2005-2014 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_str.h"
  14. #include "lj_tab.h"
  15. #include "lj_func.h"
  16. #include "lj_meta.h"
  17. #include "lj_state.h"
  18. #include "lj_frame.h"
  19. #if LJ_HASFFI
  20. #include "lj_ctype.h"
  21. #endif
  22. #include "lj_trace.h"
  23. #include "lj_dispatch.h"
  24. #include "lj_vm.h"
  25. #include "lj_lex.h"
  26. #include "lj_alloc.h"
  27. /* -- Stack handling ------------------------------------------------------ */
  28. /* Stack sizes. */
  29. #define LJ_STACK_MIN LUA_MINSTACK /* Min. stack size. */
  30. #define LJ_STACK_MAX LUAI_MAXSTACK /* Max. stack size. */
  31. #define LJ_STACK_START (2*LJ_STACK_MIN) /* Starting stack size. */
  32. #define LJ_STACK_MAXEX (LJ_STACK_MAX + 1 + LJ_STACK_EXTRA)
  33. /* Explanation of LJ_STACK_EXTRA:
  34. **
  35. ** Calls to metamethods store their arguments beyond the current top
  36. ** without checking for the stack limit. This avoids stack resizes which
  37. ** would invalidate passed TValue pointers. The stack check is performed
  38. ** later by the function header. This can safely resize the stack or raise
  39. ** an error. Thus we need some extra slots beyond the current stack limit.
  40. **
  41. ** Most metamethods need 4 slots above top (cont, mobj, arg1, arg2) plus
  42. ** one extra slot if mobj is not a function. Only lj_meta_tset needs 5
  43. ** slots above top, but then mobj is always a function. So we can get by
  44. ** with 5 extra slots.
  45. */
  46. /* Resize stack slots and adjust pointers in state. */
  47. static void resizestack(lua_State *L, MSize n)
  48. {
  49. TValue *st, *oldst = tvref(L->stack);
  50. ptrdiff_t delta;
  51. MSize oldsize = L->stacksize;
  52. MSize realsize = n + 1 + LJ_STACK_EXTRA;
  53. GCobj *up;
  54. lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
  55. st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
  56. (MSize)(L->stacksize*sizeof(TValue)),
  57. (MSize)(realsize*sizeof(TValue)));
  58. setmref(L->stack, st);
  59. delta = (char *)st - (char *)oldst;
  60. setmref(L->maxstack, st + n);
  61. while (oldsize < realsize) /* Clear new slots. */
  62. setnilV(st + oldsize++);
  63. L->stacksize = realsize;
  64. L->base = (TValue *)((char *)L->base + delta);
  65. L->top = (TValue *)((char *)L->top + delta);
  66. for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
  67. setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
  68. if (obj2gco(L) == gcref(G(L)->jit_L))
  69. setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);
  70. }
  71. /* Relimit stack after error, in case the limit was overdrawn. */
  72. void lj_state_relimitstack(lua_State *L)
  73. {
  74. if (L->stacksize > LJ_STACK_MAXEX && L->top-tvref(L->stack) < LJ_STACK_MAX-1)
  75. resizestack(L, LJ_STACK_MAX);
  76. }
  77. /* Try to shrink the stack (called from GC). */
  78. void lj_state_shrinkstack(lua_State *L, MSize used)
  79. {
  80. if (L->stacksize > LJ_STACK_MAXEX)
  81. return; /* Avoid stack shrinking while handling stack overflow. */
  82. if (4*used < L->stacksize &&
  83. 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize &&
  84. obj2gco(L) != gcref(G(L)->jit_L)) /* Don't shrink stack of live trace. */
  85. resizestack(L, L->stacksize >> 1);
  86. }
  87. /* Try to grow stack. */
  88. void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
  89. {
  90. MSize n;
  91. if (L->stacksize > LJ_STACK_MAXEX) /* Overflow while handling overflow? */
  92. lj_err_throw(L, LUA_ERRERR);
  93. n = L->stacksize + need;
  94. if (n > LJ_STACK_MAX) {
  95. n += 2*LUA_MINSTACK;
  96. } else if (n < 2*L->stacksize) {
  97. n = 2*L->stacksize;
  98. if (n >= LJ_STACK_MAX)
  99. n = LJ_STACK_MAX;
  100. }
  101. resizestack(L, n);
  102. if (L->stacksize > LJ_STACK_MAXEX)
  103. lj_err_msg(L, LJ_ERR_STKOV);
  104. }
  105. void LJ_FASTCALL lj_state_growstack1(lua_State *L)
  106. {
  107. lj_state_growstack(L, 1);
  108. }
  109. /* Allocate basic stack for new state. */
  110. static void stack_init(lua_State *L1, lua_State *L)
  111. {
  112. TValue *stend, *st = lj_mem_newvec(L, LJ_STACK_START+LJ_STACK_EXTRA, TValue);
  113. setmref(L1->stack, st);
  114. L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA;
  115. stend = st + L1->stacksize;
  116. setmref(L1->maxstack, stend - LJ_STACK_EXTRA - 1);
  117. L1->base = L1->top = st+1;
  118. setthreadV(L1, st, L1); /* Needed for curr_funcisL() on empty stack. */
  119. while (st < stend) /* Clear new slots. */
  120. setnilV(st++);
  121. }
  122. /* -- State handling ------------------------------------------------------ */
  123. /* Open parts that may cause memory-allocation errors. */
  124. static TValue *cpluaopen(lua_State *L, lua_CFunction dummy, void *ud)
  125. {
  126. global_State *g = G(L);
  127. UNUSED(dummy);
  128. UNUSED(ud);
  129. stack_init(L, L);
  130. /* NOBARRIER: State initialization, all objects are white. */
  131. setgcref(L->env, obj2gco(lj_tab_new(L, 0, LJ_MIN_GLOBAL)));
  132. settabV(L, registry(L), lj_tab_new(L, 0, LJ_MIN_REGISTRY));
  133. lj_str_resize(L, LJ_MIN_STRTAB-1);
  134. lj_meta_init(L);
  135. lj_lex_init(L);
  136. fixstring(lj_err_str(L, LJ_ERR_ERRMEM)); /* Preallocate memory error msg. */
  137. g->gc.threshold = 4*g->gc.total;
  138. lj_trace_initstate(g);
  139. return NULL;
  140. }
  141. static void close_state(lua_State *L)
  142. {
  143. global_State *g = G(L);
  144. lj_func_closeuv(L, tvref(L->stack));
  145. lj_gc_freeall(g);
  146. lua_assert(gcref(g->gc.root) == obj2gco(L));
  147. lua_assert(g->strnum == 0);
  148. lj_trace_freestate(g);
  149. #if LJ_HASFFI
  150. lj_ctype_freestate(g);
  151. #endif
  152. lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
  153. lj_str_freebuf(g, &g->tmpbuf);
  154. lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
  155. lua_assert(g->gc.total == sizeof(GG_State));
  156. #ifndef LUAJIT_USE_SYSMALLOC
  157. if (g->allocf == lj_alloc_f)
  158. lj_alloc_destroy(g->allocd);
  159. else
  160. #endif
  161. g->allocf(g->allocd, G2GG(g), sizeof(GG_State), 0);
  162. }
  163. #if LJ_64
  164. lua_State *lj_state_newstate(lua_Alloc f, void *ud)
  165. #else
  166. LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud)
  167. #endif
  168. {
  169. GG_State *GG = (GG_State *)f(ud, NULL, 0, sizeof(GG_State));
  170. lua_State *L = &GG->L;
  171. global_State *g = &GG->g;
  172. if (GG == NULL || !checkptr32(GG)) return NULL;
  173. memset(GG, 0, sizeof(GG_State));
  174. L->gct = ~LJ_TTHREAD;
  175. L->marked = LJ_GC_WHITE0 | LJ_GC_FIXED | LJ_GC_SFIXED; /* Prevent free. */
  176. L->dummy_ffid = FF_C;
  177. setmref(L->glref, g);
  178. g->gc.currentwhite = LJ_GC_WHITE0 | LJ_GC_FIXED;
  179. g->strempty.marked = LJ_GC_WHITE0;
  180. g->strempty.gct = ~LJ_TSTR;
  181. g->allocf = f;
  182. g->allocd = ud;
  183. setgcref(g->mainthref, obj2gco(L));
  184. setgcref(g->uvhead.prev, obj2gco(&g->uvhead));
  185. setgcref(g->uvhead.next, obj2gco(&g->uvhead));
  186. g->strmask = ~(MSize)0;
  187. setnilV(registry(L));
  188. setnilV(&g->nilnode.val);
  189. setnilV(&g->nilnode.key);
  190. setmref(g->nilnode.freetop, &g->nilnode);
  191. lj_str_initbuf(&g->tmpbuf);
  192. g->gc.state = GCSpause;
  193. setgcref(g->gc.root, obj2gco(L));
  194. setmref(g->gc.sweep, &g->gc.root);
  195. g->gc.total = sizeof(GG_State);
  196. g->gc.pause = LUAI_GCPAUSE;
  197. g->gc.stepmul = LUAI_GCMUL;
  198. lj_dispatch_init((GG_State *)L);
  199. L->status = LUA_ERRERR+1; /* Avoid touching the stack upon memory error. */
  200. if (lj_vm_cpcall(L, NULL, NULL, cpluaopen) != 0) {
  201. /* Memory allocation error: free partial state. */
  202. close_state(L);
  203. return NULL;
  204. }
  205. L->status = 0;
  206. return L;
  207. }
  208. static TValue *cpfinalize(lua_State *L, lua_CFunction dummy, void *ud)
  209. {
  210. UNUSED(dummy);
  211. UNUSED(ud);
  212. lj_gc_finalize_cdata(L);
  213. lj_gc_finalize_udata(L);
  214. /* Frame pop omitted. */
  215. return NULL;
  216. }
  217. LUA_API void lua_close(lua_State *L)
  218. {
  219. global_State *g = G(L);
  220. int i;
  221. L = mainthread(g); /* Only the main thread can be closed. */
  222. lj_func_closeuv(L, tvref(L->stack));
  223. lj_gc_separateudata(g, 1); /* Separate udata which have GC metamethods. */
  224. #if LJ_HASJIT
  225. G2J(g)->flags &= ~JIT_F_ON;
  226. G2J(g)->state = LJ_TRACE_IDLE;
  227. lj_dispatch_update(g);
  228. #endif
  229. for (i = 0;;) {
  230. hook_enter(g);
  231. L->status = 0;
  232. L->cframe = NULL;
  233. L->base = L->top = tvref(L->stack) + 1;
  234. if (lj_vm_cpcall(L, NULL, NULL, cpfinalize) == 0) {
  235. if (++i >= 10) break;
  236. lj_gc_separateudata(g, 1); /* Separate udata again. */
  237. if (gcref(g->gc.mmudata) == NULL) /* Until nothing is left to do. */
  238. break;
  239. }
  240. }
  241. close_state(L);
  242. }
  243. lua_State *lj_state_new(lua_State *L)
  244. {
  245. lua_State *L1 = lj_mem_newobj(L, lua_State);
  246. L1->gct = ~LJ_TTHREAD;
  247. L1->dummy_ffid = FF_C;
  248. L1->status = 0;
  249. L1->stacksize = 0;
  250. setmref(L1->stack, NULL);
  251. L1->cframe = NULL;
  252. /* NOBARRIER: The lua_State is new (marked white). */
  253. setgcrefnull(L1->openupval);
  254. setmrefr(L1->glref, L->glref);
  255. setgcrefr(L1->env, L->env);
  256. stack_init(L1, L); /* init stack */
  257. lua_assert(iswhite(obj2gco(L1)));
  258. return L1;
  259. }
  260. void LJ_FASTCALL lj_state_free(global_State *g, lua_State *L)
  261. {
  262. lua_assert(L != mainthread(g));
  263. lj_func_closeuv(L, tvref(L->stack));
  264. lua_assert(gcref(L->openupval) == NULL);
  265. lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
  266. lj_mem_freet(g, L);
  267. }