1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
| static void _parse_variables (lua_State *L, lua_Debug *ar, luaL_Buffer *B,
int start, int step, int count,
int need_anonymous_var, const char *fmt) {
const char *var_name, *type_name, *value_str;
while (count-- > 0 && (var_name = lua_getlocal(L, ar, start)) != NULL) {
type_name = luaL_typename(L, -1);
value_str = luaL_tolstring(L, -1, NULL);
lua_pop(L, 1);
if (need_anonymous_var > 0 || var_name[0] != '(') {
lua_pushfstring(B->L, fmt, var_name, type_name, value_str);
luaL_addvalue(B);
}
start += step;
}
}
static void parse_func_variables (lua_State *L, lua_State *L1, lua_Debug ar) {
luaL_Buffer b;
luaL_buffinit(L, &b);
lua_getinfo(L1, "u", &ar);
// func args
_parse_variables(L1, &ar, &b, 1, 1, ar.nparams, 0, "\n\t => arg %s [%s] = %s");
// func varargs
_parse_variables(L1, &ar, &b, -1, -1, INT_MAX, 1, "\n\t => %s [%s] = %s");
// func locals
_parse_variables(L1, &ar, &b, ar.nparams + 1, 1, INT_MAX, 0, "\n\t => local %s [%s] = %s");
luaL_pushresult(&b);
}
|