Skip to content

Commit 7aae732

Browse files
committed
std: change time::timeval to be {sec: i64, usec: i32}.
It's possible to have negative times if expressing time before 1970, so we should use signed types. Other platforms can return times at a higher resolution, so we should use 64 bits.
1 parent 12d3d4f commit 7aae732

File tree

3 files changed

+11
-11
lines changed

3 files changed

+11
-11
lines changed

src/libstd/time.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
#[abi = "cdecl"]
22
native mod rustrt {
3-
fn get_time(&sec: u32, &usec: u32);
3+
fn get_time(&sec: i64, &usec: i32);
44
fn precise_time_ns(&ns: u64);
55
}
66

77
#[doc = "A record specifying a time value in seconds and microseconds."]
8-
type timeval = {sec: u32, usec: u32};
8+
type timeval = {sec: i64, usec: i32};
99

1010
#[doc = "
1111
Returns the current time as a `timeval` containing the seconds and
1212
microseconds since 1970-01-01T00:00:00Z.
1313
"]
1414
fn get_time() -> timeval {
15-
let mut sec = 0u32;
16-
let mut usec = 0u32;
15+
let mut sec = 0i64;
16+
let mut usec = 0i32;
1717
rustrt::get_time(sec, usec);
1818
ret {sec: sec, usec: usec};
1919
}
@@ -42,23 +42,23 @@ mod tests {
4242

4343
#[test]
4444
fn test_get_time() {
45-
const some_recent_date: u32 = 1325376000u32; // 2012-01-01T00:00:00Z
46-
const some_future_date: u32 = 1577836800u32; // 2020-01-01T00:00:00Z
45+
const some_recent_date: i64 = 1325376000i64; // 2012-01-01T00:00:00Z
46+
const some_future_date: i64 = 1577836800i64; // 2020-01-01T00:00:00Z
4747

4848
let tv1 = get_time();
4949
log(debug, "tv1=" + uint::str(tv1.sec as uint) + " sec + "
5050
+ uint::str(tv1.usec as uint) + " usec");
5151

5252
assert tv1.sec > some_recent_date;
53-
assert tv1.usec < 1000000u32;
53+
assert tv1.usec < 1000000i32;
5454

5555
let tv2 = get_time();
5656
log(debug, "tv2=" + uint::str(tv2.sec as uint) + " sec + "
5757
+ uint::str(tv2.usec as uint) + " usec");
5858

5959
assert tv2.sec >= tv1.sec;
6060
assert tv2.sec < some_future_date;
61-
assert tv2.usec < 1000000u32;
61+
assert tv2.usec < 1000000i32;
6262
if tv2.sec == tv1.sec {
6363
assert tv2.usec >= tv1.usec;
6464
}

src/rt/rust_builtin.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,7 @@ rust_ptr_eq(type_desc *t, rust_box *a, rust_box *b) {
408408

409409
#if defined(__WIN32__)
410410
extern "C" CDECL void
411-
get_time(uint32_t *sec, uint32_t *usec) {
411+
get_time(int64_t *sec, int32_t *usec) {
412412
FILETIME fileTime;
413413
GetSystemTimeAsFileTime(&fileTime);
414414

@@ -427,7 +427,7 @@ get_time(uint32_t *sec, uint32_t *usec) {
427427
}
428428
#else
429429
extern "C" CDECL void
430-
get_time(uint32_t *sec, uint32_t *usec) {
430+
get_time(int64_t *sec, int32_t *usec) {
431431
struct timeval tv;
432432
gettimeofday(&tv, NULL);
433433
*sec = tv.tv_sec;

src/rustc/middle/trans/base.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4056,7 +4056,7 @@ fn trans_fn(ccx: @crate_ctxt,
40564056
id: ast::node_id) {
40574057
let do_time = ccx.sess.opts.stats;
40584058
let start = if do_time { time::get_time() }
4059-
else { {sec: 0u32, usec: 0u32} };
4059+
else { {sec: 0i64, usec: 0i32} };
40604060
let _icx = ccx.insn_ctxt("trans_fn");
40614061
trans_closure(ccx, path, decl, body, llfndecl, ty_self,
40624062
param_substs, id, {|fcx|

0 commit comments

Comments
 (0)