Skip to content

Commit 207bc5c

Browse files
committed
Introduce APIs to make a Time object from 64bit time_t
1 parent 868bf8e commit 207bc5c

3 files changed

Lines changed: 47 additions & 8 deletions

File tree

file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -982,7 +982,7 @@ statx_atimespec(const rb_io_stat_data *st)
982982
static VALUE
983983
stat_time(const stat_timestamp ts)
984984
{
985-
return rb_time_nano_new(ts.tv_sec, ts.tv_nsec);
985+
return rb_time64_nano_new(ts.tv_sec, ts.tv_nsec);
986986
}
987987

988988
static VALUE

include/ruby/internal/intern/time.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ void rb_timespec_now(struct timespec *ts);
5757
* @return An allocated instance of ::rb_cTime.
5858
*/
5959
VALUE rb_time_new(time_t sec, long usec);
60+
#if (SIZEOF_INT64_T <= SIZEOF_TIME_T) && defined(NEGATIVE_TIME_T)
61+
# define rb_time64_new rb_time_new
62+
#else
63+
VALUE rb_time64_new(int64_t sec, long usec);
64+
#endif
6065

6166
/**
6267
* Identical to rb_time_new(), except it accepts the time in nanoseconds
@@ -68,6 +73,11 @@ VALUE rb_time_new(time_t sec, long usec);
6873
* @return An allocated instance of ::rb_cTime.
6974
*/
7075
VALUE rb_time_nano_new(time_t sec, long nsec);
76+
#if (SIZEOF_INT64_T <= SIZEOF_TIME_T) && defined(NEGATIVE_TIME_T)
77+
# define rb_time64_nano_new rb_time_nano_new
78+
#else
79+
VALUE rb_time64_nano_new(int64_t sec, long nsec);
80+
#endif
7181

7282
RBIMPL_ATTR_NONNULL(())
7383
/**

time.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ split_second(wideval_t timew, wideval_t *timew_p, VALUE *subsecx_p)
645645
}
646646

647647
static 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

19831983
static 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

27622762
static 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

27962796
static 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+
28032809
static VALUE
28042810
time_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
28162826
VALUE
28172827
rb_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
28242846
VALUE
28252847
rb_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

28302859
VALUE
28312860
rb_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

Comments
 (0)