[geany/geany-plugins] d63ea1: scope - memory leaks and other fixes, tips about Memory
Dimitar Zhekov
git-noreply at geany.org
Sun Jan 20 19:06:58 UTC 2013
Branch: refs/heads/master
Author: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date: Sun, 20 Jan 2013 19:06:58 UTC
Commit: d63ea124412de54da2502670179e9338a8d25c6c
https://github.com/geany/geany-plugins/commit/d63ea124412de54da2502670179e9338a8d25c6c
Log Message:
-----------
scope - memory leaks and other fixes, tips about Memory
Modified Paths:
--------------
scope/ChangeLog
scope/NOTES
scope/docs/scope.html
scope/src/break.c
scope/src/debug.c
scope/src/gtk216.c
scope/src/inspect.c
scope/src/local.c
scope/src/memory.c
scope/src/menu.c
scope/src/scope.c
scope/src/stack.c
scope/src/stack.h
scope/src/thread.c
scope/src/thread.h
scope/src/utils.c
scope/src/utils.h
scope/src/views.c
scope/src/views.h
scope/src/watch.c
Modified: scope/ChangeLog
36 files changed, 28 insertions(+), 8 deletions(-)
===================================================================
@@ -1,3 +1,30 @@
+2013-01-20 Dimitar Zhekov <dimitar.zhekov at gmail.com>
+
+ * src/debug.c:
+ Reduced dependency of win32 waitpid()/kill() emulation on glib.
+ * src/thread.c:
+ Change frame id to 0 or none immediately after thread change.
+ * src/stack.c:
+ Select frame 0 instead of the first available if the current frame
+ is no longer valid.
+ * src/local.c, src/views.c, src/views.h, src/watch.c:
+ Skip stack update if frame 0 for watches only.
+ * src/stack.c:
+ Select and focus only if the current frame is not valid any more.
+ * docs/scope.html:
+ Added tips about Memory.
+ * src/memory.c:
+ Distinguish between memory Clear and auto clear.
+ Fixed menu extra state bug.
+ * src/views.c:
+ Mark memory as auto clear.
+ * src/break.c, src/inspect.c, src/local.c, src/menu.c, src/stack.c,
+ src/thread.c, src/views.c, src/utils.c, src/watch.c:
+ Free string values returned by gtk_tree_model_get().
+ * docs/scope.html, src/scope.c:
+ Increased version to 0.83.
+
+
2013-01-15 Dimitar Zhekov <dimitar.zhekov at gmail.com>
* data/scope.glade, docs/codes.html, docs/scope.html, src/common.h,
@@ -43,23 +70,16 @@
* src/debug.c, src/scope.c:
Ask user whether to terminate debugging on build actions.
-
* src/debug.c:
Ignore "Auto run/exit" on Terminate if neither an executable nor a
load script is specified.
-
-
-2013-01-02 Dimitar Zhekov <dimitar.zhekov at gmail.com>
-
* docs/codes.html, src/inspect.c, src/inspect.h, src/local.c,
src/local.h, src/menu.c, src/menu.h, src/parse.c, src/views.c,
src/views.h, src/watch.c, src/watch.h:
Unified/simplified all "modified" tokens. The original version was
an overkill, and did not update all possible value references.
-
* src/thread.c:
Small "modified" tokens unification related changes.
-
* docs/scope.html, src/scope.c:
Increased version to 0.80.
@@ -140,7 +160,7 @@
* src/common.h, src/menu.h:
Fixed forward declarations (though my gcc accepts them).
* src/menu.c, src/tooltip.c, src/views.c, src/views.h:
- Clear scid_gen on program exit. No real risk of overflow,
+ Clear scid_gen on program exit. No real risk of overflow,
but smaller values look better in Debug Console.
* src/menu.c:
Position cursor in modify dialog after " = ".
Modified: scope/NOTES
4 files changed, 4 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,7 @@
+when switching to stack...memory and update is not possible, the subpage
+contents will be kept if an update command for this page was sent on the
+last thread stop/changed; otherwise it'll be cleared
+
"^done,value=\"", '7' matches 07-var-assign, handled later as "^done", '7'
the only way to fix unnecessary inspect drop target expansion is to block
Modified: scope/docs/scope.html
19 files changed, 18 insertions(+), 1 deletions(-)
===================================================================
@@ -47,6 +47,7 @@
<li><a href="#stack">Stack</a></li>
<li><a href="#local">Locals</a></li>
<li><a href="#watch">Watches</a></li>
+ <li><a href="#memory">Memory</a></li>
<li><a href="#local_watch">Locals/Watches</a></li>
<li><a href="#console">Debug Console</a></li>
</ul></li>
@@ -425,6 +426,19 @@
<p><em>Show .names</em> - display member names. Shift+Click resets it to the value specified
in <em>Setup Program</em>.</p>
+<p><b><a name="memory">Memory</a></b></p>
+
+<p><em>Group by</em> is for visual convinience only and ignores endian.</p>
+
+<p>Groups are not wrapped, so with <em>Group by</em> > 1, less than
+<em>memory_line_bytes</em> may be displayed.</p>
+
+<p>A maximum of 16K may be displayed (128 lines * 128 bytes); <em>gdb_buffer_length</em> also
+limits the size.</p>
+
+<p><em>Memory</em> empty but <em>Clear</em> available means that the subpage can not be
+updated ATM; if you explicitly <em>Clear</em> it, no further updates will take place.</p>
+
<p><b><a name="console">Debug Console</a></b></p>
<div><table>
@@ -537,6 +551,9 @@
<p><em>pref_tooltips_length</em> - maximum length of a tooltip message, 0 = unlimited.
Default = 2048.</p>
+<p><em>memory_line_bytes</em></p> - maximum bytes per <em>Memory</em> line</p>.
+
+
<p>[terminal] (*nix only)</p>
<p><em>width</em>, <em>height</em> - VTE widget (not terminal window) size</p>
@@ -686,7 +703,7 @@
<b><a name="copyright">Copyright</a></b>
-<p>Scope 0.82, Copyright (C) 2013 Dimitar Toshkov Zhekov</p>
+<p>Scope 0.83, Copyright (C) 2013 Dimitar Toshkov Zhekov</p>
<p>The menu and toolbar icons are from <a href="http://netbeans.org">Netbeans</a>, except for
BreakPoint.</p>
Modified: scope/src/break.c
111 files changed, 76 insertions(+), 35 deletions(-)
===================================================================
@@ -50,7 +50,7 @@ enum
static gint break_id_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
G_GNUC_UNUSED gpointer gdata)
{
- const char *s1, *s2;
+ char *s1, *s2;
gint result;
gtk_tree_model_get(model, a, BREAK_ID, &s1, -1);
@@ -67,6 +67,8 @@ static gint break_id_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b
result = atoi(p1 + (*p1 == '.')) - atoi(p2 + (*p2 == '.'));
}
+ g_free(s1);
+ g_free(s2);
return result;
}
@@ -136,13 +138,14 @@ static void break_type_set_data_func(G_GNUC_UNUSED GtkTreeViewColumn *column,
static void break_mark(GtkTreeIter *iter, gboolean mark)
{
- const char *file;
+ char *file;
gint line;
gboolean enabled;
gtk_tree_model_get(model, iter, BREAK_FILE, &file, BREAK_LINE, &line, BREAK_ENABLED,
&enabled, -1);
utils_mark(file, line, mark, MARKER_BREAKPT + enabled);
+ g_free(file);
}
static void break_enable(GtkTreeIter *iter, gboolean enable)
@@ -157,7 +160,7 @@ static void on_break_enabled_toggled(G_GNUC_UNUSED GtkCellRendererToggle *render
{
GtkTreeIter iter;
DebugState state = debug_state();
- const char *id;
+ char *id;
gint scid;
gboolean enabled;
@@ -177,6 +180,8 @@ static void on_break_enabled_toggled(G_GNUC_UNUSED GtkCellRendererToggle *render
}
else
plugin_beep();
+
+ g_free(id);
}
#define EDITCOLS 3
@@ -193,7 +198,7 @@ static void on_break_column_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
gint index = GPOINTER_TO_INT(gdata) - 1;
const gchar *set_text = validate_column(new_text, index > 0);
GtkTreeIter iter;
- const char *id;
+ char *id;
char type;
gtk_tree_model_get_iter_from_string(model, &iter, path_str);
@@ -211,6 +216,8 @@ static void on_break_column_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
gtk_list_store_set(store, &iter, index + BREAK_IGNORE, set_text, -1);
else
plugin_beep();
+
+ g_free(id);
}
static void on_break_ignore_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell,
@@ -273,7 +280,7 @@ static void append_script_command(const ParseNode *node, GString *string)
static void break_iter_applied(GtkTreeIter *iter, const char *id)
{
- const gchar *columns[EDITCOLS];
+ gchar *columns[EDITCOLS];
gboolean enabled;
char type;
gint index;
@@ -284,7 +291,11 @@ static void break_iter_applied(GtkTreeIter *iter, const char *id)
if (strchr(BP_BORTS, type))
{
if (strchr(BP_BREAKS, type))
+ {
+ g_free(columns[0]);
columns[0] = NULL;
+ }
+ g_free(columns[1]);
columns[1] = NULL;
}
else if (!enabled)
@@ -300,6 +311,7 @@ static void break_iter_applied(GtkTreeIter *iter, const char *id)
locale);
g_free(locale);
}
+ g_free(columns[index]);
}
}
@@ -497,9 +509,9 @@ static void break_apply(GtkTreeIter *iter, gboolean thread)
GString *command = g_string_sized_new(0x1FF);
gint scid;
char type;
- const char *ignore, *location;
+ char *ignore, *location;
gboolean enabled, pending, temporary;
- const gchar *cond;
+ gchar *cond;
gboolean borts;
gtk_tree_model_get(model, iter, BREAK_SCID, &scid, BREAK_TYPE, &type, BREAK_ENABLED,
@@ -547,6 +559,9 @@ static void break_apply(GtkTreeIter *iter, gboolean thread)
g_string_append_printf(command, " %s", location);
debug_send_command(F, command->str);
g_string_free(command, TRUE);
+ g_free(ignore);
+ g_free(location);
+ g_free(cond);
}
static void break_clear(GtkTreeIter *iter)
@@ -573,7 +588,7 @@ static gboolean break_remove_all(const char *pref, gboolean force)
while (valid)
{
- const char *id;
+ char *id;
gboolean discard;
gtk_tree_model_get(model, &iter, BREAK_ID, &id, BREAK_DISCARD, &discard, -1);
@@ -585,12 +600,14 @@ static gboolean break_remove_all(const char *pref, gboolean force)
if (discard || force)
{
valid = break_remove(&iter);
+ g_free(id);
continue;
}
break_clear(&iter);
}
+ g_free(id);
valid = gtk_tree_model_iter_next(model, &iter);
}
@@ -641,21 +658,23 @@ static void breaks_missing(void)
while (valid)
{
- const char *id;
+ char *id;
gboolean discard, missing;
gtk_tree_model_get(model, &iter, BREAK_ID, &id, BREAK_DISCARD, &discard,
BREAK_MISSING, &missing, -1);
+ g_free(id);
if (id && missing)
{
if (discard)
{
valid = break_remove(&iter);
+ g_free(id);
continue;
}
- else
- break_clear(&iter);
+
+ break_clear(&iter);
}
valid = gtk_tree_model_iter_next(model, &iter);
@@ -739,7 +758,7 @@ void on_break_features(GArray *nodes)
static void break_delete(GtkTreeIter *iter)
{
- const char *id;
+ char *id;
gtk_tree_model_get(model, iter, BREAK_ID, &id, -1);
@@ -747,11 +766,13 @@ static void break_delete(GtkTreeIter *iter)
break_remove(iter);
else
debug_send_format(N, "023%s-break-delete %s", id, id);
+
+ g_free(id);
}
static void break_iter_mark(GtkTreeIter *iter, GeanyDocument *doc)
{
- const char *file;
+ char *file;
gint line;
gboolean enabled;
@@ -760,6 +781,7 @@ static void break_iter_mark(GtkTreeIter *iter, GeanyDocument *doc)
if (line && !utils_filenamecmp(file, doc->real_path))
sci_set_marker_at_line(doc->editor->sci, line - 1, MARKER_BREAKPT + enabled);
+ g_free(file);
}
void breaks_mark(GeanyDocument *doc)
@@ -843,10 +865,10 @@ void breaks_delta(ScintillaObject *sci, const char *real_path, gint start, gint
while (valid)
{
- const char *file;
+ char *file;
gint line;
gboolean enabled;
- const char *location;
+ char *location;
gtk_tree_model_get(model, &iter, BREAK_FILE, &file, BREAK_LINE, &line,
BREAK_ENABLED, &enabled, BREAK_LOCATION, &location, -1);
@@ -872,21 +894,26 @@ void breaks_delta(ScintillaObject *sci, const char *real_path, gint start, gint
{
sci_delete_marker_at_line(sci, start, MARKER_BREAKPT + enabled);
valid = gtk_list_store_remove(store, &iter);
+ g_free(file);
+ g_free(location);
continue;
}
}
+ g_free(file);
+ g_free(location);
valid = gtk_tree_model_iter_next(model, &iter);
}
}
static void break_iter_check(GtkTreeIter *iter, guint *active)
{
- const char *id;
+ char *id;
gboolean enabled;
gtk_tree_model_get(model, iter, BREAK_ID, &id, BREAK_ENABLED, &enabled, -1);
*active += enabled && id;
+ g_free(id);
}
guint breaks_active(void)
@@ -902,11 +929,11 @@ void on_break_toggle(G_GNUC_UNUSED const MenuItem *menu_item)
gint doc_line = utils_current_line(doc);
GtkTreeIter iter, iter1;
gboolean valid = gtk_tree_model_get_iter_first(model, &iter);
- const char *found = NULL;
+ gint found = 0;
while (valid)
{
- const char *id, *file;
+ char *id, *file;
gint line;
gtk_tree_model_get(model, &iter, BREAK_ID, &id, BREAK_FILE, &file, BREAK_LINE,
@@ -914,19 +941,23 @@ void on_break_toggle(G_GNUC_UNUSED const MenuItem *menu_item)
if (line == doc_line && !utils_filenamecmp(file, doc->real_path))
{
- if (found && atoi(found) != utils_atoi0(id))
+ if (found && found != utils_atoi0(id))
{
dialogs_show_msgbox(GTK_MESSAGE_INFO,
_("There are two or more breakpoints at %s:%d.\n"
"Use the breakpoint list to remove the exact one."),
doc->file_name, doc_line);
+ g_free(id);
+ g_free(file);
return;
}
- found = id ? id : "-1";
+ found = id ? atoi(id) : -1;
iter1 = iter;
}
+ g_free(id);
+ g_free(file);
valid = gtk_tree_model_iter_next(model, &iter);
}
@@ -1030,22 +1061,26 @@ void breaks_load(GKeyFile *config)
static gboolean break_save(GKeyFile *config, const char *section, GtkTreeIter *iter)
{
- guint i;
- gint line;
- char type;
- gboolean enabled, pending, discard, run_apply, temporary;
- const char *strings[STRING_COUNT];
+ gboolean discard;
- gtk_tree_model_get(model, iter, BREAK_FILE, &strings[STRING_FILE], BREAK_LINE, &line,
- BREAK_TYPE, &type, BREAK_ENABLED, &enabled, BREAK_DISPLAY,
- &strings[STRING_DISPLAY], BREAK_FUNC, &strings[STRING_FUNC], BREAK_IGNORE,
- &strings[STRING_IGNORE], BREAK_COND, &strings[STRING_COND], BREAK_SCRIPT,
- &strings[STRING_SCRIPT], BREAK_PENDING, &pending, BREAK_DISCARD, &discard,
- BREAK_LOCATION, &strings[STRING_LOCATION], BREAK_RUN_APPLY, &run_apply,
- BREAK_TEMPORARY, &temporary, -1);
+ gtk_tree_model_get(model, iter, BREAK_DISCARD, &discard, -1);
if (!discard)
{
+ guint i;
+ gint line;
+ char type;
+ gboolean enabled, pending, run_apply, temporary;
+ char *strings[STRING_COUNT];
+
+ gtk_tree_model_get(model, iter, BREAK_FILE, &strings[STRING_FILE], BREAK_LINE,
+ &line, BREAK_TYPE, &type, BREAK_ENABLED, &enabled, BREAK_DISPLAY,
+ &strings[STRING_DISPLAY], BREAK_FUNC, &strings[STRING_FUNC], BREAK_IGNORE,
+ &strings[STRING_IGNORE], BREAK_COND, &strings[STRING_COND], BREAK_SCRIPT,
+ &strings[STRING_SCRIPT], BREAK_PENDING, &pending, BREAK_LOCATION,
+ &strings[STRING_LOCATION], BREAK_RUN_APPLY, &run_apply, BREAK_TEMPORARY,
+ &temporary, -1);
+
if (line)
g_key_file_set_integer(config, section, "line", line);
else
@@ -1059,7 +1094,7 @@ static gboolean break_save(GKeyFile *config, const char *section, GtkTreeIter *i
for (i = 0; i < STRING_COUNT; i++)
{
if (strings[i])
- g_key_file_set_string(config, section, string_names[i], strings[i]);
+ utils_key_file_set_string(config, section, string_names[i], strings[i]);
else
g_key_file_remove_key(config, section, string_names[i], NULL);
}
@@ -1089,7 +1124,7 @@ static void on_break_selection_changed(GtkTreeSelection *selection,
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *id;
+ char *id;
gboolean editable;
gint index;
@@ -1097,6 +1132,7 @@ static void on_break_selection_changed(GtkTreeSelection *selection,
editable = !id || !strchr(id, '.');
for (index = 0; index < EDITCOLS; index++)
g_object_set(block_cells[index], "editable", editable, NULL);
+ g_free(id);
}
}
@@ -1124,13 +1160,16 @@ static gboolean on_break_query_tooltip(G_GNUC_UNUSED GtkWidget *widget, gint x,
if (line)
g_string_append_printf(text, ":%d", line);
has_tip = TRUE;
+ g_free(file);
}
+
if (func)
{
if (has_tip)
g_string_append(text, ", ");
g_string_append(text, func);
has_tip = TRUE;
+ g_free(func);
}
gtk_tooltip_set_text(tooltip, text->str);
@@ -1255,9 +1294,11 @@ static guint break_menu_extra_state(void)
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *id, *file;
+ char *id, *file;
gtk_tree_model_get(model, &iter, BREAK_ID, &id, BREAK_FILE, &file, -1);
+ g_free(id);
+ g_free(file);
return (!id << DS_INDEX_1) | ((file != NULL) << DS_INDEX_2) |
((!id || !strchr(id, '.')) << DS_INDEX_3);
Modified: scope/src/debug.c
7 files changed, 3 insertions(+), 4 deletions(-)
===================================================================
@@ -31,9 +31,7 @@
#else /* G_OS_UNIX */
#include <windows.h>
-#define WNOHANG 0
-
-static int waitpid(GPid pid, int *stat_loc, G_GNUC_UNUSED int options)
+static int waitpid(HANDLE pid, int *stat_loc)
{
DWORD status;
@@ -49,10 +47,11 @@ static int waitpid(GPid pid, int *stat_loc, G_GNUC_UNUSED int options)
return -1;
}
+#define waitpid(pid, stat_loc, options) waitpid((pid), (stat_loc))
#define SIGKILL 9
-static int kill(GPid pid, int sig)
+static int kill(HANDLE pid, int sig)
{
return TerminateProcess(pid, sig) ? 0 : -1;
}
Modified: scope/src/gtk216.c
6 files changed, 3 insertions(+), 3 deletions(-)
===================================================================
@@ -31,10 +31,10 @@
static ArraySize *find_array_size(GArray *array)
{
- guint i;
- gchar *data = array_sizes->data;
+ gchar *end = array_sizes->data + sizeof(ArraySize) * array>len;
+ gchar *data;
- for (i = 0; i < array_sizes->len; i++, data += sizeof(ArraySize))
+ for (data = array_sizes->data; data < end; data += sizeof(ArraySize))
if (*(GArray **) data == array)
return (ArraySize *) data;
Modified: scope/src/inspect.c
110 files changed, 72 insertions(+), 38 deletions(-)
===================================================================
@@ -92,13 +92,16 @@ static gboolean inspect_find_recursive(GtkTreeIter *iter, gint i, const char *ke
}
else
{
- const char *var1;
+ char *var1;
size_t len;
+ gboolean match;
gtk_tree_model_get(model, iter, INSPECT_VAR1, &var1, -1);
len = var1 ? strlen(var1) : 0;
+ match = var1 && !strncmp(key, var1, len);
+ g_free(var1);
- if (var1 && !strncmp(key, var1, len))
+ if (match)
{
if (key[len] == '\0')
return TRUE;
@@ -150,9 +153,8 @@ static gint inspect_get_scid(GtkTreeIter *iter)
static void inspect_expand(GtkTreeIter *iter)
{
- const char *var1;
+ char *var1, *s;
gint scid, start, count, numchild;
- gchar *s;
scid = inspect_get_scid(iter);
gtk_tree_model_get(model, iter, INSPECT_VAR1, &var1, INSPECT_START, &start,
@@ -160,6 +162,7 @@ static void inspect_expand(GtkTreeIter *iter)
s = g_strdup_printf("%d", start);
debug_send_format(N, "07%c%d%d-var-list-children 1 %s %d %d", '0' + (int) strlen(s) - 1,
start, scid, var1, start, count ? start + count : numchild);
+ g_free(var1);
g_free(s);
}
@@ -174,7 +177,7 @@ static void on_jump_to_menu_item_activate(GtkMenuItem *menuitem, G_GNUC_UNUSED g
static GtkWidget *jump_to_item;
static GtkContainer *jump_to_menu;
-static const gchar *jump_to_expr;
+static gchar *jump_to_expr = NULL;
static void on_inspect_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter,
G_GNUC_UNUSED gpointer gdata)
@@ -184,6 +187,7 @@ static void on_inspect_row_inserted(GtkTreeModel *model, GtkTreePath *path, GtkT
GtkWidget *item;
const gint *index = gtk_tree_path_get_indices(path);
+ g_free(jump_to_expr);
gtk_tree_model_get(model, iter, INSPECT_EXPR, &jump_to_expr, -1);
item = gtk_menu_item_new_with_label(jump_to_expr ? jump_to_expr : "");
gtk_widget_show(item);
@@ -343,8 +347,7 @@ void on_inspect_children(GArray *nodes)
if (inspect_find(&iter, FALSE, token + size))
{
- gint from, numchild, end;
- const char *var1;
+ gint from;
GtkTreePath *path = gtk_tree_model_get_path(model, &iter);
token[size] = '\0';
@@ -355,6 +358,9 @@ void on_inspect_children(GArray *nodes)
append_stub(&iter, _("no children in range"), FALSE);
else
{
+ gint numchild, end;
+ char *var1;
+
if (from)
append_ellipsis(&iter, FALSE);
@@ -369,6 +375,7 @@ void on_inspect_children(GArray *nodes)
debug_send_format(N, "04-var-set-update-range %s %d %d", var1,
from, end);
}
+ g_free(var1);
if (nodes->len ? end < numchild : !from)
append_ellipsis(&iter, FALSE);
@@ -470,14 +477,16 @@ void on_inspect_changelist(GArray *nodes)
static void inspect_apply(GtkTreeIter *iter)
{
gint scid;
- const gchar *expr;
- const char *name, *frame;
- char *locale;
+ gchar *expr;
+ char *name, *frame, *locale;
gtk_tree_model_get(model, iter, INSPECT_EXPR, &expr, INSPECT_SCID, &scid,
INSPECT_NAME, &name, INSPECT_FRAME, &frame, -1);
locale = utils_get_locale_from_utf8(expr);
debug_send_format(F, "07%d-var-create %s %s %s", scid, name, frame, locale);
+ g_free(expr);
+ g_free(name);
+ g_free(frame);
g_free(locale);
}
@@ -489,9 +498,10 @@ void on_inspect_signal(const char *name)
{
iff (model_find(model, &iter, INSPECT_NAME, name), "%s: var not found", name)
{
- const char *var1;
+ char *var1;
gtk_tree_model_get(model, &iter, INSPECT_VAR1, &var1, -1);
+ g_free(var1);
iff (!var1, "%s: already applied", name)
inspect_apply(&iter);
@@ -521,7 +531,7 @@ gboolean inspects_current(void)
static void inspect_iter_apply(GtkTreeIter *iter, G_GNUC_UNUSED gpointer gdata)
{
- const char *frame;
+ char *frame;
gboolean run_apply;
gtk_tree_model_get(model, iter, INSPECT_FRAME, &frame, INSPECT_RUN_APPLY, &run_apply,
@@ -529,6 +539,7 @@ static void inspect_iter_apply(GtkTreeIter *iter, G_GNUC_UNUSED gpointer gdata)
if (run_apply && !isdigit(*frame))
inspect_apply(iter);
+ g_free(frame);
}
void inspects_apply(void)
@@ -640,7 +651,7 @@ void inspects_update_state(DebugState state)
static gboolean last_active = FALSE;
gboolean active = state != DS_INACTIVE;
GtkTreeIter iter;
- const char *var1 = NULL;
+ char *var1 = NULL;
gint numchild = 0;
if ((state & DS_SENDABLE) && gtk_tree_selection_get_selected(selection, NULL, &iter))
@@ -649,6 +660,7 @@ void inspects_update_state(DebugState state)
-1);
}
g_object_set(inspect_display, "editable", var1 && !numchild, NULL);
+ g_free(var1);
if (active != last_active)
{
@@ -707,18 +719,18 @@ void inspects_load(GKeyFile *config)
static gboolean inspect_save(GKeyFile *config, const char *section, GtkTreeIter *iter)
{
gint hb_mode, start, count, format;
- const char *name, *frame;
- const gchar *expr;
+ char *name, *frame;
+ gchar *expr;
gboolean run_apply, expand;
gtk_tree_model_get(model, iter, INSPECT_EXPR, &expr, INSPECT_HB_MODE, &hb_mode,
INSPECT_NAME, &name, INSPECT_FRAME, &frame, INSPECT_RUN_APPLY, &run_apply,
INSPECT_START, &start, INSPECT_COUNT, &count, INSPECT_EXPAND, &expand,
INSPECT_FORMAT, &format, -1);
- g_key_file_set_string(config, section, "name", name);
- g_key_file_set_string(config, section, "expr", expr);
+ utils_key_file_set_string(config, section, "name", name);
+ utils_key_file_set_string(config, section, "expr", expr);
g_key_file_set_integer(config, section, "hbit", hb_mode);
- g_key_file_set_string(config, section, "frame", frame);
+ utils_key_file_set_string(config, section, "frame", frame);
g_key_file_set_boolean(config, section, "run_apply", run_apply);
g_key_file_set_integer(config, section, "start", start);
g_key_file_set_integer(config, section, "count", count);
@@ -740,26 +752,25 @@ static void on_inspect_refresh(G_GNUC_UNUSED const MenuItem *menu_item)
static void on_inspect_add(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const gchar *expr = NULL;
+ gchar *expr = NULL;
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
gtk_tree_model_get(model, &iter, INSPECT_PATH_EXPR, &expr, -1);
inspect_add(expr);
+ g_free(expr);
}
static void on_inspect_edit(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const gchar *expr;
- char *name;
- const char *frame;
+ gchar *expr;
+ char *name, *frame;
gboolean run_apply;
gtk_tree_selection_get_selected(selection, NULL, &iter);
gtk_tree_model_get(model, &iter, INSPECT_EXPR, &expr, INSPECT_NAME, &name,
INSPECT_FRAME, &frame, INSPECT_RUN_APPLY, &run_apply, -1);
- name = strdup(name);
gtk_tree_store_set(store, &iter, INSPECT_NAME, "-", -1); /* for duplicate name check */
gtk_entry_set_text(inspect_expr, expr);
@@ -770,26 +781,32 @@ static void on_inspect_edit(G_GNUC_UNUSED const MenuItem *menu_item)
if (gtk_dialog_run(GTK_DIALOG(inspect_dialog)) == GTK_RESPONSE_ACCEPT)
{
+ g_free(jump_to_expr);
jump_to_expr = NULL;
inspect_dialog_store(&iter);
}
else
gtk_tree_store_set(store, &iter, INSPECT_NAME, name, -1);
+ g_free(expr);
g_free(name);
+ g_free(frame);
}
static void on_inspect_apply(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const char *var1;
+ char *var1;
gint scid;
gtk_tree_selection_get_selected(selection, NULL, &iter);
gtk_tree_model_get(model, &iter, INSPECT_SCID, &scid, INSPECT_VAR1, &var1, -1);
if (var1)
+ {
debug_send_format(N, "070%d-var-delete %s", scid, var1);
+ g_free(var1);
+ }
else
inspect_apply(&iter);
}
@@ -802,7 +819,7 @@ static void on_inspect_apply(G_GNUC_UNUSED const MenuItem *menu_item)
static void on_inspect_expand(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const char *name;
+ char *name;
gint start, count;
gboolean expand;
@@ -813,6 +830,7 @@ static void on_inspect_expand(G_GNUC_UNUSED const MenuItem *menu_item)
gtk_spin_button_set_value(expand_count, count);
gtk_toggle_button_set_active(expand_automatic, expand);
gtk_widget_set_sensitive(GTK_WIDGET(expand_automatic), name != NULL);
+ g_free(name);
if (gtk_dialog_run(GTK_DIALOG(expand_dialog)) == GTK_RESPONSE_ACCEPT)
{
@@ -842,7 +860,7 @@ static void on_inspect_format_update(const MenuItem *menu_item)
{
GtkTreeIter iter;
gint format = GPOINTER_TO_INT(menu_item->gdata);
- const char *var1;
+ char *var1;
gtk_tree_selection_get_selected(selection, NULL, &iter);
gtk_tree_model_get(model, &iter, INSPECT_VAR1, &var1, -1);
@@ -851,6 +869,7 @@ static void on_inspect_format_update(const MenuItem *menu_item)
{
debug_send_format(N, "07%d-var-set-format %s %s", inspect_get_scid(&iter), var1,
inspect_formats[format]);
+ g_free(var1);
}
else
gtk_tree_store_set(store, &iter, INSPECT_FORMAT, format, -1);
@@ -863,20 +882,21 @@ static void on_inspect_hbit_display(const MenuItem *menu_item)
static void inspect_hbit_update_iter(GtkTreeIter *iter, gint hb_mode)
{
- const char *value;
+ char *value;
gchar *display;
gtk_tree_model_get(model, iter, INSPECT_VALUE, &value, -1);
display = utils_get_display_from_7bit(value, hb_mode);
gtk_tree_store_set(store, iter, INSPECT_HB_MODE, hb_mode, value ? INSPECT_DISPLAY : -1,
display, -1);
+ g_free(value);
g_free(display);
}
static void on_inspect_hbit_update(const MenuItem *menu_item)
{
GtkTreeIter iter;
- const char *expr, *name;
+ char *expr, *name;
gint hb_mode = GPOINTER_TO_INT(menu_item->gdata);
gtk_tree_selection_get_selected(selection, NULL, &iter);
@@ -892,18 +912,24 @@ static void on_inspect_hbit_update(const MenuItem *menu_item)
inspect_hbit_update_iter(&iter, hb_mode);
g_free(reverse);
}
+
+ g_free(expr);
+ g_free(name);
}
static void on_inspect_delete(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const char *var1;
+ char *var1;
gtk_tree_selection_get_selected(selection, NULL, &iter);
gtk_tree_model_get(model, &iter, INSPECT_VAR1, &var1, -1);
if (var1)
+ {
debug_send_format(N, "071%d-var-delete %s", inspect_get_scid(&iter), var1);
+ g_free(var1);
+ }
else
gtk_tree_store_remove(store, &iter);
}
@@ -942,19 +968,20 @@ static void on_inspect_delete(G_GNUC_UNUSED const MenuItem *menu_item)
static guint inspect_menu_extra_state(void)
{
GtkTreeIter iter;
- guint state = gtk_tree_selection_get_selected(selection, NULL, &iter) << DS_INDEX_1;
- if (state)
+ if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *var1, *name;
+ char *var1, *name;
gint numchild;
gtk_tree_model_get(model, &iter, INSPECT_VAR1, &var1, INSPECT_NAME, &name,
INSPECT_NUMCHILD, &numchild, -1);
+ g_free(var1);
+ g_free(name);
if (name || var1)
{
- return state | ((name && !var1) << DS_INDEX_2) |
+ return (1 << DS_INDEX_1) | ((name && !var1) << DS_INDEX_2) |
((name != NULL) << DS_INDEX_3) | ((numchild != 0) << DS_INDEX_4);
}
}
@@ -968,7 +995,7 @@ static void on_inspect_selection_changed(G_GNUC_UNUSED GtkTreeSelection *selecti
G_GNUC_UNUSED gpointer gdata)
{
GtkTreeIter iter;
- const char *name = NULL;
+ char *name = NULL;
if (gtk_widget_get_visible(inspect_dialog))
gtk_widget_hide(inspect_dialog);
@@ -977,20 +1004,22 @@ static void on_inspect_selection_changed(G_GNUC_UNUSED GtkTreeSelection *selecti
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
gtk_tree_model_get(model, &iter, INSPECT_NAME, &name, -1);
- gtk_tree_view_set_reorderable(tree, name != NULL);
+ gtk_tree_view_set_reorderable(tree, name != NULL);
inspects_update_state(debug_state());
+ g_free(name);
}
static gboolean inspect_test_expand_row(G_GNUC_UNUSED GtkTreeView *tree_view,
GtkTreeIter *iter, G_GNUC_UNUSED GtkTreePath *path, G_GNUC_UNUSED gpointer gdata)
{
GtkTreeIter child;
- const char *var1;
+ char *var1;
gboolean expand;
gtk_tree_model_iter_children(model, &child, iter);
gtk_tree_model_get(model, &child, INSPECT_VAR1, &var1, INSPECT_EXPAND, &expand, -1);
+ g_free(var1);
if (var1 || !expand)
return FALSE;
@@ -1038,11 +1067,12 @@ gboolean on_inspect_drag_motion(G_GNUC_UNUSED GtkWidget *widget,
if (gtk_tree_view_get_dest_row_at_pos(tree, x, y, &path, &pos))
{
GtkTreeIter iter;
- const char *name;
+ char *name;
gtk_tree_model_get_iter(model, &iter, path);
gtk_tree_path_free(path);
gtk_tree_model_get(model, &iter, INSPECT_NAME, &name, -1);
+ g_free(name);
if (!name || pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE ||
pos == GTK_TREE_VIEW_DROP_INTO_OR_AFTER)
@@ -1060,7 +1090,7 @@ static void on_inspect_menu_show(G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *var1, *path_expr;
+ char *var1, *path_expr;
gtk_tree_model_get(model, &iter, INSPECT_VAR1, &var1, INSPECT_PATH_EXPR,
&path_expr, -1);
@@ -1071,6 +1101,9 @@ static void on_inspect_menu_show(G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED
debug_send_format(N, "04%d-var-info-path-expression %s",
inspect_get_scid(&iter), var1);
}
+
+ g_free(var1);
+ g_free(path_expr);
}
}
@@ -1137,4 +1170,5 @@ void inspect_finalize(void)
gtk_widget_destroy(inspect_page);
gtk_widget_destroy(inspect_dialog);
gtk_widget_destroy(expand_dialog);
+ g_free(jump_to_expr);
}
Modified: scope/src/local.c
9 files changed, 3 insertions(+), 6 deletions(-)
===================================================================
@@ -89,15 +89,11 @@ void on_local_variables(GArray *nodes)
if (thread_id && frame_id && len == strlen(thread_id) &&
!memcmp(++token, thread_id, len) && !strcmp(token + len, frame_id))
{
- char *name = NULL;
GtkTreeIter iter;
LocalData ld = { NULL, stack_entry() };
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
- {
gtk_tree_model_get(model, &iter, LOCAL_NAME, &ld.name, -1);
- name = g_strdup(name);
- }
locals_clear();
array_foreach(parse_lead_array(nodes), (GFunc) local_node_variable, &ld);
@@ -118,7 +114,7 @@ static void local_send_update(char token)
gboolean locals_update(void)
{
- if (view_select_frame())
+ if (view_stack_update())
return FALSE;
if (frame_id)
@@ -160,11 +156,12 @@ static void on_local_modify(const MenuItem *menu_item)
static void on_local_watch(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const char *name;
+ char *name;
gtk_tree_selection_get_selected(selection, NULL, &iter);
gtk_tree_model_get(model, &iter, LOCAL_NAME, &name, -1);
watch_add(name);
+ g_free(name);
}
static void on_local_inspect(G_GNUC_UNUSED const MenuItem *menu_item)
Modified: scope/src/memory.c
24 files changed, 14 insertions(+), 10 deletions(-)
===================================================================
@@ -41,7 +41,7 @@ static void on_memory_bytes_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
if (*new_text && (debug_state() & DS_SENDABLE))
{
GtkTreeIter iter;
- const char *addr, *bytes;
+ char *addr, *bytes;
guint i;
gtk_tree_model_get_iter_from_string(model, &iter, path_str);
@@ -58,6 +58,9 @@ static void on_memory_bytes_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
utils_strchrepl(new_text, ' ', '\0');
debug_send_format(T, "07-data-write-memory-bytes 0x%s%s", addr, new_text);
}
+
+ g_free(addr);
+ g_free(bytes);
}
else
plugin_blink();
@@ -232,12 +235,10 @@ void on_memory_read_bytes(GArray *nodes)
char *addr = NULL;
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
- {
gtk_tree_model_get(model, &iter, MEMORY_ADDR, &addr, -1);
- addr = strdup(addr);
- }
- memory_clear();
+ gtk_list_store_clear(store);
+ memory_count = 0;
if (pref_memory_bytes_per_line != back_bytes_per_line)
{
@@ -261,7 +262,6 @@ void on_memory_read_bytes(GArray *nodes)
void memory_clear(void)
{
gtk_list_store_clear(store);
- memory_count = 0;
}
gboolean memory_update(void)
@@ -304,8 +304,8 @@ static void on_memory_copy(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeModel *model;
GtkTreeIter iter;
- const char *addr, *bytes;
- const gchar *ascii;
+ char *addr, *bytes;
+ gchar *ascii;
gchar *string;
gtk_tree_selection_get_selected(selection, &model, &iter);
@@ -314,12 +314,16 @@ static void on_memory_copy(G_GNUC_UNUSED const MenuItem *menu_item)
string = g_strdup_printf("%s%s%s", addr, bytes, ascii);
gtk_clipboard_set_text(gtk_widget_get_clipboard(menu_item->widget,
GDK_SELECTION_CLIPBOARD), string, -1);
+ g_free(addr);
+ g_free(bytes);
+ g_free(ascii);
g_free(string);
}
static void on_memory_clear(G_GNUC_UNUSED const MenuItem *menu_item)
{
- memory_clear();
+ gtk_list_store_clear(store);
+ memory_count = 0;
}
static void on_memory_group_display(const MenuItem *menu_item)
@@ -364,7 +368,7 @@ static void on_memory_group_update(const MenuItem *menu_item)
static guint memory_menu_extra_state(void)
{
return (gtk_tree_selection_get_selected(selection, NULL, NULL) << DS_INDEX_1) |
- (memory_count != 0) << DS_INDEX_1;
+ (memory_count != 0) << DS_INDEX_2;
}
static MenuInfo memory_menu_info = { memory_menu_items, memory_menu_extra_state, 0 };
Modified: scope/src/menu.c
23 files changed, 16 insertions(+), 7 deletions(-)
===================================================================
@@ -208,7 +208,7 @@ static void menu_mode_update_iter(GtkTreeModel *model, GtkTreeIter *iter, gint n
gboolean hbit)
{
gint hb_mode, mr_mode;
- const char *value;
+ char *value;
gchar *display;
gtk_tree_model_get(model, iter, COLUMN_VALUE, &value, COLUMN_HB_MODE, &hb_mode,
@@ -222,6 +222,7 @@ static void menu_mode_update_iter(GtkTreeModel *model, GtkTreeIter *iter, gint n
display = parse_get_display_from_7bit(value, hb_mode, mr_mode);
gtk_list_store_set(GTK_LIST_STORE(model), iter, COLUMN_HB_MODE, hb_mode,
COLUMN_MR_MODE, mr_mode, value ? COLUMN_DISPLAY : -1, display, -1);
+ g_free(value);
g_free(display);
}
@@ -229,7 +230,7 @@ void menu_mode_update(GtkTreeSelection *selection, gint new_mode, gboolean hbit)
{
GtkTreeModel *model;
GtkTreeIter iter;
- const char *name;
+ char *name;
gtk_tree_selection_get_selected(selection, &model, &iter);
gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1);
@@ -244,6 +245,7 @@ void menu_mode_update(GtkTreeSelection *selection, gint new_mode, gboolean hbit)
menu_mode_update_iter(model, &iter, new_mode, TRUE);
g_free(reverse);
}
+ g_free(name);
}
void menu_mber_display(GtkTreeSelection *selection, const MenuItem *menu_item)
@@ -298,8 +300,8 @@ void menu_copy(GtkTreeSelection *selection, const MenuItem *menu_item)
{
GtkTreeModel *model;
GtkTreeIter iter;
- const gchar *name, *display;
- const char *value;
+ gchar *name, *display;
+ char *value;
GString *string;
gtk_tree_selection_get_selected(selection, &model, &iter);
@@ -312,6 +314,10 @@ void menu_copy(GtkTreeSelection *selection, const MenuItem *menu_item)
gtk_clipboard_set_text(gtk_widget_get_clipboard(menu_item->widget,
GDK_SELECTION_CLIPBOARD), string->str, string->len);
+
+ g_free(name);
+ g_free(display);
+ g_free(value);
g_string_free(string, TRUE);
}
@@ -364,8 +370,8 @@ void menu_modify(GtkTreeSelection *selection, const MenuItem *menu_item)
{
GtkTreeModel *model;
GtkTreeIter iter;
- const gchar *name;
- const char *value;
+ gchar *name;
+ char *value;
gint hb_mode;
gtk_tree_selection_get_selected(selection, &model, &iter);
@@ -373,17 +379,20 @@ void menu_modify(GtkTreeSelection *selection, const MenuItem *menu_item)
&hb_mode, -1);
menu_evaluate_modify(name, value, _("Modify"), hb_mode, menu_item ? MR_MODIFY : MR_MODSTR,
"07");
+ g_free(name);
+ g_free(value);
}
void menu_inspect(GtkTreeSelection *selection)
{
GtkTreeModel *model;
GtkTreeIter iter;
- const char *name;
+ char *name;
gtk_tree_selection_get_selected(selection, &model, &iter);
gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1);
inspect_add(name);
+ g_free(name);
}
void on_menu_display_booleans(const MenuItem *menu_item)
Modified: scope/src/scope.c
3 files changed, 2 insertions(+), 1 deletions(-)
===================================================================
@@ -32,7 +32,7 @@
PLUGIN_VERSION_CHECK(215)
PLUGIN_SET_TRANSLATABLE_INFO(LOCALEDIR, GETTEXT_PACKAGE, _("Scope Debugger"),
- _("Simple GDB front-end."), "0.82" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
+ _("Simple GDB front-end."), "0.83" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
/* Keybinding(s) */
enum
@@ -602,6 +602,7 @@ void plugin_cleanup(void)
thread_finalize();
break_finalize();
memory_finalize();
+ stack_finalize();
menu_finalize();
views_finalize();
utils_finalize();
Modified: scope/src/stack.c
66 files changed, 43 insertions(+), 23 deletions(-)
===================================================================
@@ -59,12 +59,12 @@ static void stack_node_location(const ParseNode *node, const char *fid)
parse_location_free(&loc);
if (!g_strcmp0(id, fid))
- utils_tree_set_cursor(selection, &iter, -1);
+ gtk_tree_selection_select_iter(selection, &iter);
}
}
}
-const char *frame_id = NULL;
+char *frame_id = NULL;
void on_stack_frames(GArray *nodes)
{
@@ -80,7 +80,7 @@ void on_stack_frames(GArray *nodes)
{
GtkTreeIter iter;
- if (gtk_tree_model_get_iter_first(model, &iter))
+ if (model_find(model, &iter, STACK_ID, "0"))
utils_tree_set_cursor(selection, &iter, -1);
}
}
@@ -135,10 +135,11 @@ static void stack_node_arguments(const ParseNode *node, ArgsData *ad)
{
if (ad->valid)
{
- const char *fid;
+ char *fid;
gtk_tree_model_get(model, &ad->iter, STACK_ID, &fid, -1);
ad->valid = !strcmp(id, fid);
+ g_free(fid);
}
if (!ad->valid)
@@ -223,6 +224,8 @@ static void on_stack_selection_changed(GtkTreeSelection *selection,
{
GtkTreeIter iter;
+ g_free(frame_id);
+
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
gtk_tree_model_get(model, &iter, STACK_ID, &frame_id, -1);
else
@@ -271,31 +274,41 @@ static void on_stack_show_address(const MenuItem *menu_item)
view_column_set_visible("stack_addr_column", stack_show_address);
}
+typedef struct _EntryData
+{
+ char *func;
+ gboolean entry;
+ gint count;
+} EntryData;
+
+static void stack_iter_show_entry(GtkTreeIter *iter, EntryData *ed)
+{
+ char *func;
+
+ gtk_tree_model_get(model, iter, STACK_FUNC, &func, -1);
+
+ if (func && !strcmp(func, ed->func))
+ {
+ gtk_list_store_set(store, iter, STACK_ENTRY, ed->entry, -1);
+ ed->count++;
+ }
+ g_free(func);
+}
+
static void on_stack_show_entry(const MenuItem *menu_item)
{
- gboolean entry = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_item->widget));
+ EntryData ed = { NULL,
+ gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu_item->widget)), 0 };
GtkTreeIter iter;
- const char *func;
- guint count = 0;
view_dirty(VIEW_LOCALS);
gtk_tree_selection_get_selected(selection, NULL, &iter);
- gtk_tree_model_get(model, &iter, STACK_FUNC, &func, -1);
- parse_mode_update(func, MODE_ENTRY, entry);
- gtk_tree_model_get_iter_first(model, &iter);
- do
- {
- const char *func1;
+ gtk_tree_model_get(model, &iter, STACK_FUNC, &ed.func, -1);
+ parse_mode_update(ed.func, MODE_ENTRY, ed.entry);
+ model_foreach(model, (GFunc) stack_iter_show_entry, &ed);
+ g_free(ed.func);
- gtk_tree_model_get(model, &iter, STACK_FUNC, &func1, -1);
- if (!strcmp(func, func1))
- {
- gtk_list_store_set(store, &iter, STACK_ENTRY, entry, -1);
- count++;
- }
- } while (gtk_tree_model_iter_next(model, &iter));
-
- if (count == 1)
+ if (ed.count == 1)
{
debug_send_format(T, "04%s-stack-list-arguments 1 %s %s", thread_id, frame_id,
frame_id);
@@ -324,9 +337,11 @@ static guint stack_menu_extra_state(void)
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *file, *func;
+ char *file, *func;
gtk_tree_model_get(model, &iter, STACK_FILE, &file, STACK_FUNC, &func, -1);
+ g_free(file);
+ g_free(func);
return ((file != NULL) << DS_INDEX_2) | ((func != NULL) << DS_INDEX_3);
}
@@ -379,3 +394,8 @@ void stack_init(void)
g_signal_connect(get_widget("stack_synchronize"), "button-release-event",
G_CALLBACK(on_stack_synchronize_button_release), menu);
}
+
+void stack_finalize(void)
+{
+ g_free(frame_id);
+}
Modified: scope/src/stack.h
3 files changed, 2 insertions(+), 1 deletions(-)
===================================================================
@@ -19,7 +19,7 @@
#ifndef STACK_H
-extern const char *frame_id;
+extern char *frame_id;
void on_stack_frames(GArray *nodes);
void on_stack_arguments(GArray *nodes);
@@ -30,6 +30,7 @@
gboolean stack_update(void);
void stack_init(void);
+void stack_finalize(void);
#define STACK_H 1
#endif
Modified: scope/src/thread.c
85 files changed, 60 insertions(+), 25 deletions(-)
===================================================================
@@ -140,10 +140,12 @@ enum
static gint thread_ident_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b,
gpointer gdata)
{
- const char *s1, *s2;
+ char *s1, *s2;
+ gint result;
gtk_tree_model_get(model, a, GPOINTER_TO_INT(gdata), &s1, -1);
gtk_tree_model_get(model, b, GPOINTER_TO_INT(gdata), &s2, -1);
+ result = g_strcmp0(s1, s2);
if (s1 && s2)
{
@@ -153,10 +155,12 @@ static gint thread_ident_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIte
for (p2 = s2; *p2 && !isdigit(*p2); p2++);
if (p1 - s1 == p2 - s2 && !memcmp(s1, s2, p1 - s1))
- return atoi(p1) - atoi(p2);
+ result = atoi(p1) - atoi(p2);
}
- return g_strcmp0(s1, s2);
+ g_free(s1);
+ g_free(s2);
+ return result;
}
static GtkListStore *store;
@@ -188,14 +192,14 @@ static void auto_select_thread(void)
}
guint thread_count = 0;
-const char *thread_id = NULL;
+char *thread_id = NULL;
ThreadState thread_state = THREAD_BLANK;
guint thread_prompt = 0;
-const char *thread_group_id(void)
+char *thread_group_id(void)
{
GtkTreeIter iter;
- const char *gid = NULL;
+ char *gid = NULL;
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
gtk_tree_model_get(model, &iter, THREAD_GROUP_ID, &gid, -1);
@@ -205,7 +209,8 @@ const char *thread_group_id(void)
static void thread_iter_unmark(GtkTreeIter *iter, gpointer gdata)
{
- const char *file, *state;
+ char *file;
+ gchar *state;
gint line;
gboolean stopped;
@@ -216,6 +221,9 @@ static void thread_iter_unmark(GtkTreeIter *iter, gpointer gdata)
if (GPOINTER_TO_INT(gdata) != 2)
utils_mark(file, line, FALSE, MARKER_EXECUTE);
+
+ g_free(file);
+ g_free(state);
}
static void thread_iter_running(GtkTreeIter *iter, const char *tid)
@@ -228,11 +236,15 @@ static void thread_iter_running(GtkTreeIter *iter, const char *tid)
if (thread_id)
{
- if (!tid)
- gtk_tree_model_get(model, iter, THREAD_ID, &tid, -1);
+ char *tid1 = g_strdup(tid);
+
+ if (!tid1)
+ gtk_tree_model_get(model, iter, THREAD_ID, &tid1, -1);
- if (!strcmp(tid, thread_id))
+ if (!strcmp(tid1, thread_id))
thread_state = THREAD_RUNNING;
+
+ g_free(tid1);
}
}
@@ -313,10 +325,12 @@ static void thread_parse_frame(GArray *frame, const char *tid, GtkTreeIter *iter
static void thread_iter_stopped(GtkTreeIter *iter, StopData *sd)
{
- const char *tid = sd->tid, *state, *addr;
+ char *tid = g_strdup(sd->tid), *addr;
+ gchar *state;
gtk_tree_model_get(model, iter, THREAD_STATE, &state, THREAD_ADDR, &addr,
tid ? -1 : THREAD_ID, &tid, -1);
+
if (strcmp(state, STOPPED))
thread_prompt++;
gtk_list_store_set(store, iter, THREAD_STATE, STOPPED, -1);
@@ -336,6 +350,10 @@ static void thread_iter_stopped(GtkTreeIter *iter, StopData *sd)
sd->iter = *iter;
sd->found = TRUE;
}
+
+ g_free(tid);
+ g_free(state);
+ g_free(addr);
}
static void thread_node_stopped(const ParseNode *node, StopData *sd)
@@ -527,11 +545,12 @@ static void thread_parse(GArray *nodes, const char *tid, gboolean stopped)
}
else
{
- const gchar *state;
+ gchar *state;
gtk_tree_model_get(model, &iter, THREAD_STATE, &state, -1);
if (strcmp(state, RUNNING))
thread_iter_running(&iter, tid);
+ g_free(state);
}
thread_parse_extra(nodes, &iter, "target-id", THREAD_TARGET_ID);
@@ -582,13 +601,14 @@ void on_thread_frame(GArray *nodes)
static void thread_iter_mark(GtkTreeIter *iter, GeanyDocument *doc)
{
- const char *file;
+ char *file;
gint line;
gtk_tree_model_get(model, iter, THREAD_FILE, &file, THREAD_LINE, &line, -1);
if (line && !utils_filenamecmp(file, doc->real_path))
sci_set_marker_at_line(doc->editor->sci, line - 1, MARKER_EXECUTE);
+ g_free(file);
}
void threads_mark(GeanyDocument *doc)
@@ -613,7 +633,7 @@ void threads_delta(ScintillaObject *sci, const char *real_path, gint start, gint
while (valid)
{
- const char *file;
+ char *file;
gint line;
gtk_tree_model_get(model, &iter, THREAD_FILE, &file, THREAD_LINE, &line, -1);
@@ -621,6 +641,7 @@ void threads_delta(ScintillaObject *sci, const char *real_path, gint start, gint
if (--line >= 0 && start <= line && !utils_filenamecmp(file, real_path))
utils_move_mark(sci, line, start, delta, MARKER_EXECUTE);
+ g_free(file);
valid = gtk_tree_model_iter_next(model, &iter);
}
}
@@ -647,17 +668,22 @@ static void on_thread_selection_changed(GtkTreeSelection *selection,
{
GtkTreeIter iter;
+ free(thread_id);
+ free(frame_id);
+
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const gchar *state;
+ gchar *state;
gint line;
- const char *addr;
+ char *addr;
gtk_tree_model_get(model, &iter, THREAD_ID, &thread_id, THREAD_STATE, &state,
THREAD_LINE, &line, THREAD_ADDR, &addr, -1);
if (strcmp(state, STOPPED))
+ {
thread_state = *state ? THREAD_RUNNING : THREAD_BLANK;
+ }
else if (addr)
{
if (line)
@@ -677,10 +703,14 @@ static void on_thread_selection_changed(GtkTreeSelection *selection,
else
thread_state = THREAD_QUERY_FRAME;
}
+
+ frame_id = strdup("0");
+ g_free(state);
+ g_free(addr);
}
else
{
- thread_id = NULL;
+ thread_id = frame_id = NULL;
thread_state = THREAD_BLANK;
}
@@ -726,11 +756,12 @@ static void send_signal(int sig)
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *pid;
+ char *pid;
gtk_tree_model_get(model, &iter, THREAD_PID, &pid, -1);
if (kill(atoi(pid), sig) == -1)
show_errno("kill(pid)");
+ g_free(pid);
}
else
plugin_beep();
@@ -763,7 +794,7 @@ static void on_thread_send_signal(G_GNUC_UNUSED const MenuItem *menu_item)
#else /* G_OS_UNIX */
static HANDLE iter_to_handle(GtkTreeIter *iter)
{
- const char *pid;
+ char *pid;
HANDLE hid;
gtk_tree_model_get(model, iter, THREAD_PID, &pid, -1);
@@ -771,6 +802,7 @@ static HANDLE iter_to_handle(GtkTreeIter *iter)
if (!hid)
show_errno("OpenProcess");
+ g_free(pid);
return hid;
}
@@ -833,8 +865,6 @@ static void on_thread_show_core(const MenuItem *menu_item)
}
#define DS_VIEWABLE (DS_ACTIVE | DS_EXTRA_2)
-#define DS_INTRABLE (DS_ACTIVE | DS_EXTRA_3)
-#define DS_TERMABLE (DS_ACTIVE | DS_EXTRA_3)
#define DS_SIGNABLE (DS_ACTIVE | DS_EXTRA_3)
static MenuItem thread_menu_items[] =
@@ -843,8 +873,8 @@ static void on_thread_show_core(const MenuItem *menu_item)
{ "thread_unsorted", on_thread_unsorted, 0, NULL, NULL },
{ "thread_view_source", on_thread_view_source, DS_VIEWABLE, NULL, NULL },
{ "thread_synchronize", on_thread_synchronize, DS_SENDABLE, NULL, NULL },
- { "thread_interrupt", on_thread_interrupt, DS_INTRABLE, NULL, NULL },
- { "thread_terminate", on_thread_terminate, DS_TERMABLE, NULL, NULL },
+ { "thread_interrupt", on_thread_interrupt, DS_SIGNABLE, NULL, NULL },
+ { "thread_terminate", on_thread_terminate, DS_SIGNABLE, NULL, NULL },
#ifdef G_OS_UNIX
{ "thread_send_signal", on_thread_send_signal, DS_SIGNABLE, NULL, NULL },
#endif
@@ -865,10 +895,14 @@ static guint thread_menu_extra_state(void)
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
{
- const char *pid, *file;
+ char *pid, *file;
+ gboolean has_pid;
gtk_tree_model_get(model, &iter, THREAD_PID, &pid, THREAD_FILE, &file, -1);
- return ((file != NULL) << DS_INDEX_2) | ((utils_atoi0(pid) > 0) << DS_INDEX_3);
+ has_pid = utils_atoi0(pid) > 0;
+ g_free(pid);
+ g_free(file);
+ return ((file != NULL) << DS_INDEX_2) | (has_pid << DS_INDEX_3);
}
return 0;
@@ -920,4 +954,5 @@ void thread_finalize(void)
model_foreach(model, (GFunc) thread_iter_unmark, NULL);
array_free(thread_groups, (GFreeFunc) thread_group_free);
set_gdb_thread(NULL, FALSE);
+ free(thread_id);
}
Modified: scope/src/thread.h
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -34,9 +34,9 @@
THREAD_AT_ASSEMBLER
} ThreadState;
-extern const char *thread_id; /* gdb id, NULL if none selected */
+extern char *thread_id;
extern ThreadState thread_state;
-const char *thread_group_id(void);
+char *thread_group_id(void);
void on_thread_running(GArray *nodes);
void on_thread_stopped(GArray *nodes);
Modified: scope/src/utils.c
57 files changed, 41 insertions(+), 16 deletions(-)
===================================================================
@@ -146,16 +146,16 @@ gchar *array_find(GArray *array, const char *key, G_GNUC_UNUSED gboolean filenam
gchar *array_find(GArray *array, const char *key, gboolean filename)
#endif
{
- guint i;
- gchar *data = array->data;
guint size = g_array_get_element_size(array);
+ gchar *end = array->data + size * array->len;
+ gchar *data;
#ifdef G_OS_UNIX
int (*const compare)(const char *s1, const char *s2) = strcmp;
#else
int (*compare)(const char *s1, const char *s2) = filename ? utils_str_casecmp : strcmp;
#endif
- for (i = 0; i < array->len; i++, data += size)
+ for (data = array->data; data < end; data += size)
if (!compare(*(const char **) data, key))
return data;
@@ -164,11 +164,11 @@ gchar *array_find(GArray *array, const char *key, gboolean filename)
void array_foreach(GArray *array, GFunc each_func, gpointer gdata)
{
- guint i;
- gchar *data = array->data;
guint size = g_array_get_element_size(array);
+ gchar *end = array->data + size * array->len;
+ gchar *data;
- for (i = 0; i < array->len; i++, data += size)
+ for (data = array->data; data < end; data += size)
each_func(data, gdata);
}
@@ -213,11 +213,12 @@ static void utils_clear_sections(GKeyFile *config, const char *prefix, guint i)
void array_save(GArray *array, GKeyFile *config, const gchar *prefix, ASaveFunc save_func)
{
- guint i, n = 0;
- gchar *data = array->data;
guint size = g_array_get_element_size(array);
+ gchar *end = array->data + size * array->len;
+ gchar *data;
+ guint n = 0;
- for (i = 0; i < array->len; i++, data += size)
+ for (data = array->data; data < end; data += size)
{
char *section = g_strdup_printf("%s_%d", prefix, n);
n += save_func(config, section, data);
@@ -235,15 +236,24 @@ gboolean model_find(GtkTreeModel *model, GtkTreeIter *iter, guint column, const
while (valid)
{
+ gboolean match;
union
{
- const gchar *s;
+ gchar *s;
gint i;
} data;
gtk_tree_model_get(model, iter, column, &data, -1);
- if (string ? g_strcmp0(data.s, key) == 0 : data.i == i)
+ if (string)
+ {
+ match = !g_strcmp0(data.s, key);
+ g_free(data.s);
+ }
+ else
+ match = data.i == i;
+
+ if (match)
return TRUE;
valid = gtk_tree_model_iter_next(model, iter);
@@ -285,18 +295,26 @@ void model_save(GtkTreeModel *model, GKeyFile *config, const gchar *prefix,
gint model_string_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gint column)
{
- const gchar *s1, *s2;
+ gchar *s1, *s2;
+ gint result;
gtk_tree_model_get(model, a, column, &s1, -1);
gtk_tree_model_get(model, b, column, &s2, -1);
- return g_strcmp0(s1, s2);
+ result = g_strcmp0(s1, s2);
+ g_free(s1);
+ g_free(s2);
+ return result;
}
-static int model_atoint(GtkTreeModel *model, GtkTreeIter *iter, gpointer gdata)
+static gint model_atoint(GtkTreeModel *model, GtkTreeIter *iter, gpointer gdata)
{
- const gchar *s;
+ gchar *s;
+ gint i;
+
gtk_tree_model_get(model, iter, GPOINTER_TO_INT(gdata), &s, -1);
- return utils_atoi0(s);
+ i = utils_atoi0(s);
+ g_free(s);
+ return i;
}
gint model_gint_compare(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer gdata)
@@ -567,6 +585,13 @@ gchar *utils_key_file_get_string(GKeyFile *config, const char *section, const ch
return string;
}
+void utils_key_file_set_string(GKeyFile *config, const char *section, const char *key,
+ char *value)
+{
+ g_key_file_set_string(config, section, key, value);
+ g_free(value);
+}
+
gchar *utils_get_utf8_basename(const char *file)
{
gchar *utf8 = utils_get_utf8_from_locale(file);
Modified: scope/src/utils.h
2 files changed, 2 insertions(+), 0 deletions(-)
===================================================================
@@ -87,6 +87,8 @@ void utils_load(GKeyFile *config, const char *prefix,
guint utils_parse_sci_color(const gchar *string);
gboolean utils_key_file_write_to_file(GKeyFile *config, const char *configfile);
gchar *utils_key_file_get_string(GKeyFile *config, const char *section, const char *key);
+void utils_key_file_set_string(GKeyFile *config, const char *section, const char *key,
+ char *value); /* frees value */
gchar *utils_get_utf8_basename(const char *file);
char *utils_7bit_to_locale(char *text); /* == text */
Modified: scope/src/views.c
37 files changed, 25 insertions(+), 12 deletions(-)
===================================================================
@@ -40,7 +40,7 @@
{ FALSE, stack_clear, stack_update, TRUE, DS_DEBUG },
{ FALSE, locals_clear, locals_update, TRUE, DS_DEBUG },
{ FALSE, watches_clear, watches_update, TRUE, DS_DEBUG },
- { FALSE, memory_clear, memory_update, FALSE, DS_SENDABLE },
+ { FALSE, memory_clear, memory_update, TRUE, DS_SENDABLE },
{ FALSE, NULL, dc_update, FALSE, DS_DEBUG },
{ FALSE, inspects_clear, inspects_update, FALSE, DS_DEBUG },
{ FALSE, tooltip_clear, tooltip_update, FALSE, DS_SENDABLE },
@@ -143,9 +143,9 @@ void views_update(DebugState state)
}
}
-gboolean view_select_frame(void)
+gboolean view_stack_update(void)
{
- if (g_strcmp0(frame_id, "0") && views[VIEW_STACK].dirty)
+ if (views[VIEW_STACK].dirty)
{
DebugState state = thread_state >= THREAD_STOPPED ? DS_DEBUG : DS_READY;
view_update_unconditional(VIEW_STACK, state);
@@ -199,7 +199,7 @@ gboolean on_view_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keybo
if (gtk_tree_view_get_tooltip_context(tree, &x, &y, keyboard_tip, NULL, NULL, &iter))
{
- const char *file;
+ char *file;
gtk_tree_view_set_tooltip_cell(tree, tooltip, NULL, base_name_column, NULL);
gtk_tree_model_get(gtk_tree_view_get_model(tree), &iter, COLUMN_FILE, &file, -1);
@@ -209,6 +209,7 @@ gboolean on_view_query_tooltip(GtkWidget *widget, gint x, gint y, gboolean keybo
gchar *utf8 = utils_get_utf8_from_locale(file);
gtk_tooltip_set_text(tooltip, utf8);
+ g_free(file);
g_free(utf8);
return TRUE;
}
@@ -250,7 +251,7 @@ static void on_display_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell,
GtkCellEditable *editable, const gchar *path_str, GtkTreeModel *model)
{
GtkTreeIter iter;
- const char *value;
+ char *value;
gint hb_mode;
g_assert(GTK_IS_EDITABLE(editable));
@@ -259,6 +260,7 @@ static void on_display_editing_started(G_GNUC_UNUSED GtkCellRenderer *cell,
/* scrolling editable to the proper position is left as an exercise for the reader */
g_signal_connect(editable, "map-event", G_CALLBACK(on_display_editable_map_event),
parse_get_display_from_7bit(value, hb_mode, MR_EDITVC));
+ g_free(value);
}
GtkTreeView *view_connect(const char *name, GtkTreeModel **model, GtkTreeSelection **selection,
@@ -331,7 +333,7 @@ void view_display_edited(GtkTreeModel *model, gboolean condition, const gchar *p
if (condition)
{
GtkTreeIter iter;
- const char *name;
+ char *name;
gint hb_mode;
char *locale;
@@ -341,6 +343,7 @@ void view_display_edited(GtkTreeModel *model, gboolean condition, const gchar *p
locale = utils_get_locale_from_display(new_text, hb_mode);
utils_strchrepl(locale, '\n', ' ');
debug_send_format(F, format, name, locale);
+ g_free(name);
g_free(locale);
}
else
@@ -357,14 +360,19 @@ void view_seek_selected(GtkTreeSelection *selection, gboolean focus, SeekerType
{
GtkTreeModel *model;
GtkTreeIter iter;
- const char *file;
- gint line;
if (gtk_tree_selection_get_selected(selection, &model, &iter))
{
+ char *file;
+ gint line;
+
gtk_tree_model_get(model, &iter, COLUMN_FILE, &file, COLUMN_LINE, &line, -1);
+
if (file)
+ {
utils_seek(file, line, focus, seeker);
+ g_free(file);
+ }
}
}
@@ -428,7 +436,7 @@ static void on_command_history_changed(GtkComboBox *command_history,
if (gtk_combo_box_get_active_iter(command_history, &iter))
{
- const gchar *text;
+ gchar *text;
gboolean locale;
gtk_tree_model_get(command_model, &iter, COMMAND_TEXT, &text, COMMAND_LOCALE,
@@ -437,24 +445,29 @@ static void on_command_history_changed(GtkComboBox *command_history,
gtk_toggle_button_set_active(command_locale, locale);
gtk_widget_grab_focus(command_view);
gtk_combo_box_set_active_iter(command_history, NULL);
+ g_free(text);
}
}
static void on_command_insert_button_clicked(G_GNUC_UNUSED GtkButton *button, gpointer gdata)
{
- const char *prefix, *id;
+ const char *prefix;
+ char *id;
GString *text = g_string_new("--");
switch (GPOINTER_TO_INT(gdata))
{
- case 't' : prefix = "thread"; id = thread_id; break;
+ case 't' : prefix = "thread"; id = g_strdup(thread_id); break;
case 'g' : prefix = "group"; id = thread_group_id(); break;
- default : prefix = "frame"; id = frame_id;
+ default : prefix = "frame"; id = g_strdup(frame_id);
}
g_string_append_printf(text, "%s ", prefix);
if (id)
+ {
g_string_append_printf(text, "%s ", id);
+ g_free(id);
+ }
gtk_text_buffer_delete_selection(command_text, FALSE, TRUE);
gtk_text_buffer_insert_at_cursor(command_text, text->str, -1);
g_string_free(text, TRUE);
Modified: scope/src/views.h
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -39,7 +39,7 @@
void views_data_dirty(void);
void views_clear(void);
void views_update(DebugState state);
-gboolean view_select_frame(void);
+gboolean view_stack_update(void);
void view_inspect_update(void);
void on_view_changed(GtkNotebook *notebook, gpointer page, gint page_num, gpointer gdata);
Modified: scope/src/watch.c
13 files changed, 8 insertions(+), 5 deletions(-)
===================================================================
@@ -51,7 +51,7 @@ static void on_watch_enabled_toggled(G_GNUC_UNUSED GtkCellRendererToggle *render
static void watch_iter_update(GtkTreeIter *iter, gpointer gdata)
{
- const gchar *expr;
+ gchar *expr;
gint scid;
gboolean enabled;
@@ -60,6 +60,7 @@ static void watch_iter_update(GtkTreeIter *iter, gpointer gdata)
if (enabled || GPOINTER_TO_INT(gdata))
g_free(debug_send_evaluate('6', scid, expr));
+ g_free(expr);
}
static void on_watch_expr_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
@@ -68,7 +69,7 @@ static void on_watch_expr_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
if (validate_column(new_text, TRUE))
{
GtkTreeIter iter;
- const gchar *expr;
+ gchar *expr;
gboolean enabled;
gtk_tree_model_get_iter_from_string(model, &iter, path_str);
@@ -85,6 +86,7 @@ static void on_watch_expr_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
if (enabled && (debug_state() & DS_DEBUG))
watch_iter_update(&iter, GINT_TO_POINTER(TRUE));
}
+ g_free(expr);
}
}
@@ -161,7 +163,7 @@ void watches_clear(void)
gboolean watches_update(void)
{
- if (view_select_frame())
+ if (g_strcmp0(frame_id, "0") && view_stack_update())
return FALSE;
model_foreach(model, (GFunc) watch_iter_update, GPOINTER_TO_INT(FALSE));
@@ -241,7 +243,7 @@ static gboolean watch_save(GKeyFile *config, const char *section, GtkTreeIter *i
gtk_tree_model_get(model, iter, WATCH_EXPR, &expr, WATCH_HB_MODE, &hb_mode,
WATCH_MR_MODE, &mr_mode, WATCH_ENABLED, &enabled, -1);
- g_key_file_set_string(config, section, "expr", expr);
+ utils_key_file_set_string(config, section, "expr", expr);
g_key_file_set_integer(config, section, "hbit", hb_mode);
g_key_file_set_integer(config, section, "member", mr_mode);
g_key_file_set_boolean(config, section, "enabled", enabled);
@@ -267,12 +269,13 @@ static void on_watch_unsorted(G_GNUC_UNUSED const MenuItem *menu_item)
static void on_watch_add(G_GNUC_UNUSED const MenuItem *menu_item)
{
GtkTreeIter iter;
- const gchar *expr = NULL;
+ gchar *expr = NULL;
if (gtk_tree_selection_get_selected(selection, NULL, &iter))
gtk_tree_model_get(model, &iter, WATCH_EXPR, &expr, -1);
watch_add(expr);
+ g_free(expr);
}
static void on_watch_copy(const MenuItem *menu_item)
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Plugins-Commits
mailing list