[geany/geany-plugins] daf403: scope - per-function @entry arguments, small fixes

Dimitar Zhekov git-noreply at geany.org
Thu Dec 13 19:32:32 UTC 2012


Branch:      refs/heads/master
Author:      Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer:   Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date:        Thu, 13 Dec 2012 19:32:32 UTC
Commit:      daf403f29617605c8a04d7f3d62cbf20cda56cb6
             https://github.com/geany/geany-plugins/commit/daf403f29617605c8a04d7f3d62cbf20cda56cb6

Log Message:
-----------
scope - per-function @entry arguments, small fixes


Modified Paths:
--------------
    scope/ChangeLog
    scope/NOTES
    scope/TODO
    scope/data/scope.glade
    scope/docs/scope.html
    scope/src/inspect.c
    scope/src/local.c
    scope/src/menu.c
    scope/src/parse.c
    scope/src/parse.h
    scope/src/scope.c
    scope/src/stack.c
    scope/src/stack.h
    scope/src/thread.c

Modified: scope/ChangeLog
10 files changed, 10 insertions(+), 0 deletions(-)
===================================================================
@@ -1 +1,11 @@
+2011-12-13  Dimitar Zhekov  <dimitar.zhekov at gmail.com>
 
+ * data/scope.glade, src/local.c, src/parse.c, src/parse.h,
+   src/stack.c, src/stack.h:
+   Per-function display of @entry arguments.
+ * src/inspect.c, src/menu.c:
+   Small per-function @entry arguments related changes.
+ * src/inspect.c, src/local.c
+   (int) strlen(...) to avoid format warnings.
+ * docs/scope.html, src/scope.c:
+   Increased version to 0.76, small fixes and clarifications.


Modified: scope/NOTES
3 files changed, 3 insertions(+), 0 deletions(-)
===================================================================
@@ -1,3 +1,6 @@
+modifying a local function argument refreshes all stack frames - it may be
+a struct or reference argument in other frames
+
 the only way to fix unnecessary inspect drop target expansion is to block
 INTO, so deriving GtkTreeStore and altering GtkTreeDragDest make no sense
 


Modified: scope/TODO
2 files changed, 0 insertions(+), 2 deletions(-)
===================================================================
@@ -1,7 +1,5 @@
 wscript_*
 
-per-function [ ] Show @entry arguments
-
 evaluate expressions with quotes
 
 various tests, source code checks etc.


Modified: scope/data/scope.glade
14 files changed, 14 insertions(+), 0 deletions(-)
===================================================================
@@ -651,6 +651,18 @@
       </object>
     </child>
     <child>
+      <object class="GtkCheckMenuItem" id="stack_show_entry">
+        <property name="visible">True</property>
+        <property name="label" translatable="yes">Show _ at entry</property>
+        <property name="use_underline">True</property>
+      </object>
+    </child>
+    <child>
+      <object class="GtkSeparatorMenuItem" id="stack_separator2">
+        <property name="visible">True</property>
+      </object>
+    </child>
+    <child>
       <object class="GtkCheckMenuItem" id="stack_show_address">
         <property name="visible">True</property>
         <property name="label" translatable="yes">Show _Address</property>
@@ -1186,6 +1198,8 @@
       <column type="gchararray"/>
       <!-- column-name stack_store_addr -->
       <column type="gchararray"/>
+      <!-- column-name stack_store_entry -->
+      <column type="gboolean"/>
     </columns>
   </object>
   <object class="GtkListStore" id="local_store">


Modified: scope/docs/scope.html
20 files changed, 11 insertions(+), 9 deletions(-)
===================================================================
@@ -385,12 +385,12 @@
 
 <p><b><a name="stack">Stack</a></b></p>
 
-<p>The stack will be updated slightly faster if you keep it unsorted or ordered by frame #
-ascending.</p>
-
 <p>The function arguments are subject to 8-bit text conversion. Their individual modes may be
 set via <em>Locals</em>.</p>
 
+<p><em>Show @entry</em> - display any @entry arguments for the current function. Applies to
+<em>Locals</em> too.</p>
+
 <p><b><a name="local">Locals</a></b></p>
 
 <p>The first column is "1" for arguments, empty for local variables.</p>
@@ -550,6 +550,8 @@
 <p>A disabled check button or check menu item means that the respective functionality is
 unavailable; it doesn't matter if the interface element is checked or not.</p>
 
+<p>All subpages will be updated faster if you keep them unsorted.</p>
+
 <p><b><a name="editing_values">Editing values</a></b></p>
 
 <div>GDB often displays values in format unsuitable for assigning. So when editing a value,
@@ -575,13 +577,13 @@
 with backslash will fail. If parsing errors are detected when editing the <em>Value</em>
 column, the entire value will be cleared - but that is not guaranteed to work either.</p>
 
-<p><b><a name="keeping_modes">Editing values</a></b></p>
+<p><b><a name="keeping_modes">Keeping modes</a></b></p>
 
-<p>The 7-bit and .names modes for temporary objects, such as local variables, are not saved.
-However, there is a global list with names and modes, and whenever you change a mode, it's
-saved in that list. When a temporary object is created, Scope searches the list, and sets the
+<p>The 7-bit, .names etc. modes for temporary objects, such as local variables, are not saved.
+However, there is a global list with names and modes, and when you change a mode, it's saved
+in that list. Then, when a temporary object is created, Scope searches the list, and sets the
 modes (if any) for that object. For inspect children, the displayed names are used (including
-numbers for array elements), not the not the fully qualified names.</p>
+numbers for array elements), not the fully qualified names.</p>
 
 <p><b><a name="xos4_colors">Sample dark colors</a></b></p>
 
@@ -668,7 +670,7 @@
 
 <b><a name="copyright">Copyright</a></b>
 
-<p>Scope 0.75, Copyright (C) 2012 Dimitar Toshkov Zhekov</p>
+<p>Scope 0.76, Copyright (C) 2012 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/inspect.c
4 files changed, 2 insertions(+), 2 deletions(-)
===================================================================
@@ -158,7 +158,7 @@ static void inspect_expand(GtkTreeIter *iter)
 	gtk_tree_model_get(model, iter, INSPECT_VAR1, &var1, INSPECT_START, &start,
 		INSPECT_COUNT, &count, INSPECT_NUMCHILD, &numchild, -1);
 	s = g_strdup_printf("%d", start);
-	debug_send_format(N, "07%c%d%d-var-list-children 1 %s %d %d", '0' + strlen(s) - 1,
+	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(s);
 }
@@ -914,7 +914,7 @@ static void on_inspect_hbit_update(const MenuItem *menu_item)
 	gtk_tree_selection_get_selected(selection, NULL, &iter);
 	gtk_tree_model_get(model, &iter, INSPECT_EXPR, &expr, INSPECT_NAME, &name, -1);
 	inspect_hbit_update_iter(&iter, hb_mode);
-	parse_mode_update(expr, hb_mode, TRUE);
+	parse_mode_update(expr, MODE_HBIT, hb_mode);
 
 	if (name)
 	{


Modified: scope/src/local.c
21 files changed, 14 insertions(+), 7 deletions(-)
===================================================================
@@ -64,7 +64,13 @@ static void on_local_display_edited(G_GNUC_UNUSED GtkCellRendererText *renderer,
 	{ NULL, NULL }
 };
 
-static void local_node_variable(const ParseNode *node, const char *name)
+typedef struct _LocalData
+{
+	char *name;
+	gboolean entry;
+} LocalData;
+
+static void local_node_variable(const ParseNode *node, const LocalData *ld)
 {
 	iff (node->type == PT_ARRAY, "variables: contains value")
 	{
@@ -76,14 +82,14 @@ static void local_node_variable(const ParseNode *node, const char *name)
 			GtkTreeIter iter;
 			const char *arg1 = parse_find_value(nodes, "arg");
 
-			//if (!arg1 || show entry arguments || !g_str_has_suffix(var.name, "@entry"))
+			if (!arg1 || ld->entry || !g_str_has_suffix(var.name, "@entry"))
 			{
 				gtk_list_store_append(store, &iter);
 				gtk_list_store_set(store, &iter, LOCAL_NAME, var.name, LOCAL_DISPLAY,
 					var.display, LOCAL_VALUE, var.value, LOCAL_HB_MODE, var.hb_mode,
 					LOCAL_MR_MODE, var.mr_mode, LOCAL_ARG1, arg1, -1);
 
-				if (name && !strcmp(var.name, name))
+				if (!g_strcmp0(var.name, ld->name))
 					gtk_tree_selection_select_iter(selection, &iter);
 			}
 			parse_variable_free(&var);
@@ -101,16 +107,17 @@ void on_local_variables(GArray *nodes)
 	{
 		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, &name, -1);
+			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, name);
-		g_free(name);
+		array_foreach(parse_lead_array(nodes), (GFunc) local_node_variable, &ld);
+		g_free(ld.name);
 	}
 }
 
@@ -131,7 +138,7 @@ void locals_clear(void)
 static void local_send_update(char token)
 {
 	debug_send_format(F, "0%c%c%s%s-stack-list-variables 1", token,
-		'0' + strlen(thread_id) - 1, thread_id, frame_id);
+		'0' + (int) strlen(thread_id) - 1, thread_id, frame_id);
 }
 
 gboolean locals_update(void)


Modified: scope/src/menu.c
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -234,7 +234,7 @@ void menu_mode_update(GtkTreeSelection *selection, gint new_mode, gboolean hbit)
 	gtk_tree_selection_get_selected(selection, &model, &iter);
 	gtk_tree_model_get(model, &iter, COLUMN_NAME, &name, -1);
 	menu_mode_update_iter(model, &iter, new_mode, hbit);
-	parse_mode_update(name, new_mode, hbit);
+	parse_mode_update(name, hbit ? MODE_HBIT : MODE_MEMBER, new_mode);
 
 	if (hbit)
 	{


Modified: scope/src/parse.c
27 files changed, 17 insertions(+), 10 deletions(-)
===================================================================
@@ -482,6 +482,7 @@ static gboolean parse_mode_load(GKeyFile *config, const char *section)
 	char *name = utils_key_file_get_string(config, section, "name");
 	gint hb_mode = g_key_file_get_integer(config, section, "hbit", NULL);
 	gint mr_mode = g_key_file_get_integer(config, section, "member", NULL);
+	gboolean entry = g_key_file_get_boolean(config, section, "entry", NULL);
 
 	if (name && (unsigned) hb_mode < HB_COUNT && (unsigned) mr_mode < MR_MODIFY)
 	{
@@ -490,6 +491,7 @@ static gboolean parse_mode_load(GKeyFile *config, const char *section)
 		pm->name = name;
 		pm->hb_mode = hb_mode;
 		pm->mr_mode = mr_mode;
+		pm->entry = entry;
 		return TRUE;
 	}
 
@@ -502,10 +504,11 @@ static gboolean parse_mode_save(GKeyFile *config, const char *section, ParseMode
 	g_key_file_set_string(config, section, "name", pm->name);
 	g_key_file_set_integer(config, section, "hbit", pm->hb_mode);
 	g_key_file_set_integer(config, section, "member", pm->mr_mode);
+	g_key_file_set_boolean(config, section, "entry", pm->entry);
 	return TRUE;
 }
 
-static ParseMode parse_mode_default = { NULL, HB_DEFAULT, MR_DEFAULT };
+static ParseMode parse_mode_default = { NULL, HB_DEFAULT, MR_DEFAULT, TRUE };
 
 char *parse_mode_reentry(const char *name)
 {
@@ -526,7 +529,7 @@ const ParseMode *parse_mode_find(const char *name)
 	return pm ? pm : &parse_mode_default;
 }
 
-void parse_mode_update(const char *name, gint new_mode, gboolean hbit)
+void parse_mode_update(const char *name, gint mode, gint value)
 {
 	char *pm_name = parse_mode_pm_name(name);
 	ParseMode *pm = (ParseMode *) array_find(parse_modes, pm_name, FALSE);
@@ -537,19 +540,23 @@ void parse_mode_update(const char *name, gint new_mode, gboolean hbit)
 		pm->name = strdup(pm_name);
 		pm->hb_mode = HB_DEFAULT;
 		pm->mr_mode = MR_DEFAULT;
+		pm->entry = TRUE;
 	}
 	g_free(pm_name);
 
-	if (hbit)
-		pm->hb_mode = new_mode;
-	else
-		pm->mr_mode = new_mode;
-
-	if (pm->hb_mode == HB_DEFAULT && pm->mr_mode == MR_DEFAULT)
+	switch (mode)
 	{
-		array_remove(parse_modes, pm);
-		pm = &parse_mode_default;
+		case MODE_HBIT : pm->hb_mode = value; break;
+		case MODE_MEMBER : pm->mr_mode = value; break;
+		default :
+		{
+			g_assert(mode == MODE_ENTRY);
+			pm->entry = value;
+		}
 	}
+
+	if (pm->hb_mode == HB_DEFAULT && pm->mr_mode == MR_DEFAULT && pm->entry == TRUE)
+		array_remove(parse_modes, pm);
 }
 
 gboolean parse_variable(GArray *nodes, ParseVariable *var, const char *children)


Modified: scope/src/parse.h
10 files changed, 9 insertions(+), 1 deletions(-)
===================================================================
@@ -82,11 +82,19 @@ enum
 	MR_EDITVC
 };
 
+enum
+{
+	MODE_HBIT,
+	MODE_MEMBER,
+	MODE_ENTRY
+};
+
 typedef struct _ParseMode
 {
 	char *name;
 	gint hb_mode;
 	gint mr_mode;
+	gboolean entry;
 } ParseMode;
 
 typedef struct _ParseVariable
@@ -104,7 +112,7 @@ enum
 
 char *parse_mode_reentry(const char *name);
 const ParseMode *parse_mode_find(const char *name);
-void parse_mode_update(const char *name, gint new_mode, gboolean hbit);
+void parse_mode_update(const char *name, gint mode, gint value);
 gboolean parse_variable(GArray *nodes, ParseVariable *var, const char *children);
 #define parse_variable_free(var) g_free((var)->display)
 


Modified: scope/src/scope.c
2 files changed, 1 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.75" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
+	_("Simple GDB front-end."), "0.76" , "Dimitar Toshkov Zhekov <dimitar.zhekov at gmail.com>")
 
 /* Keybinding(s) */
 enum


Modified: scope/src/stack.c
106 files changed, 88 insertions(+), 18 deletions(-)
===================================================================
@@ -29,7 +29,8 @@ enum
 	STACK_BASE_NAME,
 	STACK_FUNC,
 	STACK_ARGS,
-	STACK_ADDR
+	STACK_ADDR,
+	STACK_ENTRY
 };
 
 static GtkListStore *store;
@@ -53,7 +54,8 @@ static void stack_node_location(const ParseNode *node, const char *fid)
 			gtk_list_store_append(store, &iter);
 			gtk_list_store_set(store, &iter, STACK_ID, id, STACK_FILE, loc.file,
 				STACK_LINE, loc.line, STACK_BASE_NAME, loc.base_name, STACK_FUNC,
-				loc.func, STACK_ARGS, NULL, STACK_ADDR, loc.addr, -1);
+				loc.func, STACK_ARGS, NULL, STACK_ADDR, loc.addr, STACK_ENTRY,
+				loc.func ? parse_mode_find(loc.func)->entry : TRUE, -1);
 			parse_location_free(&loc);
 
 			if (!g_strcmp0(id, fid))
@@ -86,23 +88,30 @@ void on_stack_frames(GArray *nodes)
 	}
 }
 
-static void append_argument_variable(const ParseNode *node, GString *string)
+typedef struct _StackData
+{
+	GString *string;
+	gboolean entry;
+} StackData;
+
+static void append_argument_variable(const ParseNode *node, const StackData *sd)
 {
 	iff (node->type == PT_ARRAY, "args: contains value")
 	{
 		ParseVariable var;
 
-		if (parse_variable((GArray *) node->value, &var, NULL)) //&&
-			//(show entry arguments || !g_str_has_suffix(var.name, "@entry")))
+		if (parse_variable((GArray *) node->value, &var, NULL) &&
+			(sd->entry || !g_str_has_suffix(var.name, "@entry")))
 		{
-			if (string->len)
-				g_string_append(string, ", ");
+			if (sd->string->len)
+				g_string_append(sd->string, ", ");
+
 			if (option_argument_names)
 			{
-				g_string_append_printf(string,
+				g_string_append_printf(sd->string,
 					option_long_mr_format ? "%s = " : "%s=", var.name);
 			}
-			g_string_append(string, var.display);
+			g_string_append(sd->string, var.display);
 			parse_variable_free(&var);
 		}
 	}
@@ -139,11 +148,13 @@ static void stack_node_arguments(const ParseNode *node, ArgsData *ad)
 
 			iff (ad->valid, "%s: level not found", id)
 			{
-				GString *string = g_string_sized_new(0xFF);
+				StackData sd;
 
-				array_foreach(nodes, (GFunc) append_argument_variable, string);
-				gtk_list_store_set(store, &ad->iter, STACK_ARGS, string->str, -1);
-				g_string_free(string, TRUE);
+				sd.string = g_string_sized_new(0xFF);
+				gtk_tree_model_get(model, &ad->iter, STACK_ENTRY, &sd.entry, -1);
+				array_foreach(nodes, (GFunc) append_argument_variable, &sd);
+				gtk_list_store_set(store, &ad->iter, STACK_ARGS, sd.string->str, -1);
+				g_string_free(sd.string, TRUE);
 				ad->valid = ad->sorted && gtk_tree_model_iter_next(model, &ad->iter);
 			}
 		}
@@ -165,6 +176,16 @@ void on_stack_arguments(GArray *nodes)
 		array_foreach(parse_lead_array(nodes), (GFunc) stack_node_arguments, &ad);
 }
 
+gboolean stack_entry(void)
+{
+	GtkTreeIter iter;
+	gboolean entry;
+
+	gtk_tree_selection_get_selected(selection, NULL, &iter);
+	gtk_tree_model_get(model, &iter, STACK_ENTRY, &entry, -1);
+	return entry;
+}
+
 void stack_clear(void)
 {
 	gtk_list_store_clear(store);
@@ -225,29 +246,78 @@ static void on_stack_show_address(const MenuItem *menu_item)
 	view_column_set_visible("stack_addr_column", stack_show_address);
 }
 
+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));
+	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, &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)
+	{
+		debug_send_format(T, "04%s-stack-list-arguments 1 %s %s", thread_id, frame_id,
+			frame_id);
+	}
+	else
+		debug_send_format(T, "04%s-stack-list-arguments 1", thread_id);
+}
+
 #define DS_FRESHABLE (DS_DEBUG | DS_EXTRA_1)
-#define DS_VIEWABLE (DS_BASICS | DS_EXTRA_2)
+#define DS_ENTRABLE (DS_ACTIVE | DS_EXTRA_2)
+#define DS_VIEWABLE (DS_ACTIVE | DS_EXTRA_3)
 
 static MenuItem stack_menu_items[] =
 {
 	{ "stack_refresh",      on_stack_refresh,      DS_FRESHABLE, NULL, NULL },
 	{ "stack_unsorted",     on_stack_unsorted,     DS_SORTABLE,  NULL, NULL },
 	{ "stack_view_source",  on_stack_view_source,  DS_VIEWABLE,  NULL, NULL },
+	{ "stack_show_entry",   on_stack_show_entry,   DS_ENTRABLE,  NULL, NULL },
 	{ "stack_show_address", on_stack_show_address, 0,            NULL, &stack_show_address },
 	{ NULL, NULL, 0, NULL, NULL }
 };
 
 static guint stack_menu_extra_state(void)
 {
-	return ((thread_id != NULL) << DS_INDEX_1) |
-		(gtk_tree_selection_get_selected(selection, NULL, NULL) << DS_INDEX_2);
+	GtkTreeIter iter;
+	const char *func = NULL;
+
+	if (gtk_tree_selection_get_selected(selection, NULL, &iter))
+		gtk_tree_model_get(model, &iter, STACK_FUNC, &func, -1);
+
+	return ((thread_id != NULL) << DS_INDEX_1) | ((func != NULL) << DS_INDEX_2) |
+		((frame_id != NULL) << DS_INDEX_3);
 }
 
 static MenuInfo stack_menu_info = { stack_menu_items, stack_menu_extra_state, 0 };
 
 static void on_stack_menu_show(G_GNUC_UNUSED GtkWidget *widget, const MenuItem *menu_item)
 {
-	menu_item_set_active(menu_item, stack_show_address);
+	GtkTreeIter iter;
+
+	if (gtk_tree_selection_get_selected(selection, NULL, &iter))
+	{
+		gboolean entry;
+		gtk_tree_model_get(model, &iter, STACK_ENTRY, &entry, -1);
+		menu_item_set_active(menu_item, entry);
+	}
+	menu_item_set_active(menu_item + 1, stack_show_address);
 }
 
 void stack_init(void)
@@ -270,5 +340,5 @@ void stack_init(void)
 		stack_seek_selected);
 	g_signal_connect(selection, "changed", G_CALLBACK(on_stack_selection_changed), NULL);
 	g_signal_connect(menu, "show", G_CALLBACK(on_stack_menu_show),
-		(gpointer) menu_item_find(stack_menu_items, "stack_show_address"));
+		(gpointer) menu_item_find(stack_menu_items, "stack_show_entry"));
 }


Modified: scope/src/stack.h
1 files changed, 1 insertions(+), 0 deletions(-)
===================================================================
@@ -24,6 +24,7 @@
 void on_stack_frames(GArray *nodes);
 void on_stack_arguments(GArray *nodes);
 
+gboolean stack_entry(void);
 void stack_clear(void);
 gboolean stack_update(void);
 


Modified: scope/src/thread.c
2 files changed, 1 insertions(+), 1 deletions(-)
===================================================================
@@ -773,7 +773,7 @@ static void on_thread_show_core(const MenuItem *menu_item)
 #define DS_INTRABLE (DS_ACTIVE | DS_EXTRA_2)
 #define DS_TERMABLE (DS_ACTIVE | DS_EXTRA_2)
 #define DS_SIGNABLE (DS_ACTIVE | DS_EXTRA_2)
-#define DS_VIEWABLE (DS_BASICS | DS_EXTRA_3)
+#define DS_VIEWABLE (DS_ACTIVE | DS_EXTRA_3)
 
 static MenuItem thread_menu_items[] =
 {



--------------
This E-Mail was brought to you by github_commit_mail.py (Source: TBD).


More information about the Plugins-Commits mailing list