From cb65c9dad6ed8fcccccc15440dcec2c4dca5e3e4 Mon Sep 17 00:00:00 2001 From: Mackenzie Clark Date: Thu, 27 Dec 2018 09:41:29 -0800 Subject: [PATCH] refactor localtime functions to use time crate lint fixes --- build/emtests.rs | 3 +- emtests/localtime.c | 13 +++----- emtests/localtime.output | 1 + emtests/localtime.wasm | Bin 45695 -> 45590 bytes src/apis/emscripten/time.rs | 57 +++++++++++++----------------------- src/emtests/localtime.rs | 9 ++++++ src/emtests/mod.rs | 1 + 7 files changed, 38 insertions(+), 46 deletions(-) create mode 100644 emtests/localtime.output create mode 100644 src/emtests/localtime.rs diff --git a/build/emtests.rs b/build/emtests.rs index 591be871b..5dc3225e3 100644 --- a/build/emtests.rs +++ b/build/emtests.rs @@ -11,11 +11,12 @@ use std::process::Command; static BANNER: &str = "// Rust test file autogenerated with cargo build (build/emtests.rs). // Please do NOT modify it by hand, as it will be reseted on next build.\n"; -const TESTS: [&str; 4] = [ +const TESTS: [&str; 5] = [ "emtests/env.c", "emtests/puts.c", "emtests/printf.c", "emtests/clock_gettime.c", + "emtests/localtime.c", ]; pub fn compile(file: &str) -> String { diff --git a/emtests/localtime.c b/emtests/localtime.c index 9dffefd9b..a2ad4162c 100644 --- a/emtests/localtime.c +++ b/emtests/localtime.c @@ -2,19 +2,14 @@ #include int main (int argc, char *argv[]) { - printf("Hello wasmer!\n"); time_t rawtime; struct tm *info; - char buffer[80]; - time( &rawtime ); - info = localtime( &rawtime ); - - printf("Almost!\n"); - printf("Current local time and date: %s\n", asctime(info)); - printf("Done!\n"); - + struct tm info2; + time (&rawtime ); + struct tm *p = localtime_r(&rawtime, &info2); + printf("localtime\n"); return(0); } diff --git a/emtests/localtime.output b/emtests/localtime.output new file mode 100644 index 000000000..826f3db8a --- /dev/null +++ b/emtests/localtime.output @@ -0,0 +1 @@ +localtime diff --git a/emtests/localtime.wasm b/emtests/localtime.wasm index b8641411ec0e528fe9628a3c5b0a964d75175d93..1da0cd5a9b84dbb56c4049ff999b4df06632e314 100644 GIT binary patch delta 3936 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 diff --git a/src/apis/emscripten/time.rs b/src/apis/emscripten/time.rs index 614a38540..43c709089 100644 --- a/src/apis/emscripten/time.rs +++ b/src/apis/emscripten/time.rs @@ -74,17 +74,15 @@ pub extern "C" fn _difftime(t0: u32, t1: u32) -> c_int { #[repr(C)] struct guest_tm { - pub tm_sec: c_int, // 0 - pub tm_min: c_int, // 4 - pub tm_hour: c_int, // 8 - pub tm_mday: c_int, // 12 - pub tm_mon: c_int, // 16 - pub tm_year: c_int, // 20 - pub tm_wday: c_int, // 24 - pub tm_yday: c_int, // 28 - pub tm_isdst: c_int, // 32 - pub tm_gmtoff: c_int, // 36 - pub tm_zone: c_int, // 40 + pub tm_sec: c_int, // 0 + pub tm_min: c_int, // 4 + pub tm_hour: c_int, // 8 + pub tm_mday: c_int, // 12 + pub tm_mon: c_int, // 16 + pub tm_year: c_int, // 20 + pub tm_wday: c_int, // 24 + pub tm_yday: c_int, // 28 + pub tm_isdst: c_int, // 32 } /// emscripten: _tvset @@ -155,21 +153,24 @@ pub extern "C" fn _localtime(time_p: u32, instance: &mut Instance) -> c_int { // NOTE: emscripten seems to want tzset() called in this function // https://stackoverflow.com/questions/19170721/real-time-awareness-of-timezone-change-in-localtime-vs-localtime-r + let timespec = unsafe { + let mut time_p_addr = instance.memory_offset_addr(0, time_p as _) as *mut i64; + let seconds = *time_p_addr.clone(); + time::Timespec::new(seconds, 0) + }; + let result_tm = time::at(timespec); + unsafe { - let time_p_addr = instance.memory_offset_addr(0, time_p as _) as *mut i64; - let result_tm = &*localtime(time_p_addr); let tm_struct_offset = (instance.emscripten_data.as_ref().unwrap().malloc)( mem::size_of::() as _, instance, ); - let tm_struct_ptr = instance.memory_offset_addr(0, tm_struct_offset as _) as *mut guest_tm; // debug!( // ">>>>>>> time = {}, {}, {}, {}, {}, {}, {}, {}", // result_tm.tm_sec, result_tm.tm_min, result_tm.tm_hour, result_tm.tm_mday, // result_tm.tm_mon, result_tm.tm_year, result_tm.tm_wday, result_tm.tm_yday, // ); - (*tm_struct_ptr).tm_sec = result_tm.tm_sec; (*tm_struct_ptr).tm_min = result_tm.tm_min; (*tm_struct_ptr).tm_hour = result_tm.tm_hour; @@ -179,8 +180,6 @@ pub extern "C" fn _localtime(time_p: u32, instance: &mut Instance) -> c_int { (*tm_struct_ptr).tm_wday = result_tm.tm_wday; (*tm_struct_ptr).tm_yday = result_tm.tm_yday; (*tm_struct_ptr).tm_isdst = result_tm.tm_isdst; - (*tm_struct_ptr).tm_gmtoff = result_tm.tm_gmtoff as i32; - (*tm_struct_ptr).tm_zone = copy_cstr_into_wasm(instance, result_tm.tm_zone) as i32; tm_struct_offset as _ } @@ -194,30 +193,18 @@ pub extern "C" fn _localtime_r(time_p: u32, result: u32, instance: &mut Instance unsafe { let time_p_addr = instance.memory_offset_addr(0, time_p as _) as *mut i64; - let result_addr = instance.memory_offset_addr(0, result as _) as *mut guest_tm; + let seconds = *time_p_addr.clone(); + let timespec = time::Timespec::new(seconds, 0); + let result_tm = time::at(timespec); - let mut result_tm = tm { - tm_sec: (*result_addr).tm_sec, - tm_min: (*result_addr).tm_min, - tm_hour: (*result_addr).tm_hour, - tm_mday: (*result_addr).tm_mday, - tm_mon: (*result_addr).tm_mon, - tm_year: (*result_addr).tm_year, - tm_wday: (*result_addr).tm_wday, - tm_yday: (*result_addr).tm_yday, - tm_isdst: (*result_addr).tm_isdst, - tm_gmtoff: (*result_addr).tm_gmtoff as _, - tm_zone: instance.memory_offset_addr(0, (*result_addr).tm_zone as _) as _, - }; - - localtime_r(time_p_addr, &mut result_tm); - // let tm_struct = result_tm; // debug!( // ">>>>>>> time = {}, {}, {}, {}, {}, {}, {}, {}", // result_tm.tm_sec, result_tm.tm_min, result_tm.tm_hour, result_tm.tm_mday, // result_tm.tm_mon, result_tm.tm_year, result_tm.tm_wday, result_tm.tm_yday, // ); + let result_addr = instance.memory_offset_addr(0, result as _) as *mut guest_tm; + (*result_addr).tm_sec = result_tm.tm_sec; (*result_addr).tm_min = result_tm.tm_min; (*result_addr).tm_hour = result_tm.tm_hour; @@ -227,8 +214,6 @@ pub extern "C" fn _localtime_r(time_p: u32, result: u32, instance: &mut Instance (*result_addr).tm_wday = result_tm.tm_wday; (*result_addr).tm_yday = result_tm.tm_yday; (*result_addr).tm_isdst = result_tm.tm_isdst; - (*result_addr).tm_gmtoff = result_tm.tm_gmtoff as _; - (*result_addr).tm_zone = copy_cstr_into_wasm(instance, result_tm.tm_zone) as _; result as _ } diff --git a/src/emtests/localtime.rs b/src/emtests/localtime.rs new file mode 100644 index 000000000..6ee4ad406 --- /dev/null +++ b/src/emtests/localtime.rs @@ -0,0 +1,9 @@ +#[test] +fn test_localtime() { + assert_emscripten_output!( + "../../emtests/localtime.wasm", + "localtime", + vec![], + "../../emtests/localtime.output" + ); +} diff --git a/src/emtests/mod.rs b/src/emtests/mod.rs index 8e7884ef6..7b579dc42 100644 --- a/src/emtests/mod.rs +++ b/src/emtests/mod.rs @@ -6,5 +6,6 @@ mod _common; mod clock_gettime; mod env; +mod localtime; mod printf; mod puts;