Skip to content
This repository was archived by the owner on Jun 1, 2023. It is now read-only.

Commit 7412b39

Browse files
committed
Cpanel-JSON-XS: Update to 3.0237
Relax inf/nan detection for msvcrt.dll vs ucrt.dll runtime versions (it's now almost ANSI). We don't probe for the exact inf/nan stringifications in Makefile.PL, so we try now all variants. Hardcoding the compiler variant doesn't do it in some cases.
1 parent cc1e8a9 commit 7412b39

File tree

9 files changed

+109
-69
lines changed

9 files changed

+109
-69
lines changed

.git-rr-cache

Submodule .git-rr-cache updated 30 files

META.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,5 +142,5 @@
142142
}
143143
},
144144
"version" : "5.027001c",
145-
"x_serialization_backend" : "Cpanel::JSON::XS version 3.0236"
145+
"x_serialization_backend" : "Cpanel::JSON::XS version 3.0237"
146146
}

Porting/Maintainers.pl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,7 @@ package Maintainers;
437437
},
438438

439439
'Cpanel::JSON::XS' => {
440-
'DISTRIBUTION' => 'RURBAN/Cpanel-JSON-XS-3.0236.tar.gz',
440+
'DISTRIBUTION' => 'RURBAN/Cpanel-JSON-XS-3.0237.tar.gz',
441441
'FILES' => q[cpan/Cpanel-JSON-XS],
442442
'EXCLUDED' => [
443443
'.appveyor.yml',

cpan/Cpanel-JSON-XS/XS.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package Cpanel::JSON::XS;
2-
our $VERSION = '3.0236';
2+
our $VERSION = '3.0237';
33
our $XS_VERSION = $VERSION;
44
# $VERSION = eval $VERSION;
55

cpan/Cpanel-JSON-XS/XS.xs

Lines changed: 52 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,20 @@
3636
#define UTF32BOM "\377\376\000\000" /* FF FE 00 00 or +UFEFF */
3737
#define UTF32BOM_BE "\000\000\376\377" /* 00 00 FE FF */
3838

39-
/* strawberry 5.22 with USE_MINGW_ANSI_STDIO and USE_LONG_DOUBLE has now
40-
a proper inf/nan. */
39+
/* mingw with USE_LONG_DOUBLE (and implied USE_MINGW_ANSI_STDIO) do use the
40+
non-msvcrt inf/nan stringification in sprintf(). */
4141
#if defined(WIN32) && !defined(__USE_MINGW_ANSI_STDIO) && !defined(USE_LONG_DOUBLE)
42-
/* TODO: we really need the msvcrt version, not the MSVC version.
43-
strawberry 5.26 uses it also now. */
44-
# if (_MSC_VER > 1800) || (!defined(_MSC_VER) && PERL_VERSION >= 26)
45-
# define STR_INF "inf"
46-
# define STR_INF2 "inf.0"
47-
# define STR_NAN "nan"
48-
# define STR_QNAN "nan(ind)"
49-
# define HAVE_QNAN
50-
# else
51-
# define STR_INF "1.#INF"
52-
# define STR_INF2 "1.#INF.0"
53-
# define STR_NAN "1.#IND"
54-
# define STR_QNAN "1.#QNAN"
55-
# define HAVE_QNAN
56-
# endif
42+
/* new ucrtd.dll runtime? We do not probe the runtime or variants in the Makefile.PL yet. */
43+
#define STR_INF "inf"
44+
#define STR_INF2 "inf.0"
45+
#define STR_NAN "nan"
46+
#define STR_QNAN "nan(ind)"
47+
/* old standard msvcrt.dll */
48+
#define STR_INF3 "1.#INF"
49+
#define STR_INF4 "1.#INF.0"
50+
#define STR_NAN2 "1.#IND"
51+
#define STR_QNAN2 "1.#QNAN"
52+
#define HAVE_QNAN
5753
#elif defined(sun) || defined(__sun)
5854
#define STR_INF "Infinity"
5955
#define STR_NAN "NaN"
@@ -1405,9 +1401,9 @@ encode_sv (pTHX_ enc_t *enc, SV *sv)
14051401
# else
14061402
if (UNLIKELY(isinf(nv) || isnan(nv)))
14071403
# endif
1408-
{
1409-
goto is_inf_or_nan;
1410-
}
1404+
{
1405+
goto is_inf_or_nan;
1406+
}
14111407
}
14121408
#endif
14131409
#ifdef USE_QUADMATH
@@ -1416,12 +1412,18 @@ encode_sv (pTHX_ enc_t *enc, SV *sv)
14161412
(void)Gconvert (nv, NV_DIG, 0, enc->cur);
14171413
#endif
14181414

1415+
#ifdef STR_INF4
1416+
if (UNLIKELY(strEQc(enc->cur, STR_INF)
1417+
|| strEQc(enc->cur, STR_INF2)
1418+
|| strEQc(enc->cur, STR_INF3)
1419+
|| strEQc(enc->cur, STR_INF4)))
1420+
#elif STR_INF2
1421+
if (UNLIKELY(strEQc(enc->cur, STR_INF)
1422+
|| strEQc(enc->cur, STR_INF2)))
1423+
#else
14191424
if (UNLIKELY(strEQc(enc->cur, STR_INF)))
1420-
inf_or_nan = 1;
1421-
#ifdef STR_INF2
1422-
else if (UNLIKELY(strEQc(enc->cur, STR_INF2)))
1423-
inf_or_nan = 1;
14241425
#endif
1426+
inf_or_nan = 1;
14251427
#if defined(__hpux)
14261428
else if (UNLIKELY(strEQc(enc->cur, STR_NEG_INF)))
14271429
inf_or_nan = 2;
@@ -1430,23 +1432,43 @@ encode_sv (pTHX_ enc_t *enc, SV *sv)
14301432
#endif
14311433
else if
14321434
#ifdef HAVE_QNAN
1435+
# ifdef STR_QNAN2
1436+
(UNLIKELY(strEQc(enc->cur, STR_NAN)
1437+
|| strEQc(enc->cur, STR_QNAN)
1438+
|| strEQc(enc->cur, STR_NAN2)
1439+
|| strEQc(enc->cur, STR_QNAN2)))
1440+
# else
14331441
(UNLIKELY(strEQc(enc->cur, STR_NAN)
14341442
|| strEQc(enc->cur, STR_QNAN)))
1443+
# endif
14351444
#else
14361445
(UNLIKELY(strEQc(enc->cur, STR_NAN)))
14371446
#endif
14381447
inf_or_nan = 3;
14391448
else if (*enc->cur == '-') {
1449+
#ifdef STR_INF4
1450+
if (UNLIKELY(strEQc(enc->cur+1, STR_INF)
1451+
|| strEQc(enc->cur+1, STR_INF2)
1452+
|| strEQc(enc->cur+1, STR_INF3)
1453+
|| strEQc(enc->cur+1, STR_INF4)))
1454+
#elif STR_INF2
1455+
if (UNLIKELY(strEQc(enc->cur+1, STR_INF)
1456+
|| strEQc(enc->cur+1, STR_INF2)))
1457+
#else
14401458
if (UNLIKELY(strEQc(enc->cur+1, STR_INF)))
1441-
inf_or_nan = 2;
1442-
#ifdef STR_INF2
1443-
else if (UNLIKELY(strEQc(enc->cur+1, STR_INF2)))
1444-
inf_or_nan = 2;
14451459
#endif
1460+
inf_or_nan = 2;
14461461
else if
14471462
#ifdef HAVE_QNAN
1463+
# ifdef STR_QNAN2
1464+
(UNLIKELY(strEQc(enc->cur+1, STR_NAN)
1465+
|| strEQc(enc->cur+1, STR_QNAN)
1466+
|| strEQc(enc->cur+1, STR_NAN2)
1467+
|| strEQc(enc->cur+1, STR_QNAN2)))
1468+
# else
14481469
(UNLIKELY(strEQc(enc->cur+1, STR_NAN)
14491470
|| strEQc(enc->cur+1, STR_QNAN)))
1471+
# endif
14501472
#else
14511473
(UNLIKELY(strEQc(enc->cur+1, STR_NAN)))
14521474
#endif
@@ -1475,7 +1497,8 @@ encode_sv (pTHX_ enc_t *enc, SV *sv)
14751497
strncpy(enc->cur, "\"nan\"\0", 6);
14761498
}
14771499
else if (enc->json.infnan_mode != 2) {
1478-
croak ("invalid stringify_infnan mode %c. Must be 0, 1, 2 or 3", enc->json.infnan_mode);
1500+
croak ("invalid stringify_infnan mode %c. Must be 0, 1, 2 or 3",
1501+
enc->json.infnan_mode);
14791502
}
14801503
}
14811504
if (SvPOKp (sv) && !strEQ(enc->cur, SvPVX (sv))) {

cpan/Cpanel-JSON-XS/t/117_numbers.t

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ is encode_json([9**9**9/9**9**9]), '[null]', "-nan -> null";
1616
my $json = Cpanel::JSON::XS->new->stringify_infnan;
1717
my $have_qnan = ($^O eq 'MSWin32' || $^O eq 'aix') ? 1 : 0;
1818
# TODO dec_osf
19+
# variants as in t/op/infnan.t
20+
my (@inf, @neg_inf, @nan, @neg_nan);
1921
my ($inf, $nan) =
2022
($^O eq 'MSWin32') ? ('1.#INF','1.#QNAN') :
2123
($^O eq 'solaris') ? ('Infinity','NaN') :
@@ -30,57 +32,71 @@ my $neg_inf =
3032
($^O eq 'hpux') ? "---" :
3133
"-".$inf;
3234

33-
if ($^O eq 'MSWin32'
34-
and $Config{ccflags} =~ /-D__USE_MINGW_ANSI_STDIO/
35-
and $Config{uselongdouble})
36-
{
35+
if ($^O eq 'MSWin32' and $Config{ccflags} =~ /-D__USE_MINGW_ANSI_STDIO/) {
3736
$have_qnan = 0;
3837
($inf, $neg_inf, $nan, $neg_nan) = ('inf','-inf','nan','-nan');
38+
@inf = ($inf);
39+
@neg_inf = ($neg_inf);
40+
@nan = ($nan);
41+
@neg_nan = ($neg_nan);
3942
}
40-
if ($^O eq 'MSWin32'
41-
and $Config{cc} eq 'gcc'
42-
and $] >= 5.026) # updated strawberry
43-
{
44-
$have_qnan = 0;
43+
elsif ($^O eq 'MSWin32') { # new ucrtd.dll
4544
($inf, $neg_inf, $nan, $neg_nan) = ('inf','-inf','nan','-nan');
46-
}
47-
# Windows changed it with MSVC 14.0 and the ucrtd.dll runtime
48-
diag "ccversion = $Config{ccversion}" if $^O eq 'MSWin32' and $Config{ccversion};
49-
if ($^O eq 'MSWin32' and $Config{ccversion}) {
50-
my $mscver = $Config{ccversion}; # "19.00.24215.1" for 14.0 (VC++ 2015)
51-
$mscver =~ s/^(\d+\.\d\+).(\d+)\.(\d+)/$1$2$3/;
52-
if ($mscver >= 19.0) {
53-
$have_qnan = 0;
54-
($inf, $neg_inf, $nan, $neg_nan) = ('inf','-inf','nan','-nan(ind)');
55-
}
45+
@inf = ('1.#INF', 'inf');
46+
@neg_inf = ('-1.#INF', '-inf');
47+
@nan = ('1.#QNAN', 'nan');
48+
@neg_nan = ('-1.#IND', '-nan', '-nan(ind)');
49+
} else {
50+
@inf = ($inf);
51+
@neg_inf = ($neg_inf);
52+
@nan = ($nan);
53+
@neg_nan = ($neg_nan);
5654
}
5755
# newlib and glibc 2.5 have no -nan support, just nan. The BSD's neither, but they might
5856
# come up with it lateron, as darwin did.
5957
#if ($^O eq 'cygwin' or ($Config{glibc_version} && $Config{glibc_version} < 2.6)) {
6058
# $neg_nan = $nan;
6159
#}
6260

61+
sub match {
62+
my ($r, $tmpl, $desc, @list) = @_;
63+
my $match = shift @list;
64+
my $m = $tmpl;
65+
$m =~ s/__XX__/$match/;
66+
$match = $m;
67+
for my $m1 (@list) { # at least one must match
68+
$m = $tmpl;
69+
$m =~ s/__XX__/$m1/;
70+
diag "try $m eq $r" if $ENV{TEST_VERBOSE};
71+
$match = $m if $r eq $m;
72+
}
73+
is $r, $match, $desc;
74+
}
75+
6376
my $r = $json->encode([9**9**9]);
6477
$r =~ s/\.0$// if $^O eq 'MSWin32';
65-
is $r, "[\"$inf\"]", "inf -> \"inf\" stringify_infnan(1)";
78+
match($r, "[\"__XX__\"]", "inf -> \"inf\" stringify_infnan(1)", @inf);
79+
6680
$r = $json->encode([-9**9**9]);
6781
$r =~ s/\.0$// if $^O eq 'MSWin32';
68-
is $r, "[\"$neg_inf\"]", "-inf -> \"-inf\"";
82+
match($r, "[\"__XX__\"]", "-inf -> \"-inf\"", @neg_inf);
83+
6984
# The concept of negative nan is not portable and varies too much.
7085
# Windows even emits neg_nan for the first test sometimes. HP-UX has all tests reverse.
71-
like $json->encode([-sin(9**9**9)]), qr/\[\"(\Q$neg_nan\E|\Q$nan\E)\"\]/, "nan -> \"nan\"";
72-
like $json->encode([sin(9**9**9)]), qr/\[\"(\Q$neg_nan\E|\Q$nan\E)\"\]/, "-nan -> \"-nan\"";
73-
like $json->encode([9**9**9/9**9**9]), qr/\[\"(\Q$neg_nan\E|\Q$nan\E)\"\]/, "-nan -> \"-nan\"";
86+
match($json->encode([-sin(9**9**9)]), "[\"__XX__\"]", "nan -> \"nan\"", @nan, @neg_nan);
87+
match($json->encode([sin(9**9**9)]), "[\"__XX__\"]", "-nan -> \"-nan\"", @nan, @neg_nan);
88+
match($json->encode([9**9**9/9**9**9]), "[\"__XX__\"]", "-nan -> \"-nan\"", @nan, @neg_nan);
7489

7590
# infnan_mode = 2: # inf/nan values, as in JSON::XS and older releases.
7691
$json = Cpanel::JSON::XS->new->stringify_infnan(2);
77-
is $json->encode([9**9**9]), "[$inf]", "inf stringify_infnan(2)";
78-
is $json->encode([-9**9**9]), "[$neg_inf]", "-inf";
79-
like $json->encode([-sin(9**9**9)]), qr/\[(\Q$neg_nan\E|\Q$nan\E)\]/, "nan";
80-
like $json->encode([sin(9**9**9)]), qr/\[(\Q$neg_nan\E|\Q$nan\E)\]/, "-nan";
81-
like $json->encode([9**9**9/9**9**9]), qr/\[(\Q$neg_nan\E|\Q$nan\E)\]/, "-nan";
92+
match($json->encode([9**9**9]), "[__XX__]", "inf stringify_infnan(2)", @inf);
93+
match($json->encode([-9**9**9]), "[__XX__]", "-inf", @neg_inf);
94+
match($json->encode([-sin(9**9**9)]), "[__XX__]", "nan", @nan, @neg_nan);
95+
match($json->encode([sin(9**9**9)]), "[__XX__]", "-nan", @nan, @neg_nan);
96+
match($json->encode([9**9**9/9**9**9]), "[__XX__]", "-nan", @nan, @neg_nan);
8297

83-
# infnan_mode = 3: # inf/nan values unified to inf/-inf/nan strings. no qnan/snan/negative nan
98+
# infnan_mode = 3:
99+
# inf/nan values unified to inf/-inf/nan strings. no qnan/snan/negative nan
84100
$json = Cpanel::JSON::XS->new->stringify_infnan(3);
85101
is $json->encode([9**9**9]), '["inf"]', "inf stringify_infnan(3)";
86102
is $json->encode([-9**9**9]), '["-inf"]', "-inf";

dist/Module-CoreList/lib/Module/CoreList.pm

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15013,14 +15013,14 @@ our %delta = (
1501315013
delta_from => '5.027000c',
1501415014
changed => {
1501515015
'Config' => '5.027001',
15016-
'Module::CoreList' => '5.20170518c',
15017-
'Module::CoreList::Utils'=> '5.20170518c',
15016+
'Module::CoreList' => '5.20170714c',
15017+
'Module::CoreList::Utils'=> '5.20170714c',
1501815018
'attributes' => '1.12c',
1501915019
'B' => '1.68_08',
1502015020
'B::C' => '1.55_04',
1502115021
'B::Debug' => '1.25',
1502215022
'base' => '2.26c',
15023-
'Cpanel::JSON::XS' => '3.0236',
15023+
'Cpanel::JSON::XS' => '3.0237',
1502415024
'deprecate' => '0.03_01',
1502515025
'Devel::Peek' => '1.26_02',
1502615026
'Devel::PPPort' => '3.36_02',

pod/perlcdelta.pod

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,15 +236,16 @@ The problem is the new sub as :method warning with classes, which
236236
would cause all Test::Simple methods to be declared as :method, as they
237237
derive from base.
238238

239-
=item L<Cpanel::JSON::XS> 3.0236
239+
=item L<Cpanel::JSON::XS> 3.0237
240240

241241
Stringify true again as "1".
242242
Disallow duplicate keys by default, only allow them in relaxed mode.
243243
De-fragilize t/96_mojo.t false test to "". It mostly is.
244244
Fix and unify utf8 handling with 5.6.2 and improve many utf8 tests.
245245
Add tests for boolean sv_yes and sv_no.
246246
Check for correct module in %INC.
247-
Fix inf/nan for strawberry 5.26.
247+
Relax inf/nan detection for newer msvcrt.dll runtime versions
248+
(it's now almost ANSI).
248249

249250
=item L<Devel::Peek> 1.26_02
250251

t/porting/customized.dat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ Math::BigInt cpan/Math-BigInt/t/upgrade.t 7c15cac7f321ca396648ec45da6389a1283e15
100100
Math::BigInt cpan/Math-BigInt/t/upgradef.t 06610e9883ce805bcd6543ab959a9826f598eb40
101101
Math::BigInt cpan/Math-BigInt/t/with_sub.t c040328e223df6f56250f5d67dcb2c9a2f23c110
102102
Memoize cpan/Memoize/t/expmod_t.t 9386100cd9c95a0e8a4e001bba3aa52eec114d21
103-
Module::CoreList dist/Module-CoreList/lib/Module/CoreList.pm b8efb510da582db003521b06f02005760b7b951d
103+
Module::CoreList dist/Module-CoreList/lib/Module/CoreList.pm 66b1c65cc3b6818c7f9022d61599159f4f10659c
104104
Module::CoreList dist/Module-CoreList/lib/Module/CoreList/Utils.pm d013ed514d49e14ac007743cb5b05fc2a624a321
105105
Module::Metadata cpan/Module-Metadata/t/lib/GeneratePackage.pm 502ffbe2609947430e6aa1a3df8064b3fef3e086
106106
Net::Domain cpan/libnet/lib/Net/Cmd.pm 70a007c38833667ad47ea8059c37c1b7d1c77b6c

0 commit comments

Comments
 (0)