エクステンションの再読み込み¶
バージョン 1.13.0 で追加.
KLエクステンションコードは、Fabric EngineインスタンスがDCC上で実行中であろうと、スタンドアロンアプリケーションとして実行中であろうと、いつでも再読み込みができます。Canvas ノードの右クリックすると、そのノードの依存エクステンションのリロードオプションが表示されます。
KLエクステンションの通常の再読み込みは以下のような状況で特に有用です。エクステンションの型, 関数プロトタイプのメモリ上での配置が不変に保ったまま、既存関数の実装をアップデートしたい場合。エクステンションの再読み込みは下記の注意事項に気をつけるかぎりにおいて安全です。
API 関数¶
KLエクステンションの再読み込みに関連する API関数コードは、C APIの FEC_ClientLoadExtension, FEC_RegisterKLExtension と、C++ and Python APIには Client::loadExtension(), RegisterKLExtension があります。これらの関数とそのパラメータについてのより詳しい情報は クライアントとアプリケーションの生存サイクル 参照してください。これらの関数の reload パラメータは比較的新しく追加されたものです。0に設定した場合: ――過去にユーザがそのエクステンションを読み込もうとしていた場合―― 関数は既に読み込み済であるとエラーを出力する。1に設定した場合: そのエクステンションはディスク (あるいは RegisterKLExtension 関数であれば指定したソースコード)より再読み込みされる。
KL型のメンバのレイアウトのアップデート¶
あるKLの型の、メモリ上での表現あるいはメンバのレイアウトは、エクステンションのリロードでは変更できません。そのようなことをしてしまうとエラーとなるでしょう。KL型のメモリ上の表現を変更するには、すべてのCoreクライアントをいったん落とし再起動しましょう。例えば、ある構造体 ‘MyStruct’ にメンバを追加し、そのままリロードしてしまうと以下のようなエラーが発生します:
[FABRIC:MT] [MyExt] MyExt.kl:2:1: error: type 'MyStruct' already registered with a different definition
[FABRIC:MT] [MyExt] Error encountered while loading extension; extension disabled
[FABRIC:MT] [MyExt] Error description: KL compile failed: type 'MyStruct' already registered with a different definition
KLソースコードのアップデート¶
すべてのエクステンションのKLソースコードはエクステンションリロードするとアップデートされます。ただしいくつかの注意点があります。
エクステンション間の依存¶
リロードをかけるエクステンションに他のものに依存がある場合、リロードするエクステンションの関数がどのように呼ばれるか ―― function, inline どちらのマークがついているかに応じて振る舞いが変わります。例えばエクステンション Foo 外貨のような場合:
struct FooType
{
Scalar a;
};
function FooType.bar()
{
report('called FooType.bar()');
}
inline FooType.foo()
{
report('called FooType.foo()');
}
そしてエクステンション Bar が以下:
require Foo;
struct BarType
{
FooType foo;
};
function BarType.myFunction()
{
this.foo.foo();
this.foo.bar();
}
foo(), bar() メソッドの実装を変更し Foo のソースコードをリロードすると、 Bar 型では非inlie関数である bar() メソッドのみしか変更が反映されません。インライン関数 foo() の実装への候を反映するには、 Bar エクステンションの再コンパイルが必要です。さらにCore は自動で依存するエクステンションのリロードを行わないため、ユーザが手動でリロードをかけ再コンパイルを強制させます。
関数プロトタイプの変更、関数の追加と削除¶
あるエクステンション内で、A.既存KL関数のプロトタイプを変更する(パラメータの型の変更、パラメータの追加,削除など)B.関数を追加,削除する場合、このエクステンションに対するあたらしいKLコードは、新しい関数を使用可能です。ただし、エクステンションが依存する既存コードは古い関数プロトタイプへ参照したままとなり古い関数を使用してしまいます。依存エクステンションが、すでに目視不可能な存在しないKL関数を使用してしまい、多大な混乱を生じてしまいます。