Branch: refs/heads/smoke-me/khw-strftime
Home: https://github.com/Perl/perl5
Commit: 6a8ecb0dc9b3c9391227f4217d26ab6f03cf2bef
https://github.com/Perl/perl5/commit/6a8ecb0dc9b3c9391227f4217d26ab6f03cf2bef
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M ext/POSIX/t/posix.t
Log Message:
-----------
posix.t: Properly populate optional fields to strtime
The next commits that fix some bugs showed these were not properly
getting initialized.
Commit: f87d89ab1b2e4c709ad164ce4cac27a6d8f64a51
https://github.com/Perl/perl5/commit/f87d89ab1b2e4c709ad164ce4cac27a6d8f64a51
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M locale.c
Log Message:
-----------
locale.c: Silence unused variable compiler warning
On some systems this was unused. Now that we have C99, we can move the
declaration and some #ifdef's and not declare it unless it is going to
be used.
Commit: d357bb900e9bd395fa69fbc2d561bb10b2884a90
https://github.com/Perl/perl5/commit/d357bb900e9bd395fa69fbc2d561bb10b2884a90
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M locale.c
Log Message:
-----------
locale.c: Slight comment clarification
Commit: 107c2b640c114bd77e1d4ec972f1b9b709c9740c
https://github.com/Perl/perl5/commit/107c2b640c114bd77e1d4ec972f1b9b709c9740c
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M locale.c
Log Message:
-----------
locale.c: ints_to_tm: Fix #if's
tl;dr:
Fixes GH #23878
I botched this in Perl 5.42. These conditional compilation statements
were just plain wrong, causing code to be skipped that should have been
compiled. It only affected the few hours of the year when daylight
savings time is removed, so that the hour value is repeated. We didn't
have a good test for that.
gory details:
libc uses 'struct tm' to hold information about a given instant in
time, containing fields for things like the year, month, hour, etc. The
libc function mktime() is used to normalize the structure, adjusting,
say, an input Nov 31 to be Dec 01.
One of the fields in the structure, 'is_dst', indicates if daylight
savings is in effect, or whether that fact is unknown. If unknown,
mktime() is supposed to calculate the answer and to change 'is_dst'
accordingly. Some implementations appear to always do this calculation
even when the input value says the result is known. Others appear to
honor it.
Some libc implementations have extra fields in 'struct tm'.
Perl has a stripped down version of mktime(), called mini_mktime(),
written by Larry Wall a long time ago. I don't know why. This crippled
version ignores locale and daylight time. It also doesn't know about
the extra fields in 'struct tm' that some implementations have. Nor can
it be extended to know about those fields, as they are dependent on
timezone and daylight time, which it deliberately doesn't consider.
The botched #ifdef's were supposed to compensate for both the extra
fields in the struct and that some libc implementations always
recalculate 'is_dst'.
On systems with these fields, the botched #if's caused only
mini_mktime() to be called. This meant that these extra fields didn't
get populated, and daylight time is never considered to be in effect.
And 'is_dst' does not get changed from the input.
On systems without these fields, the regular libc mktime() would be
called appropriately.
The bottom line is that for the portion of the year when daylight
savings is not in effect, that portion worked properly. The two extra
fields would not be populated, so if some code were to read them, it
would only get the proper values by chance. We got no reports of this.
I attribute that to the fact that the use of these is not portable, so
code wouldn't tend to use them. There are portable ways to access the
information they contain.
Tests were failing for the portions of the year when daylight savings is
in effect; see GH #22351. The code looked correct just reading it (not
seeing the flaw in the #ifdef's), so I assumed that it was an issue in
the libc implementations and instituted a workaround. (I can't now
think of a platform where there hasn't been a problem with a libc with
something regarding locales, so that was a reasonable assumption.)
Among other things (fixed in the next commit), that workaround overrode
the 'is_dst' field after the call to mini_mktime(), so that the value
actually passed to libc strftime() indicated that daylight is in effect.
What happens next depends on the libc strftime() implementation. It
could conceivably itself call mktime() which might choose to override
is_dst to be the correct value, and everything would always work. The
more likely possibility is that it just takes the values in the struct
as-is. Remember that those values on systems with the extra fields were
calculated as if daylight savings wasn't in effect, but now we're
telling strftime() to use those values as if it were in effect. This
is a discrepancy. I'd have to trace through some libc implementations
to understand why this discrepancy seems to not matter except at the
transition time.
But the bottom line is this commit removes that discrepancy, and causes
mktime() to be called appropriately on systems where it wasn't, so
strftime() should now function properly.
Commit: e6bedeac66ee6df331a52d4b0bc78eee3355172a
https://github.com/Perl/perl5/commit/e6bedeac66ee6df331a52d4b0bc78eee3355172a
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M locale.c
Log Message:
-----------
my_strftime(): Properly take daylight savings into account
Because of the bug fixed in the previous commit, this function was
changed in 5.42 to have a work around, which is no longer needed.
Commit: 00cec11b5243461be6250844e7e97e369dfb2be4
https://github.com/Perl/perl5/commit/00cec11b5243461be6250844e7e97e369dfb2be4
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M ext/POSIX/POSIX.xs
M ext/POSIX/lib/POSIX.pm
Log Message:
-----------
POSIX.xs: Properly take daylight savings into account
Because of the bug fixed two commits ago, this function was changed in
5.42 to have a work around, which is no longer needed.
Commit: 15486e5ffda340080f0026f1c69d1d853e1c96b6
https://github.com/Perl/perl5/commit/15486e5ffda340080f0026f1c69d1d853e1c96b6
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M ext/POSIX/t/time.t
Log Message:
-----------
POSIX/t/time.t: Add tests for DST changes
Commit: d71f5fc58fbf42ce3c849701d01ab6afafa22276
https://github.com/Perl/perl5/commit/d71f5fc58fbf42ce3c849701d01ab6afafa22276
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M ext/POSIX/lib/POSIX.pod
M locale.c
Log Message:
-----------
perlapi: Add extensive strftime documentation
Due to the differences in various systems' implementations, I think it
is a good idea to more fully document the vagaries I have discovered,
and how perl resolves them.
Commit: 60a5638005c2f85a0059222a13bad0d97fcd932f
https://github.com/Perl/perl5/commit/60a5638005c2f85a0059222a13bad0d97fcd932f
Author: Karl Williamson <[email protected]>
Date: 2025-12-21 (Sun, 21 Dec 2025)
Changed paths:
M pod/perldelta.pod
Log Message:
-----------
perldelta for GH #23878
Compare: https://github.com/Perl/perl5/compare/edbc70f53244...60a5638005c2
To unsubscribe from these emails, change your notification settings at
https://github.com/Perl/perl5/settings/notifications