mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-10-02 16:31:15 +02:00
In GCC-based builds, use a better newNode() macro that relies on GCC-specific
syntax to avoid a useless store into a global variable. Per experimentation, this works better than my original thought of trying to push the code into an out-of-line subroutine.
This commit is contained in:
parent
7ad60b49dc
commit
6253f9de67
@ -9,7 +9,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $PostgreSQL: pgsql/src/backend/nodes/nodes.c,v 1.28 2008/01/01 19:45:50 momjian Exp $
|
* $PostgreSQL: pgsql/src/backend/nodes/nodes.c,v 1.29 2008/08/29 22:49:07 tgl Exp $
|
||||||
*
|
*
|
||||||
* HISTORY
|
* HISTORY
|
||||||
* Andrew Yu Oct 20, 1994 file creation
|
* Andrew Yu Oct 20, 1994 file creation
|
||||||
@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Support for newNode() macro
|
* Support for newNode() macro
|
||||||
|
*
|
||||||
|
* In a GCC build there is no need for the global variable newNodeMacroHolder.
|
||||||
|
* However, we create it anyway, to support the case of a non-GCC-built
|
||||||
|
* loadable module being loaded into a GCC-built backend.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Node *newNodeMacroHolder;
|
Node *newNodeMacroHolder;
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||||
* Portions Copyright (c) 1994, Regents of the University of California
|
* Portions Copyright (c) 1994, Regents of the University of California
|
||||||
*
|
*
|
||||||
* $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.209 2008/08/22 00:16:04 tgl Exp $
|
* $PostgreSQL: pgsql/src/include/nodes/nodes.h,v 1.210 2008/08/29 22:49:07 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -384,6 +384,23 @@ typedef struct Node
|
|||||||
* !WARNING!: Avoid using newNode directly. You should be using the
|
* !WARNING!: Avoid using newNode directly. You should be using the
|
||||||
* macro makeNode. eg. to create a Query node, use makeNode(Query)
|
* macro makeNode. eg. to create a Query node, use makeNode(Query)
|
||||||
*
|
*
|
||||||
|
* Note: the size argument should always be a compile-time constant, so the
|
||||||
|
* apparent risk of multiple evaluation doesn't matter in practice.
|
||||||
|
*/
|
||||||
|
#ifdef __GNUC__
|
||||||
|
|
||||||
|
/* With GCC, we can use a compound statement within an expression */
|
||||||
|
#define newNode(size, tag) \
|
||||||
|
({ Node *_result; \
|
||||||
|
AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \
|
||||||
|
_result = (Node *) palloc0fast(size); \
|
||||||
|
_result->type = (tag); \
|
||||||
|
_result; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
/*
|
||||||
* There is no way to dereference the palloc'ed pointer to assign the
|
* There is no way to dereference the palloc'ed pointer to assign the
|
||||||
* tag, and also return the pointer itself, so we need a holder variable.
|
* tag, and also return the pointer itself, so we need a holder variable.
|
||||||
* Fortunately, this macro isn't recursive so we just define
|
* Fortunately, this macro isn't recursive so we just define
|
||||||
@ -399,6 +416,8 @@ extern PGDLLIMPORT Node *newNodeMacroHolder;
|
|||||||
newNodeMacroHolder \
|
newNodeMacroHolder \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
#endif /* __GNUC__ */
|
||||||
|
|
||||||
|
|
||||||
#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_))
|
#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_))
|
||||||
#define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t))
|
#define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t))
|
||||||
|
Loading…
Reference in New Issue
Block a user