gdb: make macro_expand_next return a gdb::unique_xmalloc_ptr<char>

For some reason, macro_expand_next does not return a
gdb::unique_xmalloc_ptr<char>, like its counterparts macro_expand and
macro_expand_once.  This patch fixes that.

macro_buffer::release now returns a gdb::unique_xmalloc_ptr<char> too,
which required updating the other callers.  The `.release (). release
()` in macro_stringify looks a bit funny, but it's because one release
is for the macro_buffer, and the other is for the unique ptr.

I removed the ATTRIBUTE_UNUSED_RESULT on macro_buffer::release, I don't
really understand why it's there.  I don't see how this method could be
called without using the result, that would be an obvious memory leak.
The commit that introduced it (4e4a8b932b "Add ATTRIBUTE_UNUSED_RESULT
to macro_buffer") doesn't give any details.

gdb/ChangeLog:

	* c-exp.y (scan_macro_expansion): Don't free `expansion`.
	(lex_one_token): Update.
	* macroexp.c (struct macro_buffer) <release>: Return
	gdb::unique_xmalloc_ptr<char>.
	(macro_stringify): Update.
	(macro_expand): Update.
	(macro_expand_next): Return gdb::unique_xmalloc_ptr<char>.
	* macroexp.h (macro_expand_next): Likewise.

Change-Id: I67a74d0d479d2c20cdc82161ead7c54cea034f56
This commit is contained in:
Simon Marchi 2020-07-02 20:38:47 -04:00
parent 211d5b1c18
commit 14d960c82a
4 changed files with 28 additions and 22 deletions

View file

@ -1,3 +1,14 @@
2020-07-02 Simon Marchi <simon.marchi@polymtl.ca>
* c-exp.y (scan_macro_expansion): Don't free `expansion`.
(lex_one_token): Update.
* macroexp.c (struct macro_buffer) <release>: Return
gdb::unique_xmalloc_ptr<char>.
(macro_stringify): Update.
(macro_expand): Update.
(macro_expand_next): Return gdb::unique_xmalloc_ptr<char>.
* macroexp.h (macro_expand_next): Likewise.
2020-07-02 Simon Marchi <simon.marchi@efficios.com> 2020-07-02 Simon Marchi <simon.marchi@efficios.com>
* macroexp.h (macro_lookup_ftype): Remove. * macroexp.h (macro_lookup_ftype): Remove.

View file

@ -2551,17 +2551,13 @@ static const struct token ident_tokens[] =
static void static void
scan_macro_expansion (char *expansion) scan_macro_expansion (const char *expansion)
{ {
const char *copy;
/* We'd better not be trying to push the stack twice. */ /* We'd better not be trying to push the stack twice. */
gdb_assert (! cpstate->macro_original_text); gdb_assert (! cpstate->macro_original_text);
/* Copy to the obstack, and then free the intermediate /* Copy to the obstack. */
expansion. */ const char *copy = obstack_strdup (&cpstate->expansion_obstack, expansion);
copy = obstack_strdup (&cpstate->expansion_obstack, expansion);
xfree (expansion);
/* Save the old lexptr value, so we can return to it when we're done /* Save the old lexptr value, so we can return to it when we're done
parsing the expanded text. */ parsing the expanded text. */
@ -2631,11 +2627,11 @@ lex_one_token (struct parser_state *par_state, bool *is_quoted_name)
/* Check if this is a macro invocation that we need to expand. */ /* Check if this is a macro invocation that we need to expand. */
if (! scanning_macro_expansion ()) if (! scanning_macro_expansion ())
{ {
char *expanded = macro_expand_next (&pstate->lexptr, gdb::unique_xmalloc_ptr<char> expanded
*expression_macro_scope); = macro_expand_next (&pstate->lexptr, *expression_macro_scope);
if (expanded) if (expanded != nullptr)
scan_macro_expansion (expanded); scan_macro_expansion (expanded.get ());
} }
pstate->prev_lexptr = pstate->lexptr; pstate->prev_lexptr = pstate->lexptr;

View file

@ -128,15 +128,14 @@ struct macro_buffer
xfree (text); xfree (text);
} }
/* Release the text of the buffer to the caller, which is now /* Release the text of the buffer to the caller. */
responsible for freeing it. */ gdb::unique_xmalloc_ptr<char> release ()
ATTRIBUTE_UNUSED_RESULT char *release ()
{ {
gdb_assert (! shared); gdb_assert (! shared);
gdb_assert (size); gdb_assert (size);
char *result = text; char *result = text;
text = NULL; text = NULL;
return result; return gdb::unique_xmalloc_ptr<char> (result);
} }
/* Resize the buffer to be at least N bytes long. Raise an error if /* Resize the buffer to be at least N bytes long. Raise an error if
@ -708,7 +707,7 @@ macro_stringify (const char *str)
stringify (&buffer, str, len); stringify (&buffer, str, len);
buffer.appendc ('\0'); buffer.appendc ('\0');
return buffer.release (); return buffer.release ().release ();
} }
@ -1429,7 +1428,7 @@ macro_expand (const char *source, const macro_scope &scope)
dest.appendc ('\0'); dest.appendc ('\0');
return gdb::unique_xmalloc_ptr<char> (dest.release ()); return dest.release ();
} }
@ -1439,8 +1438,7 @@ macro_expand_once (const char *source, const macro_scope &scope)
error (_("Expand-once not implemented yet.")); error (_("Expand-once not implemented yet."));
} }
gdb::unique_xmalloc_ptr<char>
char *
macro_expand_next (const char **lexptr, const macro_scope &scope) macro_expand_next (const char **lexptr, const macro_scope &scope)
{ {
struct macro_buffer tok; struct macro_buffer tok;
@ -1454,7 +1452,7 @@ macro_expand_next (const char **lexptr, const macro_scope &scope)
/* Get the text's first preprocessing token. */ /* Get the text's first preprocessing token. */
if (! get_token (&tok, &src)) if (! get_token (&tok, &src))
return 0; return nullptr;
/* If it's a macro invocation, expand it. */ /* If it's a macro invocation, expand it. */
if (maybe_expand (&dest, &tok, &src, 0, scope)) if (maybe_expand (&dest, &tok, &src, 0, scope))
@ -1469,6 +1467,6 @@ macro_expand_next (const char **lexptr, const macro_scope &scope)
else else
{ {
/* It wasn't a macro invocation. */ /* It wasn't a macro invocation. */
return 0; return nullptr;
} }
} }

View file

@ -68,7 +68,8 @@ gdb::unique_xmalloc_ptr<char> macro_expand_once (const char *source,
much have to do tokenization to find the end of the string that much have to do tokenization to find the end of the string that
needs to be macro-expanded. Our C/C++ tokenizer isn't really needs to be macro-expanded. Our C/C++ tokenizer isn't really
designed to be called by anything but the yacc parser engine. */ designed to be called by anything but the yacc parser engine. */
char *macro_expand_next (const char **lexptr, const macro_scope &scope); gdb::unique_xmalloc_ptr<char> macro_expand_next (const char **lexptr,
const macro_scope &scope);
/* Functions to classify characters according to cpp rules. */ /* Functions to classify characters according to cpp rules. */