mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-29 08:24:05 +08:00
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:
@ -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.
|
||||||
|
@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user