Separate out execution-info window

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-25  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.
This commit is contained in:
Tom Tromey
2019-06-20 19:59:06 -06:00
parent c3fabb7d69
commit 489e9d8b7b
5 changed files with 84 additions and 37 deletions

View File

@ -1,3 +1,18 @@
2019-06-25 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.
2019-06-25 Tom Tromey <tom@tromey.com> 2019-06-25 Tom Tromey <tom@tromey.com>
* tui/tui-data.h (tui_alloc_win_info): Don't declare. * tui/tui-data.h (tui_alloc_win_info): Don't declare.

View File

@ -364,6 +364,8 @@ static void
init_content_element (struct tui_win_element *element, init_content_element (struct tui_win_element *element,
enum tui_win_type type) enum tui_win_type type)
{ {
gdb_assert (type != EXEC_INFO_WIN);
switch (type) switch (type)
{ {
case SRC_WIN: 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.line_no = 0;
element->which_element.locator.addr = 0; element->which_element.locator.addr = 0;
break; break;
case EXEC_INFO_WIN:
memset(element->which_element.simple_string, ' ',
sizeof(element->which_element.simple_string));
break;
default: default:
break; break;
} }
@ -427,6 +425,8 @@ tui_alloc_content (int num_elements, enum tui_win_type type)
struct tui_win_element *element_block_ptr; struct tui_win_element *element_block_ptr;
int i; int i;
gdb_assert (type != EXEC_INFO_WIN);
content = XNEWVEC (struct tui_win_element *, num_elements); content = XNEWVEC (struct tui_win_element *, num_elements);
/* /*

View File

@ -249,7 +249,6 @@ union tui_which_element
struct tui_data_element data; /* Elements of data_window. */ struct tui_data_element data; /* Elements of data_window. */
struct tui_command_element command; /* Command elements. */ struct tui_command_element command; /* Command elements. */
struct tui_locator_element locator; /* Locator elements. */ struct tui_locator_element locator; /* Locator elements. */
tui_exec_info_content simple_string; /* Simple char based elements. */
}; };
struct tui_win_element struct tui_win_element
@ -257,6 +256,34 @@ struct tui_win_element
union tui_which_element which_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);
/* Return the 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. */ /* This defines information about each logical window. */
struct tui_win_info : public tui_gen_win_info struct tui_win_info : public tui_gen_win_info
{ {
@ -380,7 +407,7 @@ public:
/* Does the locator belong to this window? */ /* Does the locator belong to this window? */
bool m_has_locator = false; bool m_has_locator = false;
/* Execution information window. */ /* Execution information window. */
struct tui_gen_win_info *execution_info = nullptr; struct tui_exec_info_window *execution_info = nullptr;
/* Used for horizontal scroll. */ /* Used for horizontal scroll. */
int horizontal_offset = 0; int horizontal_offset = 0;
struct tui_line_or_address start_line_or_addr; struct tui_line_or_address start_line_or_addr;

View File

@ -816,6 +816,10 @@ init_and_make_win (tui_gen_win_info *win_info,
win_info = new tui_cmd_window (); win_info = new tui_cmd_window ();
break; break;
case EXEC_INFO_WIN:
win_info = new tui_exec_info_window ();
break;
default: default:
gdb_assert (tui_win_is_auxillary (win_type)); gdb_assert (tui_win_is_auxillary (win_type));
win_info = new tui_gen_win_info (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, make_source_or_disasm_window (enum tui_win_type type,
int height, int origin_y) int height, int origin_y)
{ {
struct tui_gen_win_info *execution_info struct tui_exec_info_window *execution_info
= init_and_make_win (nullptr, = (tui_exec_info_window *) init_and_make_win (nullptr,
EXEC_INFO_WIN, EXEC_INFO_WIN,
height, height,
3, 3,
0, 0,
origin_y, origin_y,
DONT_BOX_WINDOW); DONT_BOX_WINDOW);
/* Now create the source window. */ /* Now create the source window. */
struct tui_source_window_base *result struct tui_source_window_base *result

View File

@ -470,6 +470,16 @@ tui_update_breakpoint_info (struct tui_win_info *win,
return need_refresh; 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, /* Function to initialize the content of the execution info window,
based upon the input window which is either the source or 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) if (win_info->execution_info != NULL)
{ {
struct tui_gen_win_info *exec_info_ptr = win_info->execution_info; tui_exec_info_content *content
= win_info->execution_info->maybe_allocate_content (win_info->height);
if (exec_info_ptr->content == NULL)
exec_info_ptr->content =
tui_alloc_content (win_info->height, exec_info_ptr->type);
tui_update_breakpoint_info (win_info, 1); tui_update_breakpoint_info (win_info, 1);
for (int i = 0; i < win_info->content_size; i++) 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; struct tui_win_element *src_element;
int mode; int mode;
element = exec_info_ptr->content[i];
src_element = win_info->content[i]; src_element = win_info->content[i];
memset(element->which_element.simple_string, ' ', memset (element, ' ', sizeof (tui_exec_info_content));
sizeof(element->which_element.simple_string)); element[TUI_EXECINFO_SIZE - 1] = 0;
element->which_element.simple_string[TUI_EXECINFO_SIZE - 1] = 0;
/* Now update the exec info content based upon the state /* Now update the exec info content based upon the state
of each line as indicated by the source content. */ of each line as indicated by the source content. */
mode = src_element->which_element.source.has_break; mode = src_element->which_element.source.has_break;
if (mode & TUI_BP_HIT) if (mode & TUI_BP_HIT)
element->which_element.simple_string[TUI_BP_HIT_POS] = element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'H' : 'B';
(mode & TUI_BP_HARDWARE) ? 'H' : 'B';
else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED)) else if (mode & (TUI_BP_ENABLED | TUI_BP_DISABLED))
element->which_element.simple_string[TUI_BP_HIT_POS] = element[TUI_BP_HIT_POS] = (mode & TUI_BP_HARDWARE) ? 'h' : 'b';
(mode & TUI_BP_HARDWARE) ? 'h' : 'b';
if (mode & TUI_BP_ENABLED) 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) 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) 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 void
tui_show_exec_info_content (struct tui_source_window_base *win_info) tui_show_exec_info_content (struct tui_source_window_base *win_info)
{ {
struct tui_gen_win_info *exec_info = win_info->execution_info; struct tui_exec_info_window *exec_info = win_info->execution_info;
int cur_line; const tui_exec_info_content *content = exec_info->get_content ();
werase (exec_info->handle); werase (exec_info->handle);
exec_info->refresh_window (); 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, mvwaddstr (exec_info->handle,
cur_line, cur_line,
0, 0,
(char *) exec_info->content[cur_line - 1] content[cur_line - 1]);
->which_element.simple_string);
exec_info->refresh_window (); exec_info->refresh_window ();
exec_info->content_in_use = TRUE; exec_info->content_in_use = TRUE;
} }