summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Williamson <khw@cpan.org>2022-10-02 18:30:44 -0600
committerKarl Williamson <khw@cpan.org>2022-10-18 06:22:16 -0600
commit7de8159af380f738facd9db4aa5455f02ba5af04 (patch)
tree5f888c19c342521dd6ffcb3aa2d4445ca9b3317f
parentd52dd969e613d078943e8c99baec94ae5c4aef53 (diff)
downloadperl-7de8159af380f738facd9db4aa5455f02ba5af04.tar.gz
Clean up perl.h/makedef.pl common logic
This has gotten two twisty little mazy over time. Clean it up, add comments, and make sure the logic is the same on both.
-rw-r--r--makedef.pl41
-rw-r--r--perl.h62
2 files changed, 62 insertions, 41 deletions
diff --git a/makedef.pl b/makedef.pl
index 36ae63e06b..6aabe7a046 100644
--- a/makedef.pl
+++ b/makedef.pl
@@ -107,6 +107,7 @@ while (<CFG>) {
}
close(CFG);
+#==========================================================================
# perl.h logic duplication begins
if ($define{USE_ITHREADS}) {
@@ -143,33 +144,45 @@ my $cctype = $ARGS{CCTYPE} =~ s/MSVC//r;
if ($define{USE_ITHREADS} && ! $define{NO_LOCALE_THREADS}) {
$define{USE_LOCALE_THREADS} = 1;
}
-if (! $define{HAS_SETLOCALE} && $define{HAS_POSIX_2008_LOCALE}) {
+
+if ( $define{HAS_POSIX_2008_LOCALE}
+ && ( ! $define{HAS_SETLOCALE} || ( $define{USE_LOCALE_THREADS}
+ && ! $define{NO_POSIX_2008_LOCALE})))
+{
$define{USE_POSIX_2008_LOCALE} = 1;
- $define{USE_THREAD_SAFE_LOCALE} = 1;
}
-elsif ( ($define{USE_LOCALE_THREADS} || $define{USE_THREAD_SAFE_LOCALE})
- && ( $define{HAS_POSIX_2008_LOCALE}
- || ($ARGS{PLATFORM} eq 'win32' && ( $cctype !~ /\D/
- && $cctype >= 80)))
- && ! $define{NO_THREAD_SAFE_LOCALE})
+
+if ($define{USE_LOCALE_THREADS} && ! $define{NO_THREAD_SAFE_LOCALE})
+{
+ if ( $define{USE_POSIX_2008_LOCALE}
+ || ($ARGS{PLATFORM} eq 'win32' && ( $cctype !~ /\D/
+ && $cctype >= 80)))
+ {
+ $define{USE_THREAD_SAFE_LOCALE} = 1;
+ }
+}
+
+if ($define{USE_POSIX_2008_LOCALE} && $define{HAS_QUERYLOCALE})
{
- $define{USE_THREAD_SAFE_LOCALE} = 1 unless $define{USE_THREAD_SAFE_LOCALE};
- $define{USE_POSIX_2008_LOCALE} = 1 if $define{HAS_POSIX_2008_LOCALE};
+ $define{USE_QUERYLOCALE} = 1;
+
+ # Don't need glibc only code from perl.h
}
-if ( ($define{USE_POSIX_2008_LOCALE} && ! $define{HAS_QUERYLOCALE}))
+if ($define{USE_POSIX_2008_LOCALE} && ! $define{USE_QUERYLOCALE})
{
$define{USE_PL_CURLOCALES} = 1;
}
-if ( $ARGS{PLATFORM} eq 'win32'
- && $define{USE_THREAD_SAFE_LOCALE}
- && $cctype < 140)
+if ($ARGS{PLATFORM} eq 'win32' && $define{USE_THREAD_SAFE_LOCALE})
{
- $define{TS_W32_BROKEN_LOCALECONV} = 1;
+ if ($cctype < 140) {
+ $define{TS_W32_BROKEN_LOCALECONV} = 1;
+ }
}
# perl.h logic duplication ends
+#==========================================================================
print STDERR "Defines: (" . join(' ', sort keys %define) . ")\n"
unless $ARGS{PLATFORM} eq 'test';
diff --git a/perl.h b/perl.h
index 31120f7c94..21c81b7900 100644
--- a/perl.h
+++ b/perl.h
@@ -1064,6 +1064,10 @@ violations are fatal.
#include "perl_langinfo.h" /* Needed for _NL_LOCALE_NAME */
+/* =========================================================================
+ * The defines from here to the following ===== line are unfortunately
+ * duplicated in makedef.pl, and changes here MUST also be made there */
+
/* If not forbidden, we enable locale handling if either 1) the POSIX 2008
* functions are available, or 2) just the setlocale() function. This logic is
* repeated in t/loc_tools.pl and makedef.pl; The three should be kept in
@@ -1215,35 +1219,32 @@ violations are fatal.
# define LC_ALL_INDEX_ PERL_DUMMY_TOD_ + 1
# endif
-/* XXX The next few defines are unfortunately duplicated in makedef.pl, and
- * changes here MUST also be made there */
# if defined(USE_ITHREADS) && ! defined(NO_LOCALE_THREADS)
# define USE_LOCALE_THREADS
# endif
-# if ! defined(HAS_SETLOCALE) && defined(HAS_POSIX_2008_LOCALE)
-# define USE_POSIX_2008_LOCALE
-# ifdef USE_LOCALE_THREADS
-# define USE_THREAD_SAFE_LOCALE
-# endif
- /* If compiled with
- * -DUSE_THREAD_SAFE_LOCALE, will do so even
- * on unthreaded builds */
-# elif (defined(USE_LOCALE_THREADS) || defined(USE_THREAD_SAFE_LOCALE)) \
- && ( defined(HAS_POSIX_2008_LOCALE) \
- || (defined(WIN32) && defined(_MSC_VER))) \
- && ! defined(NO_THREAD_SAFE_LOCALE)
-# ifndef USE_THREAD_SAFE_LOCALE
+
+ /* Use POSIX 2008 locales if available, and no alternative exists
+ * ('setlocale()' is the alternative); or is threaded and not forbidden to
+ * use them */
+# if defined(HAS_POSIX_2008_LOCALE) && ( ! defined(HAS_SETLOCALE) \
+ || ( defined(USE_LOCALE_THREADS) \
+ && ! defined(NO_POSIX_2008_LOCALE)))
+# define USE_POSIX_2008_LOCALE
+# endif
+
+ /* On threaded builds, use thread-safe locales if they are available and not
+ * forbidden. Availability is when we are using POSIX 2008 locales, or
+ * Windows for quite a few releases now. */
+# if defined(USE_LOCALE_THREADS) && ! defined(NO_THREAD_SAFE_LOCALE)
+# if defined(USE_POSIX_2008_LOCALE) || (defined(WIN32) && defined(_MSC_VER))
# define USE_THREAD_SAFE_LOCALE
# endif
-# ifdef HAS_POSIX_2008_LOCALE
-# define USE_POSIX_2008_LOCALE
-# endif
# endif
# include "perl_langinfo.h" /* Needed for _NL_LOCALE_NAME */
-/* Allow use of glib's undocumented querylocale() equivalent if asked for, and
+/* Allow use of glibc's undocumented querylocale() equivalent if asked for, and
* appropriate */
# ifdef USE_POSIX_2008_LOCALE
# if defined(HAS_QUERYLOCALE) \
@@ -1262,21 +1263,28 @@ violations are fatal.
# endif
# endif
+ /* POSIX 2008 has no means of finding out the current locale without a
+ * querylocale; so must keep track of it ourselves */
# if (defined(USE_POSIX_2008_LOCALE) && ! defined(USE_QUERYLOCALE))
# define USE_PL_CURLOCALES
# endif
-/* Microsoft documentation reads in the change log for VS 2015:
- * "The localeconv function declared in locale.h now works correctly when
- * per-thread locale is enabled. In previous versions of the library, this
- * function would return the lconv data for the global locale, not the
- * thread's locale."
- */
-# if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE) && _MSC_VER < 1900
-# define TS_W32_BROKEN_LOCALECONV
+# if defined(WIN32) && defined(USE_THREAD_SAFE_LOCALE)
+
+ /* Microsoft documentation reads in the change log for VS 2015: "The
+ * localeconv function declared in locale.h now works correctly when
+ * per-thread locale is enabled. In previous versions of the library, this
+ * function would return the lconv data for the global locale, not the
+ * thread's locale." */
+# if _MSC_VER < 1900
+# define TS_W32_BROKEN_LOCALECONV
+# endif
# endif
#endif
+/* end of makedef.pl logic duplication
+ * ========================================================================= */
+
#ifdef PERL_CORE
/* Both typedefs are used in locale.c only, but defined here so that embed.fnc