Fix #3289 - Fix graph arg/local in JSON

This commit is contained in:
pancake 2015-09-17 01:47:40 +02:00
parent f10c8ec075
commit 0cf36cbc6d
3 changed files with 37 additions and 3 deletions

View File

@ -253,6 +253,38 @@ R_API int r_anal_fcn_var_del_bydelta (RAnal *a, ut64 fna, const char kind, int s
return false;
}
R_API int r_anal_var_count(RAnal *a, RAnalFunction *fcn, int kind) {
char *varlist;
int count = 0;
RList *list = r_list_new ();
if (!a|| !fcn)
return 0;
if (!kind) kind = 'v'; // by default show vars
varlist = sdb_get (DB, sdb_fmt (0, "fcn.0x%"PFMT64x".%c",
fcn->addr, kind), 0);
if (varlist) {
char *next, *ptr = varlist;
if (varlist && *varlist) {
do {
struct VarType vt;
char *word = sdb_anext (ptr, &next);
char *vardef = sdb_get (DB, sdb_fmt (1,
"var.0x%"PFMT64x".%c.%s",
fcn->addr, kind, word), 0);
int delta = atoi (word+2);
if (vardef) {
count ++;
} else {
eprintf ("Cannot find '%s'\n", word);
}
ptr = next;
} while (next);
}
}
free (varlist);
return count;
}
R_API RList *r_anal_var_list(RAnal *a, RAnalFunction *fcn, int kind) {
char *varlist;
RList *list = r_list_new ();

View File

@ -597,10 +597,10 @@ static void core_anal_graph_nodes(RCore *core, RAnalFunction *fcn, int opts) {
sdb_set (DB, "name", fcn->name, 0);
sdb_set (DB, "ename", ename, 0);
free (ename);
if (fcn->nargs>0)
if (fcn->nargs > 0)
sdb_num_set (DB, "nargs", fcn->nargs, 0);
sdb_num_set (DB, "size", fcn->size, 0);
if (fcn->stack>0)
if (fcn->stack > 0)
sdb_num_set (DB, "stack", fcn->stack, 0);
sdb_set (DB, "pos", "0,0", 0); // needs to run layout
sdb_set (DB, "type", r_anal_fcn_type_tostring (fcn->type), 0);
@ -610,7 +610,8 @@ static void core_anal_graph_nodes(RCore *core, RAnalFunction *fcn, int opts) {
r_cons_printf ("{\"name\":\"%s\"", fcn->name);
r_cons_printf (",\"offset\":%"PFMT64d, fcn->addr);
r_cons_printf (",\"ninstr\":%"PFMT64d, fcn->ninstr);
r_cons_printf (",\"nargs\":%"PFMT64d, fcn->nargs);
r_cons_printf (",\"nargs\":%d", r_anal_var_count (core->anal, fcn, 'a'));
r_cons_printf (",\"locals\":%d", r_anal_var_count (core->anal, fcn, 'v'));
r_cons_printf (",\"size\":%d", fcn->size);
r_cons_printf (",\"stack\":%d", fcn->stack);
r_cons_printf (",\"type\":%d", fcn->type); // TODO: output string

View File

@ -1221,6 +1221,7 @@ R_API int r_anal_fcn_var_add (RAnal *a, ut64 fna, int scope, int delta, const ch
R_API int r_anal_fcn_var_del_byindex (RAnal *a, ut64 fna, const char kind,
int scope, ut32 idx);
/* args */
R_API int r_anal_var_count(RAnal *a, RAnalFunction *fcn, int kind);
/* vars // globals. not here */