From: | Andres Freund <andres(at)anarazel(dot)de> |
---|---|
To: | Peter Eisentraut <peter(dot)eisentraut(at)2ndquadrant(dot)com> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: safer node casting |
Date: | 2017-01-02 08:40:23 |
Message-ID: | 20170102084023.oepwdoxcqujs53g4@alap3.anarazel.de |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
Hi,
On 2016-12-31 12:08:22 -0500, Peter Eisentraut wrote:
> There is a common coding pattern that goes like this:
>
> RestrictInfo *rinfo = (RestrictInfo *) lfirst(lc);
> Assert(IsA(rinfo, RestrictInfo));
> I propose a macro castNode() that combines the assertion and the cast,
> so this would become
>
> RestrictInfo *rinfo = castNode(RestrictInfo, lfirst(lc));
I'm quite a bit in favor of something like this, having proposed it
before ;)
> +#define castNode(_type_,nodeptr) (AssertMacro(!nodeptr || IsA(nodeptr,_type_)), (_type_ *)(nodeptr))
ISTM that we need to do the core part of this in an inline function, to
avoid multiple evaluation hazards - which seem quite likely to occur
here - it's pretty common to cast the result of a function after all.
Something like
static inline Node*
castNodeImpl(void *c, enum NodeTag t)
{
Assert(c == NULL || IsA(c, t));
return c;
}
#define castNode(_type_, nodeptr) ((_type_ *) castNodeImpl(nodeptr, _type_))
should work without too much trouble afaics?
Greetings,
Andres Freund
From | Date | Subject | |
---|---|---|---|
Next Message | Simon Riggs | 2017-01-02 09:17:00 | Re: Replication/backup defaults |
Previous Message | Pavel Stehule | 2017-01-02 07:53:47 | Re: proposal: session server side variables |