Make aac run with O(1) instead of O(n+n*m) on files with class info

This commit is contained in:
pancake 2018-03-23 13:51:47 +01:00
parent 092695d262
commit 5d59c32db0
3 changed files with 26 additions and 9 deletions

View File

@ -209,6 +209,22 @@ R_API int r_bin_object_set_items(RBinFile *binfile, RBinObject *o) {
if (bin->filter) {
r_bin_filter_classes (o->classes);
}
// cache addr=class+method
RList *klasses = cp->classes (binfile);
RListIter *iter, *iter2;
RBinClass *klass;
RBinSymbol *method;
if (!o->addr2klassmethod) {
// this is slow. must be optimized, but at least its cached
o->addr2klassmethod = sdb_new0 ();
r_list_foreach (klasses, iter, klass) {
r_list_foreach (klass->methods, iter2, method) {
char *km = sdb_fmt (-1, "method.%s.%s", klass->name, method->name);
char *at = sdb_fmt (-1, "0x%08"PFMT64x, method->vaddr);
sdb_set (o->addr2klassmethod, at, km, 0);
}
}
}
}
if (cp->lines) {
o->lines = cp->lines (binfile);
@ -249,6 +265,7 @@ R_API void r_bin_object_delete_items(RBinObject *o) {
if (!o) {
return;
}
sdb_free (o->addr2klassmethod);
r_list_free (o->entries);
r_list_free (o->fields);
r_list_free (o->imports);

View File

@ -31,15 +31,14 @@ static void loganal(ut64 from, ut64 to, int depth) {
}
static char *getFunctionName(RCore *core, ut64 addr) {
RBinClass *klass;
RBinSymbol *method;
RListIter *iter, *iter2;
RList *klasses = r_bin_get_classes (core->bin);
r_list_foreach (klasses, iter, klass) {
r_list_foreach (klass->methods, iter2, method) {
if (method->vaddr == addr) {
return r_str_newf ("method.%s.%s", klass->name, method->name);
}
RBinFile *bf = r_bin_cur (core->bin);
RBinObject *bo = r_bin_file_object_get_cur (bf);
if (bo) {
Sdb *kv = bo->addr2klassmethod;
char *at = sdb_fmt (-1, "0x%08"PFMT64x, addr);
char *res = sdb_get (kv, at, 0);
if (res) {
return strdup (res);
}
}
RFlagItem *fi = r_flag_get_at (core->flags, addr, false);

View File

@ -224,6 +224,7 @@ typedef struct r_bin_object_t {
int referenced;
int lang;
Sdb *kv;
Sdb *addr2klassmethod;
void *bin_obj; // internal pointer used by formats
} RBinObject;