diff options
| -rw-r--r-- | lapi.c | 14 | ||||
| -rw-r--r-- | ldebug.c | 4 | ||||
| -rw-r--r-- | ldo.h | 6 | ||||
| -rw-r--r-- | lgc.c | 4 | ||||
| -rw-r--r-- | ltm.c | 15 | ||||
| -rw-r--r-- | lvm.c | 4 |
6 files changed, 26 insertions, 21 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.255 2015/09/09 13:45:50 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.256 2015/10/06 16:10:22 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -121,11 +121,11 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { | |||
| 121 | lua_lock(to); | 121 | lua_lock(to); |
| 122 | api_checknelems(from, n); | 122 | api_checknelems(from, n); |
| 123 | api_check(from, G(from) == G(to), "moving among independent states"); | 123 | api_check(from, G(from) == G(to), "moving among independent states"); |
| 124 | api_check(from, to->ci->top - to->top >= n, "not enough elements to move"); | 124 | api_check(from, to->ci->top - to->top >= n, "stack overflow"); |
| 125 | from->top -= n; | 125 | from->top -= n; |
| 126 | for (i = 0; i < n; i++) { | 126 | for (i = 0; i < n; i++) { |
| 127 | setobj2s(to, to->top, from->top + i); | 127 | setobj2s(to, to->top, from->top + i); |
| 128 | api_incr_top(to); | 128 | to->top++; /* stack already checked by previous 'api_check' */ |
| 129 | } | 129 | } |
| 130 | lua_unlock(to); | 130 | lua_unlock(to); |
| 131 | } | 131 | } |
| @@ -918,10 +918,10 @@ LUA_API void lua_callk (lua_State *L, int nargs, int nresults, | |||
| 918 | if (k != NULL && L->nny == 0) { /* need to prepare continuation? */ | 918 | if (k != NULL && L->nny == 0) { /* need to prepare continuation? */ |
| 919 | L->ci->u.c.k = k; /* save continuation */ | 919 | L->ci->u.c.k = k; /* save continuation */ |
| 920 | L->ci->u.c.ctx = ctx; /* save context */ | 920 | L->ci->u.c.ctx = ctx; /* save context */ |
| 921 | luaD_call(L, func, nresults, 1); /* do the call */ | 921 | luaD_call(L, func, nresults); /* do the call */ |
| 922 | } | 922 | } |
| 923 | else /* no continuation or no yieldable */ | 923 | else /* no continuation or no yieldable */ |
| 924 | luaD_call(L, func, nresults, 0); /* just do the call */ | 924 | luaD_callnoyield(L, func, nresults); /* just do the call */ |
| 925 | adjustresults(L, nresults); | 925 | adjustresults(L, nresults); |
| 926 | lua_unlock(L); | 926 | lua_unlock(L); |
| 927 | } | 927 | } |
| @@ -939,7 +939,7 @@ struct CallS { /* data to 'f_call' */ | |||
| 939 | 939 | ||
| 940 | static void f_call (lua_State *L, void *ud) { | 940 | static void f_call (lua_State *L, void *ud) { |
| 941 | struct CallS *c = cast(struct CallS *, ud); | 941 | struct CallS *c = cast(struct CallS *, ud); |
| 942 | luaD_call(L, c->func, c->nresults, 0); | 942 | luaD_callnoyield(L, c->func, c->nresults); |
| 943 | } | 943 | } |
| 944 | 944 | ||
| 945 | 945 | ||
| @@ -977,7 +977,7 @@ LUA_API int lua_pcallk (lua_State *L, int nargs, int nresults, int errfunc, | |||
| 977 | L->errfunc = func; | 977 | L->errfunc = func; |
| 978 | setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ | 978 | setoah(ci->callstatus, L->allowhook); /* save value of 'allowhook' */ |
| 979 | ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ | 979 | ci->callstatus |= CIST_YPCALL; /* function can do error recovery */ |
| 980 | luaD_call(L, c.func, nresults, 1); /* do the call */ | 980 | luaD_call(L, c.func, nresults); /* do the call */ |
| 981 | ci->callstatus &= ~CIST_YPCALL; | 981 | ci->callstatus &= ~CIST_YPCALL; |
| 982 | L->errfunc = ci->u.c.old_errfunc; | 982 | L->errfunc = ci->u.c.old_errfunc; |
| 983 | status = LUA_OK; /* if it is here, there were no errors */ | 983 | status = LUA_OK; /* if it is here, there were no errors */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldebug.c,v 2.115 2015/05/22 17:45:56 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.116 2015/10/22 14:40:47 roberto Exp roberto $ |
| 3 | ** Debug Interface | 3 | ** Debug Interface |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -618,7 +618,7 @@ l_noret luaG_errormsg (lua_State *L) { | |||
| 618 | setobjs2s(L, L->top, L->top - 1); /* move argument */ | 618 | setobjs2s(L, L->top, L->top - 1); /* move argument */ |
| 619 | setobjs2s(L, L->top - 1, errfunc); /* push function */ | 619 | setobjs2s(L, L->top - 1, errfunc); /* push function */ |
| 620 | L->top++; /* assume EXTRA_STACK */ | 620 | L->top++; /* assume EXTRA_STACK */ |
| 621 | luaD_call(L, L->top - 2, 1, 0); /* call it */ | 621 | luaD_callnoyield(L, L->top - 2, 1); /* call it */ |
| 622 | } | 622 | } |
| 623 | luaD_throw(L, LUA_ERRRUN); | 623 | luaD_throw(L, LUA_ERRRUN); |
| 624 | } | 624 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.h,v 2.23 2015/10/21 18:40:47 roberto Exp roberto $ | 2 | ** $Id: ldo.h,v 2.24 2015/11/02 16:09:30 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 | */ |
| @@ -40,8 +40,8 @@ LUAI_FUNC int luaD_protectedparser (lua_State *L, ZIO *z, const char *name, | |||
| 40 | const char *mode); | 40 | const char *mode); |
| 41 | LUAI_FUNC void luaD_hook (lua_State *L, int event, int line); | 41 | LUAI_FUNC void luaD_hook (lua_State *L, int event, int line); |
| 42 | LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); | 42 | LUAI_FUNC int luaD_precall (lua_State *L, StkId func, int nresults); |
| 43 | LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults, | 43 | LUAI_FUNC void luaD_call (lua_State *L, StkId func, int nResults); |
| 44 | int allowyield); | 44 | LUAI_FUNC void luaD_callnoyield (lua_State *L, StkId func, int nResults); |
| 45 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, | 45 | LUAI_FUNC int luaD_pcall (lua_State *L, Pfunc func, void *u, |
| 46 | ptrdiff_t oldtop, ptrdiff_t ef); | 46 | ptrdiff_t oldtop, ptrdiff_t ef); |
| 47 | LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult, int nres); | 47 | LUAI_FUNC int luaD_poscall (lua_State *L, StkId firstResult, int nres); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 2.207 2015/09/08 15:41:05 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 2.208 2015/11/02 16:19:29 roberto Exp roberto $ |
| 3 | ** Garbage Collector | 3 | ** Garbage Collector |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -797,7 +797,7 @@ static GCObject *udata2finalize (global_State *g) { | |||
| 797 | 797 | ||
| 798 | static void dothecall (lua_State *L, void *ud) { | 798 | static void dothecall (lua_State *L, void *ud) { |
| 799 | UNUSED(ud); | 799 | UNUSED(ud); |
| 800 | luaD_call(L, L->top - 2, 0, 0); | 800 | luaD_callnoyield(L, L->top - 2, 0); |
| 801 | } | 801 | } |
| 802 | 802 | ||
| 803 | 803 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.c,v 2.33 2014/11/21 12:15:57 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 2.34 2015/03/30 15:42:27 roberto Exp roberto $ |
| 3 | ** Tag methods | 3 | ** Tag methods |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -86,13 +86,18 @@ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { | |||
| 86 | void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, | 86 | void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, |
| 87 | const TValue *p2, TValue *p3, int hasres) { | 87 | const TValue *p2, TValue *p3, int hasres) { |
| 88 | ptrdiff_t result = savestack(L, p3); | 88 | ptrdiff_t result = savestack(L, p3); |
| 89 | setobj2s(L, L->top++, f); /* push function (assume EXTRA_STACK) */ | 89 | StkId func = L->top; |
| 90 | setobj2s(L, L->top++, p1); /* 1st argument */ | 90 | setobj2s(L, func, f); /* push function (assume EXTRA_STACK) */ |
| 91 | setobj2s(L, L->top++, p2); /* 2nd argument */ | 91 | setobj2s(L, func + 1, p1); /* 1st argument */ |
| 92 | setobj2s(L, func + 2, p2); /* 2nd argument */ | ||
| 93 | L->top += 3; | ||
| 92 | if (!hasres) /* no result? 'p3' is third argument */ | 94 | if (!hasres) /* no result? 'p3' is third argument */ |
| 93 | setobj2s(L, L->top++, p3); /* 3rd argument */ | 95 | setobj2s(L, L->top++, p3); /* 3rd argument */ |
| 94 | /* metamethod may yield only when called from Lua code */ | 96 | /* metamethod may yield only when called from Lua code */ |
| 95 | luaD_call(L, L->top - (4 - hasres), hasres, isLua(L->ci)); | 97 | if (isLua(L->ci)) |
| 98 | luaD_call(L, func, hasres); | ||
| 99 | else | ||
| 100 | luaD_callnoyield(L, func, hasres); | ||
| 96 | if (hasres) { /* if has result, move it to its place */ | 101 | if (hasres) { /* if has result, move it to its place */ |
| 97 | p3 = restorestack(L, result); | 102 | p3 = restorestack(L, result); |
| 98 | setobjs2s(L, p3, --L->top); | 103 | setobjs2s(L, p3, --L->top); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.258 2015/11/02 11:43:17 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.259 2015/11/02 14:06:01 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 | */ |
| @@ -1226,7 +1226,7 @@ void luaV_execute (lua_State *L) { | |||
| 1226 | setobjs2s(L, cb+1, ra+1); | 1226 | setobjs2s(L, cb+1, ra+1); |
| 1227 | setobjs2s(L, cb, ra); | 1227 | setobjs2s(L, cb, ra); |
| 1228 | L->top = cb + 3; /* func. + 2 args (state and index) */ | 1228 | L->top = cb + 3; /* func. + 2 args (state and index) */ |
| 1229 | Protect(luaD_call(L, cb, GETARG_C(i), 1)); | 1229 | Protect(luaD_call(L, cb, GETARG_C(i))); |
| 1230 | L->top = ci->top; | 1230 | L->top = ci->top; |
| 1231 | i = *(ci->u.l.savedpc++); /* go to next instruction */ | 1231 | i = *(ci->u.l.savedpc++); /* go to next instruction */ |
| 1232 | ra = RA(i); | 1232 | ra = RA(i); |
