-
Notifications
You must be signed in to change notification settings - Fork 9
Architecture Module @ja
plsenseのモジュールオブジェクトの管理について
- モジュールオブジェクトとは、 PlSense::Symbol::Module オブジェクトを差します
- 以降、モジュールオブジェクトをモジュールと表記します
モジュールは、この3つの属性により特定されます。
モジュール名とはパッケージ名であり、package構文で宣言された名称のモジュールの他、 mainという名称のモジュールが、package宣言の有無に関わらず、各ファイル毎に必ず生成されます。
通常、モジュールはモジュール名で特定され、mainの場合はファイルパスと合わせて特定されます。 ファイルパスは、main以外のモジュールでは、その特定のために使用されることはありません。 つまり、同一名称のモジュールを複数ファイルに分けて定義していた場合は、正しく解析できません。
モジュールにプロジェクト名が、あればプロジェクトモジュール、なければインストールモジュールと 判断します。 モジュールのキャッシュへの保存時にも、プロジェクト名の有無で保存先が決まります。
モジュールがビルド済みかどうかをこの属性で管理します。
モジュールは、以下のモジュールの参照を保持します。
- parent … 継承しているモジュール
- usingmdl … use/requireで参照しているモジュール
- bundlemdl … 同梱されているモジュール (mainモジュールにのみ格納)
モジュールは、自身に定義されたメソッド/変数のオブジェクトを保持します。 memberとは、メソッド配下で宣言された変数以外の変数を差します。
- インストールモジュール(@INC配下のモジュール) … FindWorker
- プロジェクトモジュール(プロジェクト設定lib-path配下のモジュール) … FindWorker
- その他のモジュール … BuildWorker
その他のモジュールはプロジェクトモジュールとなります。
モジュールは、 PlSense::ModuleKeeper によって管理されます。
モジュール取得の主なメソッド、 get_module
は以下のフローで最初に見つかったモジュールを返します。
モジュールは、BuildWorker/FindWorkerで生成、BuildWorkerで更新、その他のプロセスで利用、 という感じで、キャッシュから復元、キャッシュへ保存、という処理が各プロセスで行われます。
モジュールは、他のモジュールへの参照を保持することで、モジュールを使う側に 適切な情報を提供できるようにしていますが、モジュールをキャッシュへ保存する際、 参照先のモジュールは各々、別のデータとして保存されてしまいます。 そのため、そのまま復元すると、以下のように参照関係が正しく復元されません。
これを回避するため、 PlSense::ModuleKeeper の store_module
/ load_module
では以下の処理を行なっています。
保存するモジュールが保持している他モジュールは、新しく空のオブジェクトを生成して、それを参照させる。
復元したモジュールが保持している他モジュールは、それをキーに モジュールの取得 を行い、 取得されたモジュールを参照し直す。