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
...
しかし、これには2つの問題があります。1つは、それが適切なライブラリではないことです(のold-time
代わりにtime
)。もう 1 つは、まだ C FFI を使用していることです。GHCJS でコンパイルしているときに、C FFI を使用するとどのように機能するのかわかりません。
では、getCurrentTime
GHCJS はどこに組み込まれているのでしょうか?
ghcjs ソースの grep に関するコメントに応えて、GHCJSgetTime
のソースで (使用されている JavaScript 関数であると思われる) を検索しても、基本的に何も得られません。しかし、all.js
を使用するプロジェクト用に GHCJS によって作成されたファイルをgrep すると、次の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());
後の 3 つは、ある種のファイルシステム shim からのものです。
生成された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;
}
しかし、これがどのようにリンクされたのかという問題は残っています。