This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
PATCH: [perl #121930] Bleadperl breaks MDOOTSON/Wx
authorKarl Williamson <khw@cpan.org>
Mon, 4 Aug 2014 22:29:12 +0000 (16:29 -0600)
committerKarl Williamson <khw@cpan.org>
Mon, 11 Aug 2014 14:53:25 +0000 (08:53 -0600)
commitf57000bc399f9b433bfb06a4302f4e773f7f50bb
treebfda99efa3e70e00d1a7e65e7ee2e2e462bafc2e
parent0dd816ae89aab3dba2bf1bd90a0398ae682d0b6f
PATCH: [perl #121930] Bleadperl breaks MDOOTSON/Wx

The root cause of this issue is that XS code or the libraries it calls
is changing the locale behind Perl's back so that the decimal point
character is not a dot.  Version number parsing relies on it being a
dot.

This patch fixes the problem by retrieving the current locale just
before version number parsing, and updating Perl's records if the locale
has changed away from what is expected.  Given accurate records, the
pre-existing call to the STORE_NUMERIC_LOCAL_SET_STANDARD macro will
do what it's supposed to do, and change the locale so that the dot is
the radix character for the version number parsing.

After the parsing is done, the pre-existing call to the
RESTORE_NUMERIC_LOCAL macro will restore properly, but see below

This patch should be suitable for both 5.20.1 and 5.21 (though the SHA-1
value in the porting/customize.dat will have to be adjusted because the
files aren't otherwise identical).  But there is a fundamental
difference between the releases.  In 5.20.X, Perl does not attempt to
keep the radix character a dot at almost all times (though it
initializes things so it is a dot, overriding any environmental settings
to the contrary).  This leads to known non-regression bugs in 5.20
because very little XS code can cope with a non-dot.  To fix this, Perl
has changed the macros in 5.21 so that the result after the
RESTORE_NUMERIC_LOCAL is that the current locale will have a dot.  This
will fix those long-standing bugs where XS code expecting a dot fails
should it be mashed up with modules that change it to something else.
But this will break the relatively few modules that want it the other
way.  So it has been done early in 5.21 to give things a chance to
settle down.

The extra {} braces around the code that calls the macros is because
STORE_NUMERIC_LOCAL_SET_STANDARD declares a variable, and so must be
within the declarations area of a block for C89 compilers.  (I myself
would not write a macro that does this without indicating so in its
name.)
t/porting/customized.dat
vutil.c