mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-27 01:26:07 +00:00
Make aac run with O(1) instead of O(n+n*m) on files with class info
This commit is contained in:
parent
092695d262
commit
5d59c32db0
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user