Integrate:
authorJan Dubois <jand@activestate.com>
Thu, 20 Dec 2007 10:18:52 +0000 (02:18 -0800)
committerNicholas Clark <nick@ccl4.org>
Mon, 3 Nov 2008 11:30:44 +0000 (11:30 +0000)
[ 32728]
Subject:  [PATCH] 64-bit fix for Time::Local
From: "Jan Dubois" <jand@activestate.com>
Message-ID: <044301c84334$c6aa2960$53fe7c20$@com>

[ 34699]
Upgrade to Time::Local 1.1901.
p4raw-link: @34699 on //depot/perl: 65d4ed585fc0b0724434037c49c7631adb1617ac
p4raw-link: @32728 on //depot/perl: d374f9c73e6118631558f80521fa3b0f1c61fb3a

p4raw-id: //depot/maint-5.10/perl@34704
p4raw-integrated: from //depot/perl@34692 'copy in' lib/Time/Local.t
(@29994..) lib/Time/Local.pm (@32728..)

lib/Time/Local.pm
lib/Time/Local.t

index 764e27e..1eb0a02 100644 (file)
@@ -7,7 +7,7 @@ use strict;
 use integer;
 
 use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK );
-$VERSION   = '1.18';
+$VERSION   = '1.1901';
 
 @ISA       = qw( Exporter );
 @EXPORT    = qw( timegm timelocal );
@@ -29,17 +29,17 @@ use constant SECS_PER_MINUTE => 60;
 use constant SECS_PER_HOUR   => 3600;
 use constant SECS_PER_DAY    => 86400;
 
-my $MaxInt = ( ( 1 << ( 8 * $Config{intsize} - 2 ) ) -1 ) * 2 + 1;
-my $MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1;
-
+my $MaxInt;
 if ( $^O eq 'MacOS' ) {
     # time_t is unsigned...
-    $MaxInt = ( 1 << ( 8 * $Config{intsize} ) ) - 1;
+    $MaxInt = ( 1 << ( 8 * $Config{ivsize} ) ) - 1;
 }
 else {
-    $MaxInt = ( ( 1 << ( 8 * $Config{intsize} - 2 ) ) - 1 ) * 2 + 1;
+    $MaxInt = ( ( 1 << ( 8 * $Config{ivsize} - 2 ) ) - 1 ) * 2 + 1;
 }
 
+my $MaxDay = int( ( $MaxInt - ( SECS_PER_DAY / 2 ) ) / SECS_PER_DAY ) - 1;
+
 # Determine the EPOC day for this machine
 my $Epoc = 0;
 if ( $^O eq 'vos' ) {
@@ -68,7 +68,7 @@ sub _daygm {
     return $_[3] + (
         $Cheat{ pack( 'ss', @_[ 4, 5 ] ) } ||= do {
             my $month = ( $_[4] + 10 ) % 12;
-            my $year  = $_[5] + 1900 - $month / 10;
+            my $year  = ( $_[5] + 1900 ) - ( $month / 10 );
 
             ( ( 365 * $year )
               + ( $year / 4 )
@@ -99,12 +99,6 @@ sub timegm {
     }
 
     unless ( $Options{no_range_check} ) {
-        if ( abs($year) >= 0x7fff ) {
-            $year += 1900;
-            croak
-                "Cannot handle date ($sec, $min, $hour, $mday, $month, *$year*)";
-        }
-
         croak "Month '$month' out of range 0..11"
             if $month > 11
             or $month < 0;
index 22138cf..4f8674f 100755 (executable)
@@ -9,6 +9,7 @@ BEGIN {
 
 use strict;
 
+use Config;
 use Test::More;
 use Time::Local;
 
@@ -73,13 +74,13 @@ if ($^O eq 'VMS') {
     $neg_epoch_ok = 0; # time_t is unsigned
 }
 
+my $epoch_is_64 = eval { $Config{ivsize} == 8 && ( gmtime 2**40 )[5] == 34912 };
+
 my $tests = (@time * 12);
 $tests += @neg_time * 12;
 $tests += @bad_time;
 $tests += @years;
-$tests += 10;
-$tests += 2 if $ENV{PERL_CORE};
-$tests += 8 if $ENV{MAINTAINER};
+$tests += 23;
 
 plan tests => $tests;
 
@@ -192,7 +193,24 @@ SKIP:
     is($@, '', 'no error with leap day of 1996 (year passed as 96)');
 }
 
-if ($ENV{MAINTAINER}) {
+SKIP:
+{
+    skip 'These tests require a system with 64-bit time_t.', 3
+        unless $epoch_is_64;
+
+    is( timegm( 8, 14, 3, 19, 0, ( 1900 + 138 ) ), 2**31,
+        'can call timegm for 2**31 epoch seconds' );
+    is( timegm( 16, 28, 6, 7, 1, ( 1900 + 206 ) ), 2**32,
+        'can call timegm for 2**32 epoch seconds (on a 64-bit system)' );
+    is( timegm( 16, 36, 0, 20, 1, ( 34912 + 1900 ) ), 2**40,
+        'can call timegm for 2**40 epoch seconds (on a 64-bit system)' );
+}
+
+SKIP:
+{
+    skip 'These tests only run for the package maintainer.', 8
+        unless $ENV{MAINTAINER};
+
     require POSIX;
 
     local $ENV{TZ} = 'Europe/Vienna';
@@ -246,14 +264,20 @@ if ($ENV{MAINTAINER}) {
         'hour is 2 when given 2:00 AM on Europe/London date change' );
 }
 
-if ($ENV{PERL_CORE}) {
-  package test;
-  require 'timelocal.pl';
+SKIP:
+{
+    skip 'These tests are only run when $ENV{PERL_CORE} is true.', 2
+        unless $ENV{PERL_CORE};
+
+    {
+        package test;
+        require 'timelocal.pl';
 
-  # need to get ok() from main package
-  ::is(timegm(0,0,0,1,0,80), main::timegm(0,0,0,1,0,80),
-     'timegm in timelocal.pl');
+        # need to get ok() from main package
+        ::is(timegm(0,0,0,1,0,80), main::timegm(0,0,0,1,0,80),
+             'timegm in timelocal.pl');
 
-  ::is(timelocal(1,2,3,4,5,88), main::timelocal(1,2,3,4,5,88),
-     'timelocal in timelocal.pl');
+        ::is(timelocal(1,2,3,4,5,88), main::timelocal(1,2,3,4,5,88),
+             'timelocal in timelocal.pl');
+    }
 }