From 032627ee7837f0baa539df7247e003dbaded2c90 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 2 Jun 2019 12:23:39 -0400 Subject: [PATCH] Clean up PL/Perl's handling of the _() macro. Perl likes to redefine the _() macro: #ifdef CAN_PROTOTYPE #define _(args) args #else ... There was lots not to like about the way we dealt with this before: 1. Instead of taking care of the conflict centrally in plperl.h, we expected every one of its ever-growing number of includers to do so. This is duplicative and error-prone in itself, plus it means that plperl.h fails to meet the expectation of being compilable standalone, resulting in macro-redefinition warnings in cpluspluscheck. 2. We left _() with its Perl definition, meaning that if someone tried to use it in any Perl-related extension, it would silently fail to provide run-time translation. I don't see any live bugs of this ilk, but it's clearly a hard-to-notice bug waiting to happen. So fix that by centralizing the cleanup logic, making it match what we're already doing for other macro conflicts with Perl. Since we only expect plperl.h to be included by extensions not core code, we should redefine _() as dgettext() not gettext(). --- contrib/hstore_plperl/hstore_plperl.c | 4 +--- contrib/jsonb_plperl/jsonb_plperl.c | 3 --- src/pl/plperl/SPI.xs | 3 --- src/pl/plperl/Util.xs | 4 +--- src/pl/plperl/plperl.c | 3 --- src/pl/plperl/plperl.h | 15 +++++++++++++++ 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/contrib/hstore_plperl/hstore_plperl.c b/contrib/hstore_plperl/hstore_plperl.c index 61b5557421..1316b0500b 100644 --- a/contrib/hstore_plperl/hstore_plperl.c +++ b/contrib/hstore_plperl/hstore_plperl.c @@ -1,11 +1,9 @@ #include "postgres.h" -#undef _ - #include "fmgr.h" +#include "hstore/hstore.h" #include "plperl.h" #include "plperl_helpers.h" -#include "hstore/hstore.h" PG_MODULE_MAGIC; diff --git a/contrib/jsonb_plperl/jsonb_plperl.c b/contrib/jsonb_plperl/jsonb_plperl.c index 79c5f57d8f..b26723a958 100644 --- a/contrib/jsonb_plperl/jsonb_plperl.c +++ b/contrib/jsonb_plperl/jsonb_plperl.c @@ -2,9 +2,6 @@ #include -/* Defined by Perl */ -#undef _ - #include "fmgr.h" #include "plperl.h" #include "plperl_helpers.h" diff --git a/src/pl/plperl/SPI.xs b/src/pl/plperl/SPI.xs index b98c547e8b..b2db3bd694 100644 --- a/src/pl/plperl/SPI.xs +++ b/src/pl/plperl/SPI.xs @@ -10,9 +10,6 @@ /* this must be first: */ #include "postgres.h" -/* Defined by Perl */ -#undef _ - /* perl stuff */ #define PG_NEED_PERL_XSUB_H #include "plperl.h" diff --git a/src/pl/plperl/Util.xs b/src/pl/plperl/Util.xs index 686513d2e8..47eba59415 100644 --- a/src/pl/plperl/Util.xs +++ b/src/pl/plperl/Util.xs @@ -12,13 +12,11 @@ /* this must be first: */ #include "postgres.h" + #include "fmgr.h" #include "utils/builtins.h" #include "utils/bytea.h" /* for byteain & byteaout */ -/* Defined by Perl */ -#undef _ - /* perl stuff */ #define PG_NEED_PERL_XSUB_H #include "plperl.h" diff --git a/src/pl/plperl/plperl.c b/src/pl/plperl/plperl.c index 5cb3a44729..2db13d3030 100644 --- a/src/pl/plperl/plperl.c +++ b/src/pl/plperl/plperl.c @@ -7,9 +7,6 @@ #include "postgres.h" -/* Defined by Perl */ -#undef _ - /* system stuff */ #include #include diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index 09a77dc0b7..e94a4c345b 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -38,6 +38,11 @@ #undef vprintf #undef printf +/* + * Perl scribbles on the "_" macro too. + */ +#undef _ + /* * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's * __inline__. Translate to something MSVC recognizes. Also, perl.h sometimes @@ -140,6 +145,16 @@ #define vprintf pg_vprintf #define printf(...) pg_printf(__VA_ARGS__) +/* + * Put back "_" too; but rather than making it just gettext() as the core + * code does, make it dgettext() so that the right things will happen in + * loadable modules (if they've set up TEXTDOMAIN correctly). Note that + * we can't just set TEXTDOMAIN here, because this file is used by more + * extensions than just PL/Perl itself. + */ +#undef _ +#define _(x) dgettext(TEXTDOMAIN, x) + /* put back the definition of isnan if needed */ #ifdef _MSC_VER #ifndef isnan -- 2.40.0