ruby-trunk-changes r55813 - r55817

今日は主に Windows 環境向けの関数群で関数ポインタの変数を使って初回で呼ぶ関数を決めて2回目以降分岐や余分な関数アドレス取得をしないようにする最適化がありました。

nobu: r55813 2016-08-05 17:04:04 +0900

Windows 環境での環境変数の取得のための関数 w32_getenv の定義を関数ポインタにして、w32_getenv_unknown() という関数を定義してその関数を w32_gentnv に代入しておき、最初に呼ばれた時に locale の Encoding をチェックして ASCII-8BIT かどうかで rb_w32_getenv() か rb_w32_ugetenv() を w32_getenv に再代入することで2回目以降は直接これらの関数のどちらかが呼ばれるようにしています。

svn: r55814 2016-08-05 17:04:05 +0900

version.h の日付更新。

nobu: r55815 2016-08-05 17:22:35 +0900

r55813 で w32_getenv についてやったのと同様に win32/win32.c の get_final_path も関数ポインタの変数として定義して get_final_path_unknown() を代入しておいて、この中で最初に呼ばれた時に get_proc_address() で GetFinalPathNameByHandleW というシンボルが得られるかどうかチェックしてその結果に応じて get_final_path 変数に再代入することで、2回目以降は直接それらの関数が呼ばれるようにして分岐しないようにしています。

nobu: r55816 2016-08-05 17:28:03 +0900

win32/win32.c の rb_w32_inet_ntop() と rb_w32_inet_pton() でも get_proc_address() で取得するシンボルを格納する変数を static 変数にして最初の 1回取得したアドレスを 2回目以降は使いまわすようにしています。

nobu: r55817 2016-08-05 17:31:23 +0900

win32/win32.c の getifaddrs() と rb_w32_getppid() ではちゃんと static 変数で get_proc_address() で取得したシンボルのアドレスを保持していましたが、 NULL で初期化していたので、取得できない時に毎回 get_proc_address() を呼ぶことになっていたので、-1 をキャストした値で初期化して最初の1回だけ get_proc_address() が呼ばれるように修正しています。