[PATCH 49/66] Separate out execution-info window

Tom Tromey
2019-06-23T23:26:37Z

This pulls the EXEC_INFO_WIN case out into its own subclass of
tui_gen_win_info. This lets us remove an element from
union tui_which_element.

gdb/ChangeLog
2019-06-23 Tom Tromey <tom@tromey.com>

* tui/tui-winsource.c
(tui_exec_info_window::maybe_allocate_content): New method.
(tui_set_exec_info_content, tui_show_exec_info_content): Update.
* tui/tui-layout.c (init_and_make_win): Add EXEC_INFO_WIN case.
(make_source_or_disasm_window): Add cast.
* tui/tui-data.h (union tui_which_element) <simple_string>:
Remove.
(struct tui_source_info): New.
(struct tui_source_window_base) <execution_info>: Change type.
* tui/tui-data.c (init_content_element): Remove EXEC_INFO_WIN
case, and add assert.
(tui_alloc_content): Add assert.
---
gdb/ChangeLog | 15 +++++++++++++
gdb/tui/tui-data.c | 8 +++----
gdb/tui/tui-data.h | 31 +++++++++++++++++++++++++--
gdb/tui/tui-layout.c | 20 +++++++++++-------
gdb/tui/tui-winsource.c | 47 +++++++++++++++++++++--------------------
5 files changed, 84 insertions(+), 37 deletions(-)

diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index 9b247b46808..d74c4f7b2a9 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -364,6 +364,8 @@ static void
init_content_element (struct tui_win_element *element,
enum tui_win_type type)
{
+ gdb_assert (type != EXEC_INFO_WIN);
+
switch (type)
{
case SRC_WIN:
@@ -397,10 +399,6 @@ init_content_element (struct tui_win_element *element,
element->which_element.locator.line_no = 0;
element->which_element.locator.addr = 0;
break;
- case EXEC_INFO_WIN:
- memset(element->which_element.simple_string, ' ',
- sizeof(element->which_element.simple_string));
- break;
default:
break;
}
@@ -427,6 +425,8 @@ tui_alloc_content (int num_elements, enum tui_win_type type)
struct tui_win_element *element_block_ptr;
int i;

+ gdb_assert (type != EXEC_INFO_WIN);
+
content = XNEWVEC (struct tui_win_element *, num_elements);

/*
diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index 7392a4e4133..23dd0fd9080 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -249,7 +249,6 @@ union tui_which_element
struct tui_data_element data; /* Elements of data_window. */
struct tui_command_element command; /* Command elements. */
struct tui_locator_element locator; /* Locator elements. */
- tui_exec_info_content simple_string; /* Simple char based elements. */
};

struct tui_win_element
@@ -257,6 +256,34 @@ struct tui_win_element
union tui_which_element which_element;
};

+/* Execution info window class. */
+
+struct tui_exec_info_window : public tui_gen_win_info
+{
+ tui_exec_info_window ()
+ : tui_gen_win_info (EXEC_INFO_WIN)
+ {
+ }
+
+ ~tui_exec_info_window () override
+ {
+ xfree (m_content);
+ }
+
+ /* Get or allocate contents. */
+ tui_exec_info_content *maybe_allocate_content (int n_elements);
+
+ /* Allocate contents. */
+ const tui_exec_info_content *get_content () const
+ {
+ return m_content;
+ }
+
+private:
+
+ tui_exec_info_content *m_content = nullptr;
+};
+
/* This defines information about each logical window. */
struct tui_win_info : public tui_gen_win_info
{
@@ -380,7 +407,7 @@ public:
/* Does locator belongs to this window? */
bool m_has_locator = false;
/* Execution information window. */
- struct tui_gen_win_info *execution_info = nullptr;
+ struct tui_exec_info_window *execution_info = nullptr;
/* Used for horizontal scroll. */
int horizontal_offset = 0;
struct tui_line_or_address start_line_or_addr;
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index 6d343921d4c..a0745bf5384 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -816,6 +816,10 @@ init_and_make_win (tui_gen_win_info *win_info,
win_info = new tui_cmd_window ();
break;

+ case EXEC_INFO_WIN:
+ win_info = new tui_exec_info_window ();
+ break;
+
default:
gdb_assert (tui_win_is_auxillary (win_type));
win_info = new tui_gen_win_info (win_type);
@@ -834,14 +838,14 @@ static struct tui_win_info *
make_source_or_disasm_window (enum tui_win_type type,
int height, int origin_y)
{
- struct tui_gen_win_info *execution_info
- = init_and_make_win (nullptr,
- EXEC_INFO_WIN,
- height,
- 3,
- 0,
- origin_y,
- DONT_BOX_WINDOW);
+ struct tui_exec_info_window *execution_info
+ = (tui_exec_info_window *) init_and_make_win (nullptr,
+ EXEC_INFO_WIN,
+ height,
+ 3,
+ 0,
+ origin_y,
+ DONT_BOX_WINDOW);

/* Now create the source window. */
struct tui_source_window_base *result
diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c
index e56fbcb76d6..204fee13be9 100644
--- a/gdb/tui/tui-winsource.c
+++ b/gdb/tui/tui-winsource.c
@@ -470,6 +470,16 @@ tui_update_breakpoint_info (struct tui_win_info *win,
return need_refresh;
}

+/* See tui-data.h. */
+
+tui_exec_info_content *
+tui_exec_info_window::maybe_allocate_content (int n_elements)
+{
+ if (m_content == nullptr)
+ m_content = XNEWVEC (tui_exec_info_content, n_elements);
+ return m_content;
+}
+

/* Function to initialize the content of the execution info window,
based upon the input window which is either the source or
@@ -479,45 +489,37 @@ tui_set_exec_info_content (struct tui_source_window_base *win_info)
{
if (win_info->execution_info != NULL)
{
- struct tui_gen_win_info *exec_info_ptr = win_info->execution_info;
-
- if (exec_info_ptr->content == NULL)
- exec_info_ptr->content =
- tui_alloc_content (win_info->height, exec_info_ptr->type);
+ tui_exec_info_content *content
+ = win_info->execution_info->maybe_allocate_content (win_info->height);

tui_update_breakpoint_info (win_info, 1);
for (int i = 0; i < win_info->content_size; i++)
{
- struct tui_win_element *element;
+ tui_exec_info_content &element = content[i];
struct tui_win_element *src_element;
int mode;

- element = exec_info_ptr->content[i];
src_element = win_info->content[i];

- memset(element->which_element.simple_string, ' ',
- sizeof(element->which_element.simple_string));
- element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
+ memset (element, ' ', sizeof (tui_exec_info_content));
+ element[TUI_EXECINFO_SIZE - 1] = 0;

/* Now update the exec info content based upon the state
of each line as indicated by the source content. */
mode = src_element->which_element.source.has_break;
if (mode & TUI_BP_HIT)
- element->which_element.simple_string[TUI_BP_HIT_POS] =
- (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
+ element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
- element->which_element.simple_string[TUI_BP_HIT_POS] =
- (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
+ element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';

if (mode & TUI_BP_ENABLED)
- element->which_element.simple_string[TUI_BP_BREAK_POS] = '+';
+ element[TUI_BP_BREAK_POS] = '+';
else if (mode & TUI_BP_DISABLED)
- element->which_element.simple_string[TUI_BP_BREAK_POS] = '-';
+ element[TUI_BP_BREAK_POS] = '-';

if (src_element->which_element.source.is_exec_point)
- element->which_element.simple_string[TUI_EXEC_POS] = '>';
+ element[TUI_EXEC_POS] = '>';
}
- exec_info_ptr->content_size = win_info->content_size;
}
}

@@ -525,17 +527,16 @@ tui_set_exec_info_content (struct tui_source_window_base *win_info)
void
tui_show_exec_info_content (struct tui_source_window_base *win_info)
{
- struct tui_gen_win_info *exec_info = win_info->execution_info;
- int cur_line;
+ struct tui_exec_info_window *exec_info = win_info->execution_info;
+ const tui_exec_info_content *content = exec_info->get_content ();

werase (exec_info->handle);
exec_info->refresh_window ();
- for (cur_line = 1; (cur_line <= exec_info->content_size); cur_line++)
+ for (int cur_line = 1; (cur_line <= win_info->content_size); cur_line++)
mvwaddstr (exec_info->handle,
cur_line,
0,
- (char *) exec_info->content[cur_line - 1]
- ->which_element.simple_string);
+ content[cur_line - 1]);
exec_info->refresh_window ();
exec_info->content_in_use = TRUE;
}
--
2.17.2