Skip to content

Commit 4e8e93b

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

3 files changed

Lines changed: 32 additions & 7 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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ 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+
VALUE rb_time64_new(int64_t sec, long usec);
6061

6162
/**
6263
* Identical to rb_time_new(), except it accepts the time in nanoseconds
@@ -68,6 +69,7 @@ VALUE rb_time_new(time_t sec, long usec);
6869
* @return An allocated instance of ::rb_cTime.
6970
*/
7071
VALUE rb_time_nano_new(time_t sec, long nsec);
72+
VALUE rb_time64_nano_new(int64_t sec, long nsec);
7173

7274
RBIMPL_ATTR_NONNULL(())
7375
/**

time.c

Lines changed: 29 additions & 6 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) {
@@ -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,42 @@ time_new_timew(VALUE klass, wideval_t timew)
28132819
return time;
28142820
}
28152821

2822+
#undef rb_time64_new
28162823
VALUE
28172824
rb_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
28242840
VALUE
28252841
rb_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

28302853
VALUE
28312854
rb_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

Comments
 (0)