From: Pedro Alves <palves@redhat.com>
To: Tom Tromey <tom@tromey.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [RFA 6/8] Use value_freer in dwarf2_evaluate_loc_desc_full
Date: Tue, 20 Dec 2016 14:49:00 -0000 [thread overview]
Message-ID: <bae1a4b2-53d8-339c-4aae-8e0e63325358@redhat.com> (raw)
In-Reply-To: <87bmwgez57.fsf@tromey.com>
On 12/13/2016 01:28 PM, Tom Tromey wrote:
>>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
>
> Pedro> Or "reset ()", following the naming used in the standard smart pointers?
>
> I went with reset since I think "free" can be a macro sometimes.
> Or at least it could in C... not actually sure if C++ removed this
> possibility.
I always assumed it has, but had never went looking for the specific
wording. Looking at the C++14 draft N4140, I see:
17.6.1.2 - Headers:
5 - Names which are defined as macros in C shall be defined as macros in
the C ++ standard library, even if C grants license for implementation
as functions. [ Note: The names defined as macros in C include the
following: assert, offsetof, setjmp, va_arg, va_end, and va_start. - end note ]
6 - Names that are defined as functions in C shall be defined as functions in
the C ++ standard library." (175)
And then footnote 175 clarifies:
"175) This disallows the practice, allowed in C, of providing a masking
macro in addition to the function prototype. The only way to achieve equivalent
inline behavior in C ++ is to provide a definition as an extern inline function."
So I think the answer is yes, C++ removes that possibility.
BTW, I meanwhile realized that "release" would also be a
naming/concept conflict with release_value / value_release_to_mark
too. Really best to avoid it here.
In pondering a bit more over this, I wonder whether
adding a "scoped_" to go with scoped_restore etc., would make
it a bit clearer to readers that this is a RAII type. Then
also considering value_release_to_mark, I wonder would an
API/naming like this:
struct scoped_value_mark
{
scoped_value_mark () : m_value (value_mark ()) {}
~scoped_value_mark () { free_to_mark ()}
void free_to_mark () { if (m_value) value_free_to_mark (m_value); }
void release_to_mark () { if (m_value) value_release_to_mark (m_value); }
/* Get the mark value. */
struct value *get () { return m_value; }
};
Uses would look like:
scoped_value_mark value_mark;
...
value_mark.free_to_mark (); // some path than wants an explicit "free_to_mark".
In eval.c:fetch_subexp_value we'd use it like:
/* Evaluate the expression. */
scoped_value_mark mark;
[...]
result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL);
[...]
new_mark = value_mark ();
if (mark.get () == new_mark)
return;
/* Make sure it's not lazy, so that after the target stops again we
have a non-lazy previous value to compare with. */
[...]
if (val_chain)
{
/* Return the chain of intermediate values. We use this to
decide which addresses to watch. */
*val_chain = new_mark;
mark.release_to_mark ();
}
}
Would this result in clearer client code? IMHO, yes, but WDYT?
Thanks,
Pedro Alves
next prev parent reply other threads:[~2016-12-20 14:49 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-29 5:06 [RFA 0/8] C++-ification series #5 Tom Tromey
2016-11-29 5:06 ` [RFA 3/8] Introduce and use gdb::unlinker Tom Tromey
2016-12-02 13:17 ` Pedro Alves
2016-11-29 5:06 ` [RFA 7/8] Use unique_xmalloc_ptr in execute_gdb_command Tom Tromey
2016-11-29 5:22 ` Tom Tromey
2016-12-15 3:49 ` Tom Tromey
2016-12-20 17:48 ` Pedro Alves
2016-12-20 18:13 ` Tom Tromey
2016-12-23 20:01 ` Tom Tromey
2017-01-10 17:59 ` Pedro Alves
2017-01-10 19:22 ` Tom Tromey
2016-12-20 23:31 ` Tom Tromey
2016-12-20 23:56 ` Pedro Alves
2016-12-22 14:50 ` Tom Tromey
2016-12-22 15:09 ` Pedro Alves
2016-12-22 15:29 ` Tom Tromey
2016-12-22 15:40 ` Pedro Alves
2016-12-02 14:49 ` Pedro Alves
2016-12-13 13:30 ` Tom Tromey
2016-11-29 5:06 ` [RFA 4/8] Remove make_cleanup_discard_psymtabs Tom Tromey
2016-12-02 14:21 ` Pedro Alves
2016-11-29 5:06 ` [RFA 5/8] Add value_freer Tom Tromey
2016-12-02 14:24 ` Pedro Alves
2016-11-29 5:06 ` [RFA 6/8] Use value_freer in dwarf2_evaluate_loc_desc_full Tom Tromey
2016-12-02 14:45 ` Pedro Alves
2016-12-13 13:29 ` Tom Tromey
2016-12-20 14:49 ` Pedro Alves [this message]
2016-12-23 19:05 ` Tom Tromey
2016-12-23 19:59 ` Tom Tromey
2017-01-10 17:58 ` Pedro Alves
2016-12-23 19:59 ` Tom Tromey
2017-01-10 17:57 ` Pedro Alves
2016-11-29 5:06 ` [RFA 2/8] Use class to manage BFD reference counts Tom Tromey
2016-12-02 13:05 ` Pedro Alves
2016-12-13 13:26 ` Tom Tromey
2016-12-15 4:12 ` Tom Tromey
2016-12-20 18:18 ` Pedro Alves
2016-12-20 17:19 ` [pushed] gdb: Constify solib_find (Re: [RFA 2/8] Use class to manage BFD reference counts) Pedro Alves
2016-12-20 18:05 ` Tom Tromey
2016-11-29 5:06 ` [RFA 1/8] Add gdb_ref_ptr.h Tom Tromey
2016-12-02 13:08 ` Pedro Alves
2016-12-02 17:46 ` Tom Tromey
2016-12-02 18:11 ` Pedro Alves
2016-12-02 19:52 ` Tom Tromey
2016-12-02 23:45 ` Pedro Alves
2016-12-03 0:05 ` Pedro Alves
2016-12-13 13:13 ` Tom Tromey
2016-11-29 5:06 ` [RFA 8/8] Add constructor and destructor to demangle_parse_info Tom Tromey
2016-12-02 15:04 ` Pedro Alves
2016-12-13 13:50 ` Tom Tromey
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bae1a4b2-53d8-339c-4aae-8e0e63325358@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
--cc=tom@tromey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox