@@ -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 ) {
@@ -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,42 @@ time_new_timew(VALUE klass, wideval_t timew)
28132819 return time ;
28142820}
28152821
2822+ #undef rb_time64_new
28162823VALUE
28172824rb_time_new (time_t sec , long usec )
28182825{
2826+ return rb_time64_new (sec , usec );
2827+ }
2828+
2829+ VALUE
2830+ rb_time64_new (int64_t isec , long usec )
2831+ {
2832+ wideint_t sec = (wideint_t )isec ;
28192833 time_usec_normalize (& sec , & usec );
28202834 return time_new_timew (rb_cTime , timenano2timew (sec , usec * 1000 ));
28212835}
28222836
28232837/* returns localtime time object */
2838+
2839+ #undef rb_time64_nano_new
28242840VALUE
28252841rb_time_nano_new (time_t sec , long nsec )
28262842{
2843+ return rb_time64_nano_new (sec , nsec );
2844+ }
2845+
2846+ VALUE
2847+ rb_time64_nano_new (int64_t isec , long nsec )
2848+ {
2849+ wideint_t sec = (wideint_t )isec ;
28272850 return time_new_timew (rb_cTime , nsec2timew (sec , nsec ));
28282851}
28292852
28302853VALUE
28312854rb_time_timespec_new (const struct timespec * ts , int offset )
28322855{
28332856 struct time_object * tobj ;
2834- VALUE time = time_new_timew (rb_cTime , nsec2timew (ts -> tv_sec , ts -> tv_nsec ));
2857+ VALUE time = time_new_timew (rb_cTime , nsec2timew (tv2wi ( ts -> tv_sec ) , ts -> tv_nsec ));
28352858
28362859 if (-86400 < offset && offset < 86400 ) { /* fixoff */
28372860 GetTimeval (time , tobj );
0 commit comments