From 078b2ffd38da040ab87a9686bcc2e796841cccb7 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Sat, 14 Jul 2018 14:41:30 +0200 Subject: Replaced all the remaining concrete locations in internal rendering buffers. --- src/analysis/db/items/comment.c | 19 +++++++++--- src/analysis/routine.c | 16 ++++++++-- src/arch/target.c | 9 +++++- src/glibext/gbuffercache.c | 69 ++++++++++++++--------------------------- src/glibext/gbuffercache.h | 6 ++-- src/glibext/gbufferview.c | 49 +++++++++++++++++++---------- src/glibext/gbufferview.h | 6 ++-- src/gtkext/graph/cluster.c | 14 ++++++++- src/gtkext/gtkbufferdisplay.c | 12 ++++++- src/gtkext/gtkgraphdisplay.c | 3 +- src/gui/dialogs/gotox.c | 9 +++++- 11 files changed, 133 insertions(+), 79 deletions(-) diff --git a/src/analysis/db/items/comment.c b/src/analysis/db/items/comment.c index 394abe2..57bb017 100644 --- a/src/analysis/db/items/comment.c +++ b/src/analysis/db/items/comment.c @@ -628,6 +628,7 @@ static bool g_db_comment_run(GDbComment *comment, GLoadedBinary *binary, bool ap { bool result; /* Bilan à faire remonter */ GBufferCache *cache; /* Ensemble de lignes à traiter*/ + GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Point d'insertion */ GArchProcessor *proc; /* Propriétaire d'instructions */ GArchInstruction *instr; /* Instruction à traiter */ @@ -641,7 +642,12 @@ static bool g_db_comment_run(GDbComment *comment, GLoadedBinary *binary, bool ap cache = g_loaded_binary_get_disassembled_cache(binary); - index = g_buffer_cache_find_index_by_addr(cache, &comment->addr, true); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), &comment->addr); + + index = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + + g_object_unref(G_OBJECT(cursor)); index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); @@ -696,15 +702,20 @@ static bool g_db_comment_run(GDbComment *comment, GLoadedBinary *binary, bool ap range = g_arch_instruction_get_range(source->linked); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), get_mrange_addr(range)); + + linked = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + assert(linked != g_buffer_cache_count_lines(cache)); + + g_object_unref(G_OBJECT(cursor)); + /** * On recherche ici une ligne potentiellement BLF_HAS_CODE ou BLF_IS_LABEL. * Comme on ne peut pas traiter les deux cas, on prend la première qui vient * avec BLF_NONE. */ - linked = g_buffer_cache_find_index_by_addr(cache, get_mrange_addr(range), true); - assert(linked != g_buffer_cache_count_lines(cache)); - linked = g_buffer_cache_look_for_flag(cache, linked, BLF_HAS_CODE | BLF_IS_LABEL); RUN_INLINED_COMMENT(linked, comment, comment->old_inlined[i]); diff --git a/src/analysis/routine.c b/src/analysis/routine.c index 19782c7..cc1e337 100644 --- a/src/analysis/routine.c +++ b/src/analysis/routine.c @@ -38,6 +38,7 @@ #include "../common/extstr.h" #include "../core/params.h" #include "../format/symbol-int.h" +#include "../glibext/gbinarycursor.h" @@ -1011,6 +1012,7 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi size_t i; /* Boucle de parcours */ instr_link_t *dest; /* Instr. visée par une autre */ const mrange_t *irange; /* Emplacement d'instruction */ + GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Indice de ligne à traiter */ GBufferLine *line; /* Ligne présente à l'adresse */ char *info; /* Ligne d'information créée */ @@ -1082,7 +1084,12 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi irange = g_arch_instruction_get_range(instr); - index = g_buffer_cache_find_index_by_addr(cache, get_mrange_addr(irange), true); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), get_mrange_addr(irange)); + + index = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + + g_object_unref(G_OBJECT(cursor)); index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); @@ -1133,7 +1140,12 @@ char *g_binary_routine_build_tooltip(const GBinRoutine *routine, const GLoadedBi irange = g_arch_instruction_get_range(dest->linked); - index = g_buffer_cache_find_index_by_addr(cache, get_mrange_addr(irange), true); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), get_mrange_addr(irange)); + + index = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + + g_object_unref(G_OBJECT(cursor)); index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); diff --git a/src/arch/target.c b/src/arch/target.c index 036aad0..97b2192 100644 --- a/src/arch/target.c +++ b/src/arch/target.c @@ -36,6 +36,7 @@ #include "../analysis/routine.h" #include "../common/extstr.h" #include "../format/format.h" +#include "../glibext/gbinarycursor.h" @@ -373,6 +374,7 @@ static char *g_target_operand_build_tooltip(const GTargetOperand *operand, const SymbolType stype; /* Type de symbole identifié */ const mrange_t *srange; /* Emplacement du symbole */ GBufferCache *cache; /* Tampon de désassemblage */ + GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Indice de ligne à traiter */ GBufferLine *line; /* Ligne présente à l'adresse */ @@ -396,7 +398,12 @@ static char *g_target_operand_build_tooltip(const GTargetOperand *operand, const cache = g_loaded_binary_get_disassembled_cache(binary); - index = g_buffer_cache_find_index_by_addr(cache, get_mrange_addr(srange), true); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), get_mrange_addr(srange)); + + index = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + + g_object_unref(G_OBJECT(cursor)); index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); diff --git a/src/glibext/gbuffercache.c b/src/glibext/gbuffercache.c index a64ec68..91f3a6d 100644 --- a/src/glibext/gbuffercache.c +++ b/src/glibext/gbuffercache.c @@ -29,7 +29,6 @@ #include -#include "gbinarycursor.h" // REMME #include "chrysamarshal.h" @@ -1479,11 +1478,11 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s /****************************************************************************** * * -* Paramètres : cache = tampon de lignes à consulter. * -* addr = adresse à retrouver dans le tampon. * -* first = indique si on l'arrête à la première ou la dernière. * -* start = borne inférieure des recherches (incluse). * -* end = borne supérieure des recherches (incluse). * +* Paramètres : cache = tampon de lignes à consulter. * +* cursor = emplacement à retrouver dans le tampon. * +* first = indique si on l'arrête à la première ou la dernière.* +* start = borne inférieure des recherches (incluse). * +* end = borne supérieure des recherches (incluse). * * * * Description : Indique l'indice correspondant à une adresse donnée. * * * @@ -1493,10 +1492,9 @@ void g_buffer_cache_draw(const GBufferCache *cache, cairo_t *cr, size_t first, s * * ******************************************************************************/ -size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2t *addr, bool first, size_t start, size_t end) +size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLineCursor *cursor, bool first, size_t start, size_t end) { size_t result; /* Indice à retourner */ - GLineCursor *___tmp; cache_info *found; /* Eventuel élément trouvé */ int find_containing_generator(const GLineCursor *c, const cache_info *i) @@ -1513,12 +1511,7 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2 } - - ___tmp = g_binary_cursor_new(); - g_binary_cursor_update(G_BINARY_CURSOR(___tmp), addr); - - - found = (cache_info *)bsearch(___tmp, &cache->lines[start], end - start + 1, + found = (cache_info *)bsearch(cursor, &cache->lines[start], end - start + 1, sizeof(cache_info), (__compar_fn_t)find_containing_generator); if (found == NULL) @@ -1536,7 +1529,7 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2 { found = &cache->lines[result - 1]; - if (find_containing_generator(___tmp, found) != 0) + if (find_containing_generator(cursor, found) != 0) break; } @@ -1546,17 +1539,13 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2 { found = &cache->lines[result + 1]; - if (find_containing_generator(___tmp, found) != 0) + if (find_containing_generator(cursor, found) != 0) break; } } - - g_object_unref(G_OBJECT(___tmp)); - - return result; } @@ -1564,9 +1553,9 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2 /****************************************************************************** * * -* Paramètres : cache = tampon de lignes à consulter. * -* addr = adresse à retrouver dans le tampon. * -* first = indique si on l'arrête à la première ou la dernière. * +* Paramètres : cache = tampon de lignes à consulter. * +* cursor = emplacement à retrouver dans le tampon. * +* first = indique si on l'arrête à la première ou la dernière.* * * * Description : Indique l'indice correspondant à une adresse donnée. * * * @@ -1576,14 +1565,14 @@ size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2 * * ******************************************************************************/ -size_t g_buffer_cache_find_index_by_addr(const GBufferCache *cache, const vmpa2t *addr, bool first) +size_t g_buffer_cache_find_index_by_cursor(const GBufferCache *cache, const GLineCursor *cursor, bool first) { size_t result; /* Indice à retourner */ if (cache->used == 0) result = 0; else - result = _g_buffer_cache_find_index_by_addr(cache, addr, first, 0, cache->used - 1); + result = _g_buffer_cache_find_index_by_cursor(cache, cursor, first, 0, cache->used - 1); return result; @@ -1646,13 +1635,13 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf /****************************************************************************** * * -* Paramètres : cache = tampon de lignes à consulter. * -* addr = adresse à présenter à l'écran. * -* first = borne inférieure des recherches (incluse). * -* last = borne supérieure des recherches (incluse). * -* code = s'arrête si possible à une ligne avec code. * -* x = position horizontale au sein du composant. [OUT] * -* y = position verticale au sein du composant. [OUT] * +* Paramètres : cache = tampon de lignes à consulter. * +* cursor = emplacement à présenter à l'écran. * +* first = borne inférieure des recherches (incluse). * +* last = borne supérieure des recherches (incluse). * +* code = s'arrête si possible à une ligne avec code. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * @@ -1662,21 +1651,15 @@ size_t g_buffer_cache_look_for_flag(const GBufferCache *cache, size_t start, Buf * * ******************************************************************************/ -bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmpa2t *addr, size_t first, size_t last, bool code, gint *x, gint *y) +bool g_buffer_cache_get_cursor_coordinates(const GBufferCache *cache, const GLineCursor *cursor, size_t first, size_t last, bool code, gint *x, gint *y) { bool result; /* Bilan à retourner */ - GLineCursor *___tmp; size_t index; /* Indice de correspondance */ gint lheight; /* Hauteur d'une ligne */ const cache_info *info; /* Infos sur une ligne donnée */ const generator_link *generator; /* Générateur retenu */ - - ___tmp = g_binary_cursor_new(); - g_binary_cursor_update(G_BINARY_CURSOR(___tmp), addr); - - - index = _g_buffer_cache_find_index_by_addr(cache, addr, true, first, last); + index = _g_buffer_cache_find_index_by_cursor(cache, cursor, true, first, last); result = (index < cache->used); @@ -1702,7 +1685,7 @@ bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmp else generator = &info->generators[0]; - if (!g_line_generator_contains_cursor(generator->instance, index + 1, generator->repeat, ___tmp)) + if (!g_line_generator_contains_cursor(generator->instance, index + 1, generator->repeat, cursor)) break; *y += lheight; @@ -1711,10 +1694,6 @@ bool g_buffer_cache_get_address_coordinates(const GBufferCache *cache, const vmp } - - g_object_unref(G_OBJECT(___tmp)); - - return result; } diff --git a/src/glibext/gbuffercache.h b/src/glibext/gbuffercache.h index fdf59d7..453588e 100644 --- a/src/glibext/gbuffercache.h +++ b/src/glibext/gbuffercache.h @@ -105,16 +105,16 @@ void g_buffer_cache_collect_widths(GBufferCache *, size_t, line_width_summary *) void g_buffer_cache_draw(const GBufferCache *, cairo_t *, size_t, size_t, const cairo_rectangle_int_t *, const bool *, const gint *, const segcnt_list *); /* Indique l'indice correspondant à une adresse donnée. */ -size_t _g_buffer_cache_find_index_by_addr(const GBufferCache *, const vmpa2t *, bool, size_t, size_t); +size_t _g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool, size_t, size_t); /* Indique l'indice correspondant à une adresse donnée. */ -size_t g_buffer_cache_find_index_by_addr(const GBufferCache *, const vmpa2t *, bool); +size_t g_buffer_cache_find_index_by_cursor(const GBufferCache *, const GLineCursor *, bool); /* Avance autant que possible vers une ligne idéale. */ size_t g_buffer_cache_look_for_flag(const GBufferCache *, size_t, BufferLineFlags); /* Indique la position d'affichage d'une adresse donnée. */ -bool g_buffer_cache_get_address_coordinates(const GBufferCache *, const vmpa2t *, size_t, size_t, bool, gint *, gint *); +bool g_buffer_cache_get_cursor_coordinates(const GBufferCache *, const GLineCursor *, size_t, size_t, bool, gint *, gint *); diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c index 0eff4d8..c5bd81e 100644 --- a/src/glibext/gbufferview.c +++ b/src/glibext/gbufferview.c @@ -39,8 +39,8 @@ struct _GBufferView bool external; /* Note l'origine de la liste */ bool unrestricted; /* Validité des informations */ - vmpa2t start; /* Première ligne intégrée */ - vmpa2t end; /* Dernière ligne intégrée */ + GLineCursor *start; /* Première ligne intégrée */ + GLineCursor *end; /* Dernière ligne intégrée */ size_t first; /* Indice de la première ligne */ size_t last; /* Indice de la dernière ligne */ @@ -391,7 +391,7 @@ GBufferCache *g_buffer_view_get_cache(const GBufferView *view) * * ******************************************************************************/ -void g_buffer_view_restrict(GBufferView *view, const vmpa2t *start, const vmpa2t *end) +void g_buffer_view_restrict(GBufferView *view, GLineCursor *start, GLineCursor *end) { bool state; /* Nouvel état à proclamer */ GWidthTracker *template; /* Suivi déjà en place */ @@ -419,11 +419,11 @@ void g_buffer_view_restrict(GBufferView *view, const vmpa2t *start, const vmpa2t else { - copy_vmpa(&view->start, start); - copy_vmpa(&view->end, end); + view->start = start; + view->end = end; - view->first = g_buffer_cache_find_index_by_addr(view->cache, start, true); - view->last = g_buffer_cache_find_index_by_addr(view->cache, end, false); + view->first = g_buffer_cache_find_index_by_cursor(view->cache, start, true); + view->last = g_buffer_cache_find_index_by_cursor(view->cache, end, false); view->tracker = g_width_tracker_new_restricted(template, view->first, view->last); @@ -450,12 +450,27 @@ void g_buffer_view_restrict(GBufferView *view, const vmpa2t *start, const vmpa2t * * ******************************************************************************/ -bool g_buffer_view_get_restrictions(const GBufferView *view, vmpa2t *start, vmpa2t *end) +bool g_buffer_view_get_restrictions(const GBufferView *view, GLineCursor **start, GLineCursor **end) { if (!view->unrestricted) { - if (start != NULL) copy_vmpa(start, &view->start); - if (end != NULL) copy_vmpa(end, &view->end); + if (start != NULL) + { + *start = view->start; + g_object_ref(G_OBJECT(*start)); + } + + if (end != NULL) + { + *end = view->end; + g_object_ref(G_OBJECT(*end)); + } + + } + else + { + if (start != NULL) *start = NULL; + if (end != NULL) *end = NULL; } return !view->unrestricted; @@ -1184,11 +1199,11 @@ static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t /****************************************************************************** * * -* Paramètres : view = visualisation à consulter. * -* addr = adresse à présenter à l'écran. * -* code = s'arrête si possible à une ligne avec code. * -* x = position horizontale au sein du composant. [OUT] * -* y = position verticale au sein du composant. [OUT] * +* Paramètres : view = visualisation à consulter. * +* cursor = emplacement à présenter à l'écran. * +* code = s'arrête si possible à une ligne avec code. * +* x = position horizontale au sein du composant. [OUT] * +* y = position verticale au sein du composant. [OUT] * * * * Description : Indique la position d'affichage d'une adresse donnée. * * * @@ -1198,11 +1213,11 @@ static GBufferLine *g_buffer_view_find_line_at(GBufferView *view, gint y, size_t * * ******************************************************************************/ -bool g_buffer_view_get_address_coordinates(GBufferView *view, const vmpa2t *addr, bool code, gint *x, gint *y) +bool g_buffer_view_get_cursor_coordinates(GBufferView *view, const GLineCursor *cursor, bool code, gint *x, gint *y) { bool result; /* Bilan à retourner */ - result = g_buffer_cache_get_address_coordinates(view->cache, addr, view->first, view->last, code, x, y); + result = g_buffer_cache_get_cursor_coordinates(view->cache, cursor, view->first, view->last, code, x, y); return result; diff --git a/src/glibext/gbufferview.h b/src/glibext/gbufferview.h index facc3b7..6b5ef45 100644 --- a/src/glibext/gbufferview.h +++ b/src/glibext/gbufferview.h @@ -57,10 +57,10 @@ GBufferView *g_buffer_view_new(GBufferCache *, segcnt_list *); GBufferCache *g_buffer_view_get_cache(const GBufferView *); /* Restreint le champ d'application de l'affichage. */ -void g_buffer_view_restrict(GBufferView *, const vmpa2t *, const vmpa2t *); +void g_buffer_view_restrict(GBufferView *, GLineCursor *, GLineCursor *); /* Indique le champ d'application de l'affichage. */ -bool g_buffer_view_get_restrictions(const GBufferView *, vmpa2t *, vmpa2t *); +bool g_buffer_view_get_restrictions(const GBufferView *, GLineCursor **, GLineCursor **); @@ -105,7 +105,7 @@ void g_buffer_view_draw(const GBufferView *, cairo_t *, gint, const cairo_rectan /* Indique la position d'affichage d'une adresse donnée. */ -bool g_buffer_view_get_address_coordinates(GBufferView *, const vmpa2t *, bool, gint *, gint *); +bool g_buffer_view_get_cursor_coordinates(GBufferView *, const GLineCursor *, bool, gint *, gint *); diff --git a/src/gtkext/graph/cluster.c b/src/gtkext/graph/cluster.c index bf49484..57c1bfb 100644 --- a/src/gtkext/graph/cluster.c +++ b/src/gtkext/graph/cluster.c @@ -34,6 +34,7 @@ #include "../gtkbufferdisplay.h" #include "../gtkdisplaypanel.h" #include "../../common/sort.h" +#include "../../glibext/gbinarycursor.h" // REMME #include "../../glibext/gloadedpanel.h" @@ -302,6 +303,8 @@ GGraphCluster *g_graph_cluster_new(GLoadedBinary *binary, const GBlockList *list GGraphCluster *result; /* Structure à retourner */ vmpa2t first; /* Début d'un groupe de lignes */ vmpa2t last; /* Fin d'un groupe de lignes */ + GLineCursor *___tmp_first; + GLineCursor *___tmp_last; GBufferCache *cache; /* Tampon brut à découper */ GBufferView *view; /* Partie affichée du tampon */ GtkRequisition requisition; /* Taille à l'écran actuelle */ @@ -326,10 +329,19 @@ GGraphCluster *g_graph_cluster_new(GLoadedBinary *binary, const GBlockList *list g_basic_block_get_boundary_addresses(result->block, &first, &last); + + /////////////////////// + ___tmp_first = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(___tmp_first), &first); + ___tmp_last = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(___tmp_last), &last); + /////////////////////// + + cache = g_loaded_binary_get_disassembled_cache(binary); view = g_buffer_view_new(cache, highlighted); - g_buffer_view_restrict(view, &first, &last); + g_buffer_view_restrict(view, ___tmp_first, ___tmp_last); gtk_buffer_display_set_view(GTK_BUFFER_DISPLAY(result->display), view); /* Détermination d'une position initiale centrée */ diff --git a/src/gtkext/gtkbufferdisplay.c b/src/gtkext/gtkbufferdisplay.c index 3ef77b5..49167e8 100644 --- a/src/gtkext/gtkbufferdisplay.c +++ b/src/gtkext/gtkbufferdisplay.c @@ -678,13 +678,23 @@ static bool gtk_buffer_display_get_address_coordinates(const GtkBufferDisplay *d bool result; /* Bilan à remonter */ bool need_code; /* Recherche plus raffinée */ GBufferCache *cache; /* Gestionnaire de lignes */ + GLineCursor *___tmp; int height; /* Hauteur allouée */ need_code = (tweak == SPT_BOTTOM); cache = g_buffer_view_get_cache(display->view); - result = g_buffer_view_get_address_coordinates(display->view, addr, need_code, x, y); + + ___tmp = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(___tmp), addr); + + + result = g_buffer_view_get_cursor_coordinates(display->view, ___tmp, need_code, x, y); + + + g_object_unref(G_OBJECT(___tmp)); + if (result) { diff --git a/src/gtkext/gtkgraphdisplay.c b/src/gtkext/gtkgraphdisplay.c index ce882f9..8c8e5da 100644 --- a/src/gtkext/gtkgraphdisplay.c +++ b/src/gtkext/gtkgraphdisplay.c @@ -1081,6 +1081,7 @@ static void gtk_graph_display_changed_highlights(GtkBlockDisplay *node, GtkGraph static void gtk_graph_display_reach_caret_limit(GtkBufferDisplay *node, GdkScrollDirection dir, GtkGraphDisplay *display) { +#if 0 GBufferView *view; /* Vue d'un tampon global */ vmpa2t first; /* Début d'un groupe de lignes */ vmpa2t last; /* Fin d'un groupe de lignes */ @@ -1258,5 +1259,5 @@ static void gtk_graph_display_reach_caret_limit(GtkBufferDisplay *node, GdkScrol } /* TODO : scrolling... */ - +#endif } diff --git a/src/gui/dialogs/gotox.c b/src/gui/dialogs/gotox.c index 72c2f8c..4d28e59 100644 --- a/src/gui/dialogs/gotox.c +++ b/src/gui/dialogs/gotox.c @@ -34,6 +34,7 @@ #include "../../core/paths.h" #include "../../format/format.h" #include "../../format/symiter.h" +#include "../../glibext/gbinarycursor.h" #include "../../gtkext/easygtk.h" @@ -369,6 +370,7 @@ GtkWidget *create_gotox_dialog_for_cross_references(GtkWindow *parent, GLoadedBi static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, const vmpa2t *addr, GBinSymbol *hint) { GBufferCache *cache; /* Tampon de désassemblage */ + GLineCursor *cursor; /* Emplacement dans un tampon */ size_t index; /* Indice de ligne à traiter */ GBufferLine *line; /* Ligne présente à l'adresse */ char *virtual; /* Transcription d'adresse */ @@ -386,7 +388,12 @@ static void add_new_location_to_list(GtkTreeStore *store, GLoadedBinary *binary, cache = g_loaded_binary_get_disassembled_cache(binary); - index = g_buffer_cache_find_index_by_addr(cache, addr, true); + cursor = g_binary_cursor_new(); + g_binary_cursor_update(G_BINARY_CURSOR(cursor), addr); + + index = g_buffer_cache_find_index_by_cursor(cache, cursor, true); + + g_object_unref(G_OBJECT(cursor)); index = g_buffer_cache_look_for_flag(cache, index, BLF_HAS_CODE); -- cgit v0.11.2-87-g4458