aboutsummaryrefslogtreecommitdiff
path: root/ldo.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-15 13:34:29 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-15 13:34:29 -0200
commit0682fe816929da2e5abe8e191ad9c8509e6bfc12 (patch)
treebac8b079fde63e7f2e436e51ed6fd571dfd6f195 /ldo.c
parentb1379936cf35787d3ef3aab82d1607a3e1562eef (diff)
downloadlua-0682fe816929da2e5abe8e191ad9c8509e6bfc12.tar.gz
lua-0682fe816929da2e5abe8e191ad9c8509e6bfc12.tar.bz2
lua-0682fe816929da2e5abe8e191ad9c8509e6bfc12.zip
some simplifications/optimizations in returns from Lua functions
Diffstat (limited to 'ldo.c')
-rw-r--r--ldo.c24
1 files changed, 16 insertions, 8 deletions
diff --git a/ldo.c b/ldo.c
index 64512487..19d6aefd 100644
--- a/ldo.c
+++ b/ldo.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldo.c,v 2.192 2018/02/07 15:55:18 roberto Exp roberto $ 2** $Id: ldo.c,v 2.193 2018/02/09 15:16:06 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*/
@@ -310,11 +310,19 @@ void luaD_hookcall (lua_State *L, CallInfo *ci) {
310} 310}
311 311
312 312
313void luaD_rethook (lua_State *L, CallInfo *ci) { 313static void rethook (lua_State *L, CallInfo *ci) {
314 if (isLuacode(ci)) 314 int delta = 0;
315 if (isLuacode(ci)) {
316 Proto *p = clLvalue(s2v(ci->func))->p;
317 if (p->is_vararg)
318 delta = ci->u.l.nextraargs + p->numparams + 1;
315 L->top = ci->top; /* prepare top */ 319 L->top = ci->top; /* prepare top */
316 if (L->hookmask & LUA_MASKRET) /* is return hook on? */ 320 }
321 if (L->hookmask & LUA_MASKRET) { /* is return hook on? */
322 ci->func += delta; /* if vararg, back to virtual 'func' */
317 luaD_hook(L, LUA_HOOKRET, -1); /* call it */ 323 luaD_hook(L, LUA_HOOKRET, -1); /* call it */
324 ci->func -= delta;
325 }
318 if (isLua(ci->previous)) 326 if (isLua(ci->previous))
319 L->oldpc = ci->previous->u.l.savedpc; /* update 'oldpc' */ 327 L->oldpc = ci->previous->u.l.savedpc; /* update 'oldpc' */
320} 328}
@@ -343,8 +351,8 @@ void luaD_tryfuncTM (lua_State *L, StkId func) {
343** expressions, multiple results for tail calls/single parameters) 351** expressions, multiple results for tail calls/single parameters)
344** separated. 352** separated.
345*/ 353*/
346void luaD_moveresults (lua_State *L, StkId firstResult, StkId res, 354static void moveresults (lua_State *L, StkId firstResult, StkId res,
347 int nres, int wanted) { 355 int nres, int wanted) {
348 switch (wanted) { /* handle typical cases separately */ 356 switch (wanted) { /* handle typical cases separately */
349 case 0: break; /* nothing to move */ 357 case 0: break; /* nothing to move */
350 case 1: { /* one result needed */ 358 case 1: { /* one result needed */
@@ -387,12 +395,12 @@ void luaD_moveresults (lua_State *L, StkId firstResult, StkId res,
387void luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) { 395void luaD_poscall (lua_State *L, CallInfo *ci, StkId firstResult, int nres) {
388 if (L->hookmask) { 396 if (L->hookmask) {
389 ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */ 397 ptrdiff_t fr = savestack(L, firstResult); /* hook may change stack */
390 luaD_rethook(L, ci); 398 rethook(L, ci);
391 firstResult = restorestack(L, fr); 399 firstResult = restorestack(L, fr);
392 } 400 }
393 L->ci = ci->previous; /* back to caller */ 401 L->ci = ci->previous; /* back to caller */
394 /* move results to proper place */ 402 /* move results to proper place */
395 luaD_moveresults(L, firstResult, ci->func, nres, ci->nresults); 403 moveresults(L, firstResult, ci->func, nres, ci->nresults);
396} 404}
397 405
398 406