diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-12-13 15:47:58 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-12-13 15:47:58 -0200 |
| commit | c8da3fbc35ea1a7a313f298e98e3829c06a270fb (patch) | |
| tree | a131c914f2534600cd837c0e988c1ac3c4588c83 | |
| parent | c96cd1c647f4b34964d403d7c3da826476afbb19 (diff) | |
| download | lua-c8da3fbc35ea1a7a313f298e98e3829c06a270fb.tar.gz lua-c8da3fbc35ea1a7a313f298e98e3829c06a270fb.tar.bz2 lua-c8da3fbc35ea1a7a313f298e98e3829c06a270fb.zip | |
in traceback names, give preference to 'name' over '_G.name'
| -rw-r--r-- | lauxlib.c | 7 |
1 files changed, 4 insertions, 3 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lauxlib.c,v 1.276 2014/12/08 15:26:09 roberto Exp $ | 2 | ** $Id: lauxlib.c,v 1.277 2014/12/10 11:31:32 roberto Exp roberto $ |
| 3 | ** Auxiliary functions for building Lua libraries | 3 | ** Auxiliary functions for building Lua libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -48,7 +48,7 @@ static int findfield (lua_State *L, int objidx, int level) { | |||
| 48 | lua_pushnil(L); /* start 'next' loop */ | 48 | lua_pushnil(L); /* start 'next' loop */ |
| 49 | while (lua_next(L, -2)) { /* for each pair in table */ | 49 | while (lua_next(L, -2)) { /* for each pair in table */ |
| 50 | if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ | 50 | if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ |
| 51 | if (lua_rawequal(L, objidx, -1)) { /* found object? */ | 51 | if (level == 1 && lua_rawequal(L, objidx, -1)) { /* found object? */ |
| 52 | lua_pop(L, 1); /* remove value (but keep name) */ | 52 | lua_pop(L, 1); /* remove value (but keep name) */ |
| 53 | return 1; | 53 | return 1; |
| 54 | } | 54 | } |
| @@ -70,7 +70,8 @@ static int pushglobalfuncname (lua_State *L, lua_Debug *ar) { | |||
| 70 | int top = lua_gettop(L); | 70 | int top = lua_gettop(L); |
| 71 | lua_getinfo(L, "f", ar); /* push function */ | 71 | lua_getinfo(L, "f", ar); /* push function */ |
| 72 | lua_pushglobaltable(L); | 72 | lua_pushglobaltable(L); |
| 73 | if (findfield(L, top + 1, 2)) { | 73 | /* try first global names, and then global.name names */ |
| 74 | if (findfield(L, top + 1, 1) || findfield(L, top + 1, 2)) { | ||
| 74 | lua_copy(L, -1, top + 1); /* move name to proper place */ | 75 | lua_copy(L, -1, top + 1); /* move name to proper place */ |
| 75 | lua_pop(L, 2); /* remove pushed values */ | 76 | lua_pop(L, 2); /* remove pushed values */ |
| 76 | return 1; | 77 | return 1; |
