summaryrefslogtreecommitdiff
path: root/src/lj_state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_state.c')
-rw-r--r--src/lj_state.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/lj_state.c b/src/lj_state.c
index 87043dd5..7c8e9c96 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -49,14 +49,18 @@
49/* Resize stack slots and adjust pointers in state. */ 49/* Resize stack slots and adjust pointers in state. */
50static void resizestack(lua_State *L, MSize n) 50static void resizestack(lua_State *L, MSize n)
51{ 51{
52 TValue *oldst = L->stack; 52 TValue *st, *oldst = L->stack;
53 ptrdiff_t delta; 53 ptrdiff_t delta;
54 MSize oldsize = L->stacksize;
54 MSize realsize = n + 1 + LJ_STACK_EXTRA; 55 MSize realsize = n + 1 + LJ_STACK_EXTRA;
55 GCobj *up; 56 GCobj *up;
56 lua_assert((MSize)(L->maxstack-L->stack) == L->stacksize-LJ_STACK_EXTRA-1); 57 lua_assert((MSize)(L->maxstack-L->stack) == L->stacksize-LJ_STACK_EXTRA-1);
57 lj_mem_reallocvec(L, L->stack, L->stacksize, realsize, TValue); 58 lj_mem_reallocvec(L, L->stack, L->stacksize, realsize, TValue);
58 delta = (char *)L->stack - (char *)oldst; 59 st = L->stack;
59 L->maxstack = L->stack + n; 60 delta = (char *)st - (char *)oldst;
61 L->maxstack = st + n;
62 while (oldsize < realsize) /* Clear new slots. */
63 setnilV(st + oldsize++);
60 L->stacksize = realsize; 64 L->stacksize = realsize;
61 L->base = (TValue *)((char *)L->base + delta); 65 L->base = (TValue *)((char *)L->base + delta);
62 L->top = (TValue *)((char *)L->top + delta); 66 L->top = (TValue *)((char *)L->top + delta);
@@ -90,13 +94,8 @@ void LJ_FASTCALL lj_state_growstack(lua_State *L, MSize need)
90 if (L->stacksize > LJ_STACK_MAXEX) /* overflow while handling overflow? */ 94 if (L->stacksize > LJ_STACK_MAXEX) /* overflow while handling overflow? */
91 lj_err_throw(L, LUA_ERRERR); 95 lj_err_throw(L, LUA_ERRERR);
92 resizestack(L, L->stacksize + (need > L->stacksize ? need : L->stacksize)); 96 resizestack(L, L->stacksize + (need > L->stacksize ? need : L->stacksize));
93 if (L->stacksize > LJ_STACK_MAXEX) { 97 if (L->stacksize > LJ_STACK_MAXEX)
94 if (curr_funcisL(L)) { /* Clear slots of incomplete Lua frame. */ 98 lj_err_msg(L, LJ_ERR_STKOV);
95 TValue *top = curr_topL(L);
96 while (--top >= L->top) setnilV(top);
97 }
98 lj_err_msg(L, LJ_ERR_STKOV); /* ... to allow L->top = curr_topL(L). */
99 }
100} 99}
101 100
102void LJ_FASTCALL lj_state_growstack1(lua_State *L) 101void LJ_FASTCALL lj_state_growstack1(lua_State *L)
@@ -107,13 +106,15 @@ void LJ_FASTCALL lj_state_growstack1(lua_State *L)
107/* Allocate basic stack for new state. */ 106/* Allocate basic stack for new state. */
108static void stack_init(lua_State *L1, lua_State *L) 107static void stack_init(lua_State *L1, lua_State *L)
109{ 108{
110 L1->stack = lj_mem_newvec(L, LJ_STACK_START + LJ_STACK_EXTRA, TValue); 109 TValue *st, *stend;
110 L1->stack = st = lj_mem_newvec(L, LJ_STACK_START + LJ_STACK_EXTRA, TValue);
111 L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA; 111 L1->stacksize = LJ_STACK_START + LJ_STACK_EXTRA;
112 L1->top = L1->stack; 112 stend = st + L1->stacksize;
113 L1->maxstack = L1->stack+(L1->stacksize - LJ_STACK_EXTRA)-1; 113 L1->maxstack = stend - LJ_STACK_EXTRA - 1;
114 setthreadV(L1, L1->top, L1); /* needed for curr_funcisL() on empty stack */ 114 L1->base = L1->top = st+1;
115 setnilV(L1->top); /* but clear its type */ 115 setthreadV(L1, st, L1); /* Needed for curr_funcisL() on empty stack. */
116 L1->base = ++L1->top; 116 while (st < stend) /* Clear new slots. */
117 setnilV(st++);
117} 118}
118 119
119/* -- State handling ------------------------------------------------------ */ 120/* -- State handling ------------------------------------------------------ */