aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ldo.c14
-rw-r--r--lobject.h6
-rw-r--r--lstate.c9
-rw-r--r--lstate.h3
-rw-r--r--lvm.c3
5 files changed, 26 insertions, 9 deletions
diff --git a/ldo.c b/ldo.c
index 0c0bb0bc..4d2b3c76 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.161 2017/06/29 15:06:44 roberto Exp roberto $ 2** $Id: ldo.c,v 2.162 2017/07/27 13:50:16 roberto Exp roberto $
3** Stack and Call structure of Lua 3** Stack and Call structure of Lua
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -160,6 +160,7 @@ static void correctstack (lua_State *L, StkId oldstack) {
160 CallInfo *ci; 160 CallInfo *ci;
161 UpVal *up; 161 UpVal *up;
162 L->top = (L->top - oldstack) + L->stack; 162 L->top = (L->top - oldstack) + L->stack;
163 L->func = (L->func - oldstack) + L->stack;
163 for (up = L->openupval; up != NULL; up = up->u.open.next) 164 for (up = L->openupval; up != NULL; up = up->u.open.next)
164 up->v = s2v((uplevel(up) - oldstack) + L->stack); 165 up->v = s2v((uplevel(up) - oldstack) + L->stack);
165 for (ci = L->ci; ci != NULL; ci = ci->previous) { 166 for (ci = L->ci; ci != NULL; ci = ci->previous) {
@@ -369,6 +370,8 @@ int luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
369 } 370 }
370 res = ci->func; /* res == final position of 1st result */ 371 res = ci->func; /* res == final position of 1st result */
371 L->ci = ci->previous; /* back to caller */ 372 L->ci = ci->previous; /* back to caller */
373 L->func -= L->func->stkci.previous;
374 lua_assert(L->func == L->ci->func);
372 /* move results to proper place */ 375 /* move results to proper place */
373 return moveresults(L, firstResult, res, nres, wanted); 376 return moveresults(L, firstResult, res, nres, wanted);
374} 377}
@@ -400,7 +403,8 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
400 checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */ 403 checkstackp(L, LUA_MINSTACK, func); /* ensure minimum stack size */
401 ci = next_ci(L); /* now 'enter' new function */ 404 ci = next_ci(L); /* now 'enter' new function */
402 ci->nresults = nresults; 405 ci->nresults = nresults;
403 ci->func = func; 406 func->stkci.previous = func - L->func;
407 L->func = ci->func = func;
404 ci->top = L->top + LUA_MINSTACK; 408 ci->top = L->top + LUA_MINSTACK;
405 lua_assert(ci->top <= L->stack_last); 409 lua_assert(ci->top <= L->stack_last);
406 ci->callstatus = 0; 410 ci->callstatus = 0;
@@ -424,7 +428,8 @@ int luaD_precall (lua_State *L, StkId func, int nresults) {
424 luaT_adjustvarargs(L, p, n); 428 luaT_adjustvarargs(L, p, n);
425 ci = next_ci(L); /* now 'enter' new function */ 429 ci = next_ci(L); /* now 'enter' new function */
426 ci->nresults = nresults; 430 ci->nresults = nresults;
427 ci->func = func; 431 func->stkci.previous = func - L->func;
432 L->func = ci->func = func;
428 L->top = ci->top = func + 1 + fsize; 433 L->top = ci->top = func + 1 + fsize;
429 lua_assert(ci->top <= L->stack_last); 434 lua_assert(ci->top <= L->stack_last);
430 ci->u.l.savedpc = p->code; /* starting point */ 435 ci->u.l.savedpc = p->code; /* starting point */
@@ -558,6 +563,7 @@ static int recover (lua_State *L, int status) {
558 luaF_close(L, oldtop); 563 luaF_close(L, oldtop);
559 seterrorobj(L, status, oldtop); 564 seterrorobj(L, status, oldtop);
560 L->ci = ci; 565 L->ci = ci;
566 L->func = ci->func;
561 L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */ 567 L->allowhook = getoah(ci->callstatus); /* restore original 'allowhook' */
562 L->nny = 0; /* should be zero to be yieldable */ 568 L->nny = 0; /* should be zero to be yieldable */
563 luaD_shrinkstack(L); 569 luaD_shrinkstack(L);
@@ -693,6 +699,7 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u,
693 ptrdiff_t old_top, ptrdiff_t ef) { 699 ptrdiff_t old_top, ptrdiff_t ef) {
694 int status; 700 int status;
695 CallInfo *old_ci = L->ci; 701 CallInfo *old_ci = L->ci;
702 ptrdiff_t oldfunc = savestack(L, L->func);
696 lu_byte old_allowhooks = L->allowhook; 703 lu_byte old_allowhooks = L->allowhook;
697 unsigned short old_nny = L->nny; 704 unsigned short old_nny = L->nny;
698 ptrdiff_t old_errfunc = L->errfunc; 705 ptrdiff_t old_errfunc = L->errfunc;
@@ -703,6 +710,7 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u,
703 luaF_close(L, oldtop); /* close possible pending closures */ 710 luaF_close(L, oldtop); /* close possible pending closures */
704 seterrorobj(L, status, oldtop); 711 seterrorobj(L, status, oldtop);
705 L->ci = old_ci; 712 L->ci = old_ci;
713 L->func = restorestack(L, oldfunc);
706 L->allowhook = old_allowhooks; 714 L->allowhook = old_allowhooks;
707 L->nny = old_nny; 715 L->nny = old_nny;
708 luaD_shrinkstack(L); 716 luaD_shrinkstack(L);
diff --git a/lobject.h b/lobject.h
index 769be79d..e3ae0050 100644
--- a/lobject.h
+++ b/lobject.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lobject.h,v 2.124 2017/06/27 11:35:31 roberto Exp roberto $ 2** $Id: lobject.h,v 2.125 2017/06/29 15:06:44 roberto Exp roberto $
3** Type definitions for Lua objects 3** Type definitions for Lua objects
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -311,6 +311,10 @@ typedef struct TValue {
311 311
312typedef union StackValue { 312typedef union StackValue {
313 TValue val; 313 TValue val;
314 struct {
315 TValuefields;
316 unsigned short previous; /* difference to previous 'func' */
317 } stkci;
314} StackValue; 318} StackValue;
315 319
316 320
diff --git a/lstate.c b/lstate.c
index 626377ae..c4305ed8 100644
--- a/lstate.c
+++ b/lstate.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.c,v 2.141 2017/06/29 15:06:44 roberto Exp roberto $ 2** $Id: lstate.c,v 2.142 2017/10/11 12:38:45 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -153,8 +153,10 @@ static void stack_init (lua_State *L1, lua_State *L) {
153 ci = &L1->base_ci; 153 ci = &L1->base_ci;
154 ci->next = ci->previous = NULL; 154 ci->next = ci->previous = NULL;
155 ci->callstatus = 0; 155 ci->callstatus = 0;
156 ci->func = L1->top; 156 L1->func = ci->func = L1->top;
157 setnilvalue(s2v(L1->top++)); /* 'function' entry for this 'ci' */ 157 L1->func->stkci.previous = 0; /* end of linked list */
158 setnilvalue(s2v(L1->top)); /* 'function' entry for this 'ci' */
159 L1->top++;
158 ci->top = L1->top + LUA_MINSTACK; 160 ci->top = L1->top + LUA_MINSTACK;
159 L1->ci = ci; 161 L1->ci = ci;
160} 162}
@@ -215,6 +217,7 @@ static void preinit_thread (lua_State *L, global_State *g) {
215 G(L) = g; 217 G(L) = g;
216 L->stack = NULL; 218 L->stack = NULL;
217 L->ci = NULL; 219 L->ci = NULL;
220 L->func = NULL;
218 L->nci = 0; 221 L->nci = 0;
219 L->stacksize = 0; 222 L->stacksize = 0;
220 L->twups = L; /* thread has no upvalues */ 223 L->twups = L; /* thread has no upvalues */
diff --git a/lstate.h b/lstate.h
index 5ccc4025..76ce110f 100644
--- a/lstate.h
+++ b/lstate.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lstate.h,v 2.143 2017/06/12 14:21:44 roberto Exp roberto $ 2** $Id: lstate.h,v 2.144 2017/07/27 13:50:16 roberto Exp roberto $
3** Global State 3** Global State
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -192,6 +192,7 @@ struct lua_State {
192 StkId top; /* first free slot in the stack */ 192 StkId top; /* first free slot in the stack */
193 global_State *l_G; 193 global_State *l_G;
194 CallInfo *ci; /* call info for current function */ 194 CallInfo *ci; /* call info for current function */
195 StkId func; /* current function */
195 const Instruction *oldpc; /* last pc traced */ 196 const Instruction *oldpc; /* last pc traced */
196 StkId stack_last; /* last free slot in the stack */ 197 StkId stack_last; /* last free slot in the stack */
197 StkId stack; /* stack base */ 198 StkId stack; /* stack base */
diff --git a/lvm.c b/lvm.c
index b3e32047..4fabd744 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.298 2017/10/04 15:49:24 roberto Exp roberto $ 2** $Id: lvm.c,v 2.299 2017/10/04 21:56:32 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -1390,6 +1390,7 @@ void luaV_execute (lua_State *L) {
1390 oci->u.l.savedpc = nci->u.l.savedpc; 1390 oci->u.l.savedpc = nci->u.l.savedpc;
1391 oci->callstatus |= CIST_TAIL; /* function was tail called */ 1391 oci->callstatus |= CIST_TAIL; /* function was tail called */
1392 ci = L->ci = oci; /* remove new frame */ 1392 ci = L->ci = oci; /* remove new frame */
1393 L->func = ofunc;
1393 lua_assert(L->top == 1394 lua_assert(L->top ==
1394 oci->func + 1 + getproto(s2v(ofunc))->maxstacksize); 1395 oci->func + 1 + getproto(s2v(ofunc))->maxstacksize);
1395 goto newframe; /* restart luaV_execute over new Lua function */ 1396 goto newframe; /* restart luaV_execute over new Lua function */