[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