diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-09 13:16:06 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-09 13:16:06 -0200 |
commit | b1379936cf35787d3ef3aab82d1607a3e1562eef (patch) | |
tree | fe47cb5c35fddab945faf731f0bc175bf5431352 /lvm.c | |
parent | 4e0de3a43cc30a83334c272cb7575bf8412bfeae (diff) | |
download | lua-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.c | 40 |
1 files changed, 27 insertions, 13 deletions
@@ -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); |