[05/14] Change tui_data_item_window::content to be a unique_xmalloc_ptr
Commit Message
This changes tui_data_item_window::content to be a unique_xmalloc_ptr
and fixes up the fallout. It also removes a parameter from
tui_expand_tabs, as it was only ever given one value.
gdb/ChangeLog
2019-08-18 Tom Tromey <tom@tromey.com>
* tui/tui-regs.h (struct tui_data_item_window)
<~tui_data_item_window>: Remove.
<content>: Now a unique_xmalloc_ptr.
* tui/tui-regs.c (tui_register_format): Return a
unique_xmalloc_ptr.
(tui_get_register): Update.
(~tui_data_item_window): Remove.
(tui_data_window::display_registers_from, tui_display_register):
Update.
* tui/tui-io.h (tui_expand_tabs): Update.
* tui/tui-io.c (tui_expand_tabs): Return a unique_xmalloc_ptr.
Remove "col" parameter.
---
gdb/ChangeLog | 15 +++++++++++++++
gdb/tui/tui-io.c | 14 ++++++--------
gdb/tui/tui-io.h | 2 +-
gdb/tui/tui-regs.c | 34 ++++++++++------------------------
gdb/tui/tui-regs.h | 4 +---
5 files changed, 33 insertions(+), 36 deletions(-)
Comments
On 8/18/19 6:27 PM, Tom Tromey wrote:
> @@ -309,19 +301,13 @@ tui_data_window::display_registers_from (int start_element_no)
> int max_len = 0;
> for (auto &&data_item_win : regs_content)
> {
> - char *p;
> + const char *p;
> int len;
>
> len = 0;
> - p = data_item_win->content;
> + p = data_item_win->content.get ();
> if (p != 0)
> - while (*p)
> - {
> - if (*p++ == '\t')
> - len = 8 * ((len / 8) + 1);
> - else
> - len++;
> - }
> + len = strlen (p);
>
Is this related?
(Also, I didn't bother to think through whether strlen
is equivalent to the old code. Is it?)
Thanks,
Pedro Alves
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
Pedro> On 8/18/19 6:27 PM, Tom Tromey wrote:
>> @@ -309,19 +301,13 @@ tui_data_window::display_registers_from (int start_element_no)
>> int max_len = 0;
>> for (auto &&data_item_win : regs_content)
>> {
>> - char *p;
>> + const char *p;
>> int len;
>>
>> len = 0;
>> - p = data_item_win->content;
>> + p = data_item_win->content.get ();
>> if (p != 0)
>> - while (*p)
>> - {
>> - if (*p++ == '\t')
>> - len = 8 * ((len / 8) + 1);
>> - else
>> - len++;
>> - }
>> + len = strlen (p);
>>
Pedro> Is this related?
Yeah, though it isn't obvious. I will amend the commit message to make
this clear.
What is happening here is that the content can only be computed by
tui_register_format, which calls tui_expand_tabs before returning. So,
it's not possible to see a tab in the contents.
Pedro> (Also, I didn't bother to think through whether strlen
Pedro> is equivalent to the old code. Is it?)
I think so.
Tom
@@ -1050,19 +1050,17 @@ tui_getc (FILE *fp)
return ch;
}
-/* Utility function to expand TABs in a STRING into spaces. STRING
- will be displayed starting at column COL, and is assumed to include
- no newlines. The returned expanded string is malloc'ed. */
+/* See tui-io.h. */
-char *
-tui_expand_tabs (const char *string, int col)
+gdb::unique_xmalloc_ptr<char>
+tui_expand_tabs (const char *string)
{
int n_adjust, ncol;
const char *s;
char *ret, *q;
/* 1. How many additional characters do we need? */
- for (ncol = col, n_adjust = 0, s = string; s; )
+ for (ncol = 0, n_adjust = 0, s = string; s; )
{
s = strpbrk (s, "\t");
if (s)
@@ -1079,7 +1077,7 @@ tui_expand_tabs (const char *string, int col)
ret = q = (char *) xmalloc (strlen (string) + n_adjust + 1);
/* 2. Copy the original string while replacing TABs with spaces. */
- for (ncol = col, s = string; s; )
+ for (ncol = 0, s = string; s; )
{
const char *s1 = strpbrk (s, "\t");
if (s1)
@@ -1101,5 +1099,5 @@ tui_expand_tabs (const char *string, int col)
s = s1;
}
- return ret;
+ return gdb::unique_xmalloc_ptr<char> (ret);
}
@@ -46,7 +46,7 @@ extern void tui_initialize_io (void);
extern void tui_redisplay_readline (void);
/* Expand TABs into spaces. */
-extern char *tui_expand_tabs (const char *, int);
+extern gdb::unique_xmalloc_ptr<char> tui_expand_tabs (const char *);
/* Enter/leave reverse video mode. */
extern void tui_set_reverse_mode (WINDOW *w, bool reverse);
@@ -52,7 +52,7 @@ static void tui_show_register_group (tui_data_window *win_info,
/* Get the register from the frame and return a printable
representation of it. */
-static char *
+static gdb::unique_xmalloc_ptr<char>
tui_register_format (struct frame_info *frame, int regnum)
{
struct gdbarch *gdbarch = get_frame_arch (frame);
@@ -72,7 +72,7 @@ tui_register_format (struct frame_info *frame, int regnum)
str.resize (str.size () - 1);
/* Expand tabs into spaces, since ncurses on MS-Windows doesn't. */
- return tui_expand_tabs (str.c_str (), 0);
+ return tui_expand_tabs (str.c_str ());
}
/* Get the register value from the given frame and format it for the
@@ -87,27 +87,19 @@ tui_get_register (struct frame_info *frame,
*changedp = false;
if (target_has_registers)
{
- char *prev_content = data->content;
-
- data->content = tui_register_format (frame, regnum);
+ gdb::unique_xmalloc_ptr<char> new_content
+ = tui_register_format (frame, regnum);
if (changedp != NULL
- && strcmp (prev_content, data->content) != 0)
+ && strcmp (data->content.get (), new_content.get ()) != 0)
*changedp = true;
- xfree (prev_content);
+ data->content = std::move (new_content);
}
}
/* See tui-regs.h. */
-tui_data_item_window::~tui_data_item_window ()
-{
- xfree (content);
-}
-
-/* See tui-regs.h. */
-
int
tui_data_window::last_regs_line_no () const
{
@@ -309,19 +301,13 @@ tui_data_window::display_registers_from (int start_element_no)
int max_len = 0;
for (auto &&data_item_win : regs_content)
{
- char *p;
+ const char *p;
int len;
len = 0;
- p = data_item_win->content;
+ p = data_item_win->content.get ();
if (p != 0)
- while (*p)
- {
- if (*p++ == '\t')
- len = 8 * ((len / 8) + 1);
- else
- len++;
- }
+ len = strlen (p);
if (len > max_len)
max_len = len;
@@ -641,7 +627,7 @@ tui_display_register (struct tui_data_item_window *data)
waddch (data->handle, ' ');
wmove (data->handle, 0, 0);
if (data->content)
- waddstr (data->handle, data->content);
+ waddstr (data->handle, data->content.get ());
if (data->highlight)
/* We ignore the return value, casting it to void in order to avoid
@@ -33,13 +33,11 @@ struct tui_data_item_window : public tui_gen_win_info
{
}
- ~tui_data_item_window () override;
-
const char *name = nullptr;
/* The register number, or data display number. */
int item_no = -1;
bool highlight = false;
- char *content = nullptr;
+ gdb::unique_xmalloc_ptr<char> content;
};
/* The TUI registers window. */