aboutsummaryrefslogtreecommitdiff
path: root/ldebug.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 /ldebug.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 'ldebug.c')
-rw-r--r--ldebug.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/ldebug.c b/ldebug.c
index 93a935a5..3ddac547 100644
--- a/ldebug.c
+++ b/ldebug.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ldebug.c,v 2.152 2018/01/10 12:02:35 roberto Exp roberto $ 2** $Id: ldebug.c,v 2.153 2018/02/06 19:16:56 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*/
@@ -187,12 +187,28 @@ static const char *upvalname (Proto *p, int uv) {
187} 187}
188 188
189 189
190static const char *findvararg (CallInfo *ci, int n, StkId *pos) {
191 if (clLvalue(s2v(ci->func))->p->is_vararg) {
192 int nextra = ci->u.l.nextraargs;
193 if (n <= nextra) {
194 *pos = ci->func - nextra + (n - 1);
195 return "(*vararg)"; /* generic name for any vararg */
196 }
197 }
198 return NULL; /* no such vararg */
199}
200
201
190static const char *findlocal (lua_State *L, CallInfo *ci, int n, 202static const char *findlocal (lua_State *L, CallInfo *ci, int n,
191 StkId *pos) { 203 StkId *pos) {
192 StkId base = ci->func + 1; 204 StkId base = ci->func + 1;
193 const char *name = (isLua(ci)) 205 const char *name = NULL;
194 ? luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci)) 206 if (isLua(ci)) {
195 : NULL; 207 if (n < 0) /* access to vararg values? */
208 return findvararg(ci, -n, pos);
209 else
210 name = luaF_getlocalname(ci_func(ci)->p, n, currentpc(ci));
211 }
196 if (name == NULL) { /* no 'standard' name? */ 212 if (name == NULL) { /* no 'standard' name? */
197 StkId limit = (ci == L->ci) ? L->top : ci->next->func; 213 StkId limit = (ci == L->ci) ? L->top : ci->next->func;
198 if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */ 214 if (limit - base >= n && n > 0) /* is 'n' inside 'ci' stack? */
@@ -324,7 +340,7 @@ static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar,
324 } 340 }
325 else { 341 else {
326 ar->isvararg = f->l.p->is_vararg; 342 ar->isvararg = f->l.p->is_vararg;
327 ar->nparams = f->l.p->numparams + f->l.p->is_vararg; 343 ar->nparams = f->l.p->numparams;
328 } 344 }
329 break; 345 break;
330 } 346 }