5

GHCJS の下では、どのように機能しgetCurrentTimeますか? timeライブラリ自体では、これはFFIを使用して実装され、オペレーティング システムによって提供される関数を呼び出します。timeただし、次で始まる行はありません。

foreign import javascript ...

shimsGHCJS がライブラリにパッチを当てるために使用するリポジトリを確認しました。タイムゾーン取得機能にパッチを当てていますが、getCurrentTime. リモートで近いことがわかったのは、次のパッチが適用されている だけでしghcjs-bootold-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 を使用するとどのように機能するのかわかりません。

では、getCurrentTimeGHCJS はどこに組み込まれているのでしょうか?

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;
}

しかし、これがどのようにリンクされたのかという問題は残っています。

4

0 に答える 0