次: , 前: Enabling Advice, 上: Advising Functions


16.7 予約活性

アドバイスを実行するための結合定義を作成することは、 ある程度手間がかかります。 ライブラリで多数の関数をアドバイスしていると、 ライブラリのロードが遅くなります。 そのような場合、あらかじめ適切な結合定義を作成する 予約活性(preactivation)を使えます。

予約活性を使うには、defadviceでアドバイスを定義するときに フラグpreactivateを指定します。 このようなdefadviceの呼び出しでは、 (有効か無効に関わらず)このアドバイス断片と 当該関数に対して現在有効になっている他のアドバイスを元定義 に結合した定義を作成します。 defadviceをコンパイルすると、その結合定義もコンパイルします。

のちに関数のアドバイスを活性にしたとき、 関数に対する有効にしたアドバイスがこの結合定義の作成に 使用したものに一致すると既存の結合定義を使います。 そのため、新たに結合定義を作成する必要がなくなります。 したがって、予約活性はけっしてまちがった結果を生じませんが、 予約活性に用いたアドバイスと活性にした有効なアドバイスが一致しないと 利点はなくなります。

不一致のために予約活性が正しく動作していない兆候の例を示します。

関数自体が定義されるまえであってもコンパイル済みの予約活性したアドバイスは 正しく動作します。 しかし、予約活性したアドバイスをコンパイルするときには 関数は定義済みである必要があります。

予約活性したアドバイスが使われない理由を調べるよい方法はありません。 できることは、 関数のアドバイスを活性にするまえに、 (関数trace-function-backgroundで) 関数ad-cache-id-verification-codeをトレースすることです。 活性にしたあと、当該関数に対してad-cache-id-verification-codeが 返した値を調べます。 verifiedならば予約活性したアドバイスが使われています。 これ以外の値は、アドバイスが不適切と判断された理由に関する情報を 与えます。

警告: 予約活性が失敗する場合が1つ知られている。 現在のアドバイスの状態に一致しなくても、 あらかじめ作成した結合定義を使ってしまう。 これは、同一関数に対する同じクラスの同一名称であるが異なるアドバイス断片を 2つのパッケージで定義している場合に発生する。 このようなことは避けること。