diff options
Diffstat (limited to 'src/lj_state.c')
-rw-r--r-- | src/lj_state.c | 33 |
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. */ |
50 | static void resizestack(lua_State *L, MSize n) | 50 | static 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 | ||
102 | void LJ_FASTCALL lj_state_growstack1(lua_State *L) | 101 | void 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. */ |
108 | static void stack_init(lua_State *L1, lua_State *L) | 107 | static 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 ------------------------------------------------------ */ |