在 GHCJS 下,如何getCurrentTime
工作?在time
库本身中,这是使用 FFI 实现的,调用操作系统提供的函数。但是,没有任何以time
以下开头的行:
foreign import javascript ...
我检查了shims
GHCJS 用来修补库的存储库。它修补了时区获取功能,但没有提及getCurrentTime
. 我发现的唯一一个远程接近的地方是ghcjs-boot
,其中old-time
修补了:
#ifdef ghcjs_HOST_OS
type CTimeVal = ()
type CTimeZone = ()
...
foreign import ccall unsafe "HsTime.h __hscore_gettimeofday"
gettimeofday :: Ptr CTimeVal -> Ptr CTimeZone -> IO CInt
...
但这有两个问题。一是它不是正确的库(old-time
而不是time
)。另一个是它仍在使用 C FFI。我不明白使用 GHCJS 编译时如何使用 C FFI。
那么,getCurrentTime
GHCJS 在哪里被填充?
为了回应关于 grepping ghcjs 源的评论,如果我getTime
在 GHCJS 的源中搜索(我相信这将是使用的 javascript 函数),我基本上什么也得不到。但是,all.js
通过 grepping GHCJS 为使用的项目生成的文件getCurrentTime
,我得到了这个:
ag '\bgetTime\b' all.js
20948: h$log((("elapsed time: " + (h$RTS_597.getTime() - h$RTS_595.getTime())) + "ms"));
22863: var atime = goog.math.Long.fromNumber(fs.atime.getTime());
22864: var mtime = goog.math.Long.fromNumber(fs.mtime.getTime());
22865: var ctime = goog.math.Long.fromNumber(fs.ctime.getTime());
后三个来自某种文件系统垫片。
我在生成的 javascript 中找到了这个:
function h$gettimeofday(tv_v,tv_o,tz_v,tz_o) {
var now = Date.now();
tv_v.dv.setInt32(tv_o, (now / 1000)|0, true);
tv_v.dv.setInt32(tv_o + 4, ((now % 1000) * 1000)|0, true);
if(tv_v.len >= tv_o + 12) {
tv_v.dv.setInt32(tv_o + 8, ((now % 1000) * 1000)|0, true);
}
return 0;
}
但这个问题是如何联系在一起的,这个问题仍然存在。