aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-09 13:16:06 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2018-02-09 13:16:06 -0200
commitb1379936cf35787d3ef3aab82d1607a3e1562eef (patch)
treefe47cb5c35fddab945faf731f0bc175bf5431352 /lvm.c
parent4e0de3a43cc30a83334c272cb7575bf8412bfeae (diff)
downloadlua-b1379936cf35787d3ef3aab82d1607a3e1562eef.tar.gz
lua-b1379936cf35787d3ef3aab82d1607a3e1562eef.tar.bz2
lua-b1379936cf35787d3ef3aab82d1607a3e1562eef.zip
vararg back to '...' (but with another implementation)
new implementation should have zero overhead for non-vararg functions
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/lvm.c b/lvm.c
index 7f2e2492..2d01e4c1 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 2.337 2018/02/06 19:16:56 roberto Exp roberto $ 2** $Id: lvm.c,v 2.338 2018/02/07 15:18:04 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*/
@@ -1506,14 +1506,10 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1506 luaF_close(L, base); /* close upvalues from current call */ 1506 luaF_close(L, base); /* close upvalues from current call */
1507 if (!ttisLclosure(vra)) { /* C function? */ 1507 if (!ttisLclosure(vra)) { /* C function? */
1508 ProtectNT(luaD_call(L, ra, LUA_MULTRET)); /* call it */ 1508 ProtectNT(luaD_call(L, ra, LUA_MULTRET)); /* call it */
1509 if (trap) {
1510 updatebase(ci);
1511 ra = RA(i);
1512 }
1513 luaD_poscall(L, ci, ra, cast_int(L->top - ra));
1514 return;
1515 } 1509 }
1516 else { /* Lua tail call */ 1510 else { /* Lua tail call */
1511 if (cl->p->is_vararg)
1512 ci->func -= cl->p->numparams + ci->u.l.nextraargs + 1;
1517 luaD_pretailcall(L, ci, ra, b); /* prepare call frame */ 1513 luaD_pretailcall(L, ci, ra, b); /* prepare call frame */
1518 goto tailcall; 1514 goto tailcall;
1519 } 1515 }
@@ -1521,11 +1517,30 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1521 } 1517 }
1522 vmcase(OP_RETURN) { 1518 vmcase(OP_RETURN) {
1523 int b = GETARG_B(i); 1519 int b = GETARG_B(i);
1520 int n = (b != 0 ? b - 1 : cast_int(L->top - ra));
1521 if (TESTARG_k(i))
1522 luaF_close(L, base);
1523 halfProtect(luaD_poscall(L, ci, ra, n));
1524 return;
1525 }
1526 vmcase(OP_RETVARARG) {
1527 int b = GETARG_B(i);
1528 int nparams = GETARG_C(i);
1529 int nres = (b != 0 ? b - 1 : cast_int(L->top - ra));
1530 int delta = ci->u.l.nextraargs + nparams + 2;
1524 if (TESTARG_k(i)) 1531 if (TESTARG_k(i))
1525 luaF_close(L, base); 1532 luaF_close(L, base);
1526 halfProtect( 1533 savepc(L);
1527 luaD_poscall(L, ci, ra, (b != 0 ? b - 1 : cast_int(L->top - ra))) 1534 /* code similar to 'luaD_poscall', but with a delta */
1528 ); 1535 if (L->hookmask) {
1536 luaD_rethook(L, ci);
1537 if (ci->u.l.trap) {
1538 updatebase(ci);
1539 ra = RA(i);
1540 }
1541 }
1542 L->ci = ci->previous; /* back to caller */
1543 luaD_moveresults(L, ra, base - delta, nres, ci->nresults);
1529 return; 1544 return;
1530 } 1545 }
1531 vmcase(OP_RETURN0) { 1546 vmcase(OP_RETURN0) {
@@ -1702,12 +1717,11 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1702 } 1717 }
1703 vmcase(OP_VARARG) { 1718 vmcase(OP_VARARG) {
1704 int n = GETARG_C(i) - 1; /* required results */ 1719 int n = GETARG_C(i) - 1; /* required results */
1705 TValue *vtab = vRB(i); /* vararg table */ 1720 ProtectNT(luaT_getvarargs(L, ci, ra, n));
1706 Protect(luaT_getvarargs(L, vtab, ra, n));
1707 vmbreak; 1721 vmbreak;
1708 } 1722 }
1709 vmcase(OP_PREPVARARG) { 1723 vmcase(OP_PREPVARARG) {
1710 luaT_adjustvarargs(L, GETARG_A(i), base); 1724 luaT_adjustvarargs(L, GETARG_A(i), ci);
1711 updatetrap(ci); 1725 updatetrap(ci);
1712 if (trap) { 1726 if (trap) {
1713 luaD_hookcall(L, ci); 1727 luaD_hookcall(L, ci);