Re: [HACKERS] safer node casting
От | Andres Freund |
---|---|
Тема | Re: [HACKERS] safer node casting |
Дата | |
Msg-id | 20170102084023.oepwdoxcqujs53g4@alap3.anarazel.de обсуждение исходный текст |
Ответ на | [HACKERS] safer node casting (Peter Eisentraut <peter.eisentraut@2ndquadrant.com>) |
Список | 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
В списке pgsql-hackers по дате отправления: