** Search for 'objidx' in table at index -1. ('objidx' must be an ** absolute index.) Return 1 + string at top if it found a good name. */
| 50 | ** absolute index.) Return 1 + string at top if it found a good name. |
| 51 | */ |
| 52 | static int findfield (lua_State *L, int objidx, int level) { |
| 53 | if (level == 0 || !lua_istable(L, -1)) |
| 54 | return 0; /* not found */ |
| 55 | lua_pushnil(L); /* start 'next' loop */ |
| 56 | while (lua_next(L, -2)) { /* for each pair in table */ |
| 57 | if (lua_type(L, -2) == LUA_TSTRING) { /* ignore non-string keys */ |
| 58 | if (lua_rawequal(L, objidx, -1)) { /* found object? */ |
| 59 | lua_pop(L, 1); /* remove value (but keep name) */ |
| 60 | return 1; |
| 61 | } |
| 62 | else if (findfield(L, objidx, level - 1)) { /* try recursively */ |
| 63 | /* stack: lib_name, lib_table, field_name (top) */ |
| 64 | lua_pushliteral(L, "."); /* place '.' between the two names */ |
| 65 | lua_replace(L, -3); /* (in the slot occupied by table) */ |
| 66 | lua_concat(L, 3); /* lib_name.field_name */ |
| 67 | return 1; |
| 68 | } |
| 69 | } |
| 70 | lua_pop(L, 1); /* remove value */ |
| 71 | } |
| 72 | return 0; /* not found */ |
| 73 | } |
| 74 | |
| 75 | |
| 76 | /* |
no test coverage detected