/* C preprocessor macro expansion for GDB.
- Copyright (C) 2002-2018 Free Software Foundation, Inc.
+ Copyright (C) 2002-2019 Free Software Foundation, Inc.
Contributed by Red Hat, Inc.
This file is part of GDB.
#include "defs.h"
#include "gdb_obstack.h"
-#include "bcache.h"
#include "macrotab.h"
#include "macroexp.h"
#include "c-lang.h"
shared = true;
}
+ macro_buffer& operator= (const macro_buffer &src)
+ {
+ gdb_assert (src.shared);
+ gdb_assert (shared);
+ set_shared (src.text, src.len);
+ last_token = src.last_token;
+ is_identifier = src.is_identifier;
+ return *this;
+ }
+
~macro_buffer ()
{
if (! shared && size)
/* Release the text of the buffer to the caller, which is now
responsible for freeing it. */
- char *release ()
+ ATTRIBUTE_UNUSED_RESULT char *release ()
{
gdb_assert (! shared);
gdb_assert (size);
/* If the single token in SRC_FIRST followed by the tokens in SRC_REST
- constitute a macro invokation not forbidden in NO_LOOP, append its
+ constitute a macro invocation not forbidden in NO_LOOP, append its
expansion to DEST and return non-zero. Otherwise, return zero, and
leave DEST unchanged.
{
/* Make a null-terminated copy of it, since that's what our
lookup function expects. */
- char *id = (char *) xmalloc (src_first->len + 1);
- struct cleanup *back_to = make_cleanup (xfree, id);
+ std::string id (src_first->text, src_first->len);
- memcpy (id, src_first->text, src_first->len);
- id[src_first->len] = 0;
-
/* If we're currently re-scanning the result of expanding
this macro, don't expand it again. */
- if (! currently_rescanning (no_loop, id))
+ if (! currently_rescanning (no_loop, id.c_str ()))
{
/* Does this identifier have a macro definition in scope? */
- struct macro_definition *def = lookup_func (id, lookup_baton);
+ struct macro_definition *def = lookup_func (id.c_str (),
+ lookup_baton);
- if (def && expand (id, def, dest, src_rest, no_loop,
+ if (def && expand (id.c_str (), def, dest, src_rest, no_loop,
lookup_func, lookup_baton))
- {
- do_cleanups (back_to);
- return 1;
- }
+ return 1;
}
-
- do_cleanups (back_to);
}
return 0;