From 078b2ffd38da040ab87a9686bcc2e796841cccb7 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
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 <stdlib.h>
 
 
-#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