diff --git a/src/library.js b/src/library.js index b1947fc69d75f..c70c15264413c 100644 --- a/src/library.js +++ b/src/library.js @@ -397,21 +397,6 @@ LibraryManager.library = { return ((Date.now() - _clock.start) * ({{{ cDefine('CLOCKS_PER_SEC') }}} / 1000))|0; }, - time__sig: 'ii', - time: function(ptr) { - {{{ from64('ptr') }}}; - var ret = (Date.now()/1000)|0; - if (ptr) { - {{{ makeSetValue('ptr', 0, 'ret', 'i32') }}}; - } - return ret; - }, - - difftime__sig: 'dii', - difftime: function(time1, time0) { - return time1 - time0; - }, - _mktime_js__sig: 'ii', _mktime_js: function(tmPtr) { var date = new Date({{{ makeGetValue('tmPtr', C_STRUCTS.tm.tm_year, 'i32') }}} + 1900, @@ -1275,7 +1260,8 @@ LibraryManager.library = { setErrNo({{{ cDefine('EINVAL') }}}); return -1; } - {{{ makeSetValue('tp', C_STRUCTS.timespec.tv_sec, '(now/1000)|0', 'i32') }}}; // seconds + // struct timespec { time_t tv_sec; long tv_nsec; }; + {{{ makeSetValue('tp', C_STRUCTS.timespec.tv_sec, 'Math.floor(now/1000)', 'i64') }}}; // seconds {{{ makeSetValue('tp', C_STRUCTS.timespec.tv_nsec, '((now % 1000)*1000*1000)|0', 'i32') }}}; // nanoseconds return 0; }, @@ -1293,7 +1279,8 @@ LibraryManager.library = { setErrNo({{{ cDefine('EINVAL') }}}); return -1; } - {{{ makeSetValue('res', C_STRUCTS.timespec.tv_sec, '(nsec/1000000000)|0', 'i32') }}}; + // struct timespec { time_t tv_sec; long tv_nsec; }; + {{{ makeSetValue('res', C_STRUCTS.timespec.tv_sec, 'Math.floor(nsec/1000000000)', 'i64') }}}; {{{ makeSetValue('res', C_STRUCTS.timespec.tv_nsec, 'nsec', 'i32') }}} // resolution is nanoseconds return 0; }, @@ -1301,8 +1288,9 @@ LibraryManager.library = { // http://pubs.opengroup.org/onlinepubs/000095399/basedefs/sys/time.h.html gettimeofday: function(ptr) { var now = Date.now(); - {{{ makeSetValue('ptr', C_STRUCTS.timeval.tv_sec, '(now/1000)|0', 'i32') }}}; // seconds - {{{ makeSetValue('ptr', C_STRUCTS.timeval.tv_usec, '((now % 1000)*1000)|0', 'i32') }}}; // microseconds + // struct timeval { time_t tv_sec; suseconds_t tv_usec; }; + {{{ makeSetValue('ptr', C_STRUCTS.timeval.tv_sec, 'Math.floor(now/1000)', 'i64') }}}; // seconds + {{{ makeSetValue('ptr', C_STRUCTS.timeval.tv_usec, 'Math.floor((now % 1000)*1000)', 'i64') }}}; // microseconds return 0; }, @@ -1312,7 +1300,8 @@ LibraryManager.library = { ftime: function(p) { var millis = Date.now(); - {{{ makeSetValue('p', C_STRUCTS.timeb.time, '(millis/1000)|0', 'i32') }}}; + // struct timeb { time_t time; unsigned short millitm; short timezone; short dstflag; }; + {{{ makeSetValue('p', C_STRUCTS.timeb.time, 'Math.floor(millis/1000)', 'i64') }}}; {{{ makeSetValue('p', C_STRUCTS.timeb.millitm, 'millis % 1000', 'i16') }}}; {{{ makeSetValue('p', C_STRUCTS.timeb.timezone, '0', 'i16') }}}; // Obsolete field {{{ makeSetValue('p', C_STRUCTS.timeb.dstflag, '0', 'i16') }}}; // Obsolete field diff --git a/src/library_syscall.js b/src/library_syscall.js index 8a59a044281c6..2ba1f0bc0360e 100644 --- a/src/library_syscall.js +++ b/src/library_syscall.js @@ -64,11 +64,11 @@ var SyscallsLibrary = { {{{ makeSetValue('buf', C_STRUCTS.stat.st_size, 'stat.size', 'i64') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_blksize, '4096', 'i32') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_blocks, 'stat.blocks', 'i32') }}}; - {{{ makeSetValue('buf', C_STRUCTS.stat.st_atim.tv_sec, '(stat.atime.getTime() / 1000)|0', 'i32') }}}; + {{{ makeSetValue('buf', C_STRUCTS.stat.st_atim.tv_sec, 'Math.floor(stat.atime.getTime() / 1000)', 'i64') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_atim.tv_nsec, '0', 'i32') }}}; - {{{ makeSetValue('buf', C_STRUCTS.stat.st_mtim.tv_sec, '(stat.mtime.getTime() / 1000)|0', 'i32') }}}; + {{{ makeSetValue('buf', C_STRUCTS.stat.st_mtim.tv_sec, 'Math.floor(stat.mtime.getTime() / 1000)', 'i64') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_mtim.tv_nsec, '0', 'i32') }}}; - {{{ makeSetValue('buf', C_STRUCTS.stat.st_ctim.tv_sec, '(stat.ctime.getTime() / 1000)|0', 'i32') }}}; + {{{ makeSetValue('buf', C_STRUCTS.stat.st_ctim.tv_sec, 'Math.floor(stat.ctime.getTime() / 1000)', 'i64') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_ctim.tv_nsec, '0', 'i32') }}}; {{{ makeSetValue('buf', C_STRUCTS.stat.st_ino, 'stat.ino', 'i64') }}}; return 0; diff --git a/src/preamble_minimal.js b/src/preamble_minimal.js index 932758d58967b..670d2688bcd60 100644 --- a/src/preamble_minimal.js +++ b/src/preamble_minimal.js @@ -18,11 +18,9 @@ function abort(what) { throw {{{ ASSERTIONS ? 'new Error(what)' : 'what' }}}; } -#if SAFE_HEAP // Globals used by JS i64 conversions (see makeSetValue) var tempDouble; var tempI64; -#endif var tempRet0 = 0; var setTempRet0 = (value) => { tempRet0 = value }; diff --git a/system/lib/libc/musl/arch/emscripten/bits/alltypes.h b/system/lib/libc/musl/arch/emscripten/bits/alltypes.h index 0ef1f9238f17a..463daf62ee6e3 100644 --- a/system/lib/libc/musl/arch/emscripten/bits/alltypes.h +++ b/system/lib/libc/musl/arch/emscripten/bits/alltypes.h @@ -78,12 +78,12 @@ typedef long double double_t; #endif #if defined(__NEED_time_t) && !defined(__DEFINED_time_t) -typedef long time_t; +typedef long long time_t; #define __DEFINED_time_t #endif #if defined(__NEED_suseconds_t) && !defined(__DEFINED_suseconds_t) -typedef long suseconds_t; +typedef long long suseconds_t; #define __DEFINED_suseconds_t #endif diff --git a/system/lib/libc/musl/arch/emscripten/bits/alltypes.h.in b/system/lib/libc/musl/arch/emscripten/bits/alltypes.h.in index fc922d01f4ac4..772463f367be5 100644 --- a/system/lib/libc/musl/arch/emscripten/bits/alltypes.h.in +++ b/system/lib/libc/musl/arch/emscripten/bits/alltypes.h.in @@ -1,3 +1,4 @@ +#define _REDIR_TIME64 1 #define _Addr __PTRDIFF_TYPE__ #define _Int64 __INT64_TYPE__ #define _Reg __PTRDIFF_TYPE__ @@ -14,8 +15,8 @@ TYPEDEF float float_t; TYPEDEF double double_t; TYPEDEF struct { long long __ll; long double __ld; } max_align_t; -TYPEDEF long time_t; -TYPEDEF long suseconds_t; +TYPEDEF long long time_t; +TYPEDEF long long suseconds_t; TYPEDEF struct { union { int __i[10]; unsigned __s[10]; } __u; } pthread_attr_t; TYPEDEF struct { union { int __i[7]; void *__p[7]; } __u; } pthread_mutex_t; diff --git a/tests/reference_struct_info.json b/tests/reference_struct_info.json index 0f137483d774e..aab7c465d94cb 100644 --- a/tests/reference_struct_info.json +++ b/tests/reference_struct_info.json @@ -1392,30 +1392,30 @@ "sin6_scope_id": 24 }, "stat": { - "__size__": 88, + "__size__": 112, "__st_dev_padding": 4, "__st_ino_truncated": 8, "__st_rdev_padding": 32, "st_atim": { - "__size__": 8, - "tv_nsec": 60, + "__size__": 16, + "tv_nsec": 64, "tv_sec": 56 }, "st_blksize": 48, "st_blocks": 52, "st_ctim": { - "__size__": 8, - "tv_nsec": 76, - "tv_sec": 72 + "__size__": 16, + "tv_nsec": 96, + "tv_sec": 88 }, "st_dev": 0, "st_gid": 24, - "st_ino": 80, + "st_ino": 104, "st_mode": 12, "st_mtim": { - "__size__": 8, - "tv_nsec": 68, - "tv_sec": 64 + "__size__": 16, + "tv_nsec": 80, + "tv_sec": 72 }, "st_nlink": 16, "st_rdev": 28, @@ -1443,21 +1443,21 @@ "timeSpentInStatus": 16 }, "timeb": { - "__size__": 12, - "dstflag": 8, - "millitm": 4, + "__size__": 16, + "dstflag": 12, + "millitm": 8, "time": 0, - "timezone": 6 + "timezone": 10 }, "timespec": { - "__size__": 8, - "tv_nsec": 4, + "__size__": 16, + "tv_nsec": 8, "tv_sec": 0 }, "timeval": { - "__size__": 8, + "__size__": 16, "tv_sec": 0, - "tv_usec": 4 + "tv_usec": 8 }, "tm": { "__size__": 44, @@ -1474,9 +1474,9 @@ "tm_zone": 40 }, "utimbuf": { - "__size__": 8, + "__size__": 16, "actime": 0, - "modtime": 4 + "modtime": 8 } } } diff --git a/tools/system_libs.py b/tools/system_libs.py index 471ec65cd4fe7..08452a06a3b87 100644 --- a/tools/system_libs.py +++ b/tools/system_libs.py @@ -908,6 +908,8 @@ def get_files(self): 'ctime.c', 'gmtime.c', 'localtime.c', + 'difftime.c', + 'time.c', 'nanosleep.c', 'clock_nanosleep.c', 'ctime_r.c', @@ -1600,13 +1602,11 @@ def get_files(self): '__year_to_secs.c', 'clock.c', 'clock_gettime.c', - 'difftime.c', 'gettimeofday.c', 'localtime_r.c', 'gmtime_r.c', 'mktime.c', - 'timegm.c', - 'time.c']) + 'timegm.c']) # It is more efficient to use JS for __assert_fail, as it avoids always # including fprintf etc. files += files_in_path(