@@ -645,7 +645,7 @@ split_second(wideval_t timew, wideval_t *timew_p, VALUE *subsecx_p)
645645}
646646
647647static wideval_t
648- timet2wv (time_t t )
648+ timet2wv (wideint_t t )
649649{
650650#if WIDEVALUE_IS_WIDER
651651 if (TIMET_MIN == 0 ) {
@@ -661,7 +661,7 @@ timet2wv(time_t t)
661661 }
662662 }
663663#endif
664- return v2w ( TIMET2NUM ( t ) );
664+ return WINT2WV ( t );
665665}
666666#define TIMET2WV (t ) timet2wv(t)
667667
@@ -1981,7 +1981,7 @@ time_modify(VALUE time)
19811981}
19821982
19831983static wideval_t
1984- timenano2timew (time_t sec , long nsec )
1984+ timenano2timew (wideint_t sec , long nsec )
19851985{
19861986 wideval_t timew ;
19871987
@@ -2760,9 +2760,9 @@ time_init_parse(rb_execution_context_t *ec, VALUE time, VALUE str, VALUE zone, V
27602760}
27612761
27622762static void
2763- subsec_normalize (time_t * secp , long * subsecp , const long maxsubsec )
2763+ subsec_normalize (wideint_t * secp , long * subsecp , const long maxsubsec )
27642764{
2765- time_t sec = * secp ;
2765+ wideint_t sec = * secp ;
27662766 long subsec = * subsecp ;
27672767 long sec2 ;
27682768
@@ -2794,12 +2794,18 @@ subsec_normalize(time_t *secp, long *subsecp, const long maxsubsec)
27942794#define time_nsec_normalize (secp , nsecp ) subsec_normalize(secp, nsecp, 1000000000)
27952795
27962796static wideval_t
2797- nsec2timew (time_t sec , long nsec )
2797+ nsec2timew (wideint_t sec , long nsec )
27982798{
27992799 time_nsec_normalize (& sec , & nsec );
28002800 return timenano2timew (sec , nsec );
28012801}
28022802
2803+ static wideint_t
2804+ tv2wi (time_t t )
2805+ {
2806+ return (wideint_t )t ;
2807+ }
2808+
28032809static VALUE
28042810time_new_timew (VALUE klass , wideval_t timew )
28052811{
@@ -2813,25 +2819,48 @@ time_new_timew(VALUE klass, wideval_t timew)
28132819 return time ;
28142820}
28152821
2822+ #ifdef rb_time64_new
2823+ #undef rb_time64_new
2824+ static VALUE rb_time64_new (int64_t isec , long usec );
2825+ #endif
28162826VALUE
28172827rb_time_new (time_t sec , long usec )
28182828{
2829+ return rb_time64_new (sec , usec );
2830+ }
2831+
2832+ VALUE
2833+ rb_time64_new (int64_t isec , long usec )
2834+ {
2835+ wideint_t sec = (wideint_t )isec ;
28192836 time_usec_normalize (& sec , & usec );
28202837 return time_new_timew (rb_cTime , timenano2timew (sec , usec * 1000 ));
28212838}
28222839
28232840/* returns localtime time object */
2841+
2842+ #ifdef rb_time64_nano_new
2843+ #undef rb_time64_nano_new
2844+ static VALUE rb_time64_nano_new (int64_t isec , long nsec );
2845+ #endif
28242846VALUE
28252847rb_time_nano_new (time_t sec , long nsec )
28262848{
2849+ return rb_time64_nano_new (sec , nsec );
2850+ }
2851+
2852+ VALUE
2853+ rb_time64_nano_new (int64_t isec , long nsec )
2854+ {
2855+ wideint_t sec = (wideint_t )isec ;
28272856 return time_new_timew (rb_cTime , nsec2timew (sec , nsec ));
28282857}
28292858
28302859VALUE
28312860rb_time_timespec_new (const struct timespec * ts , int offset )
28322861{
28332862 struct time_object * tobj ;
2834- VALUE time = time_new_timew (rb_cTime , nsec2timew (ts -> tv_sec , ts -> tv_nsec ));
2863+ VALUE time = time_new_timew (rb_cTime , nsec2timew (tv2wi ( ts -> tv_sec ) , ts -> tv_nsec ));
28352864
28362865 if (-86400 < offset && offset < 86400 ) { /* fixoff */
28372866 GetTimeval (time , tobj );
0 commit comments