Skip to content

Architecture Module @ja

Hiroaki Otsu edited this page Apr 14, 2014 · 6 revisions

plsenseのモジュールオブジェクトの管理について

  • モジュールオブジェクトとは、 PlSense::Symbol::Module オブジェクトを差します
  • 以降、モジュールオブジェクトをモジュールと表記します

モジュールの構造

モジュール名/ファイルパス/プロジェクト名

モジュールは、この3つの属性により特定されます。

モジュール名とはパッケージ名であり、package構文で宣言された名称のモジュールの他、 mainという名称のモジュールが、package宣言の有無に関わらず、各ファイル毎に必ず生成されます。

通常、モジュールはモジュール名で特定され、mainの場合はファイルパスと合わせて特定されます。 ファイルパスは、main以外のモジュールでは、その特定のために使用されることはありません。 つまり、同一名称のモジュールを複数ファイルに分けて定義していた場合は、正しく解析できません。

モジュールにプロジェクト名が、あればプロジェクトモジュール、なければインストールモジュールと 判断します。 モジュールのキャッシュへの保存時にも、プロジェクト名の有無で保存先が決まります。

initialized

モジュールがビルド済みかどうかをこの属性で管理します。

parent/usingmdl/bundlemdl

モジュールは、以下のモジュールの参照を保持します。

  • parent … 継承しているモジュール
  • usingmdl … use/requireで参照しているモジュール
  • bundlemdl … 同梱されているモジュール (mainモジュールにのみ格納)

method/member

モジュールは、自身に定義されたメソッド/変数のオブジェクトを保持します。 memberとは、メソッド配下で宣言された変数以外の変数を差します。

モジュールの生成

  • インストールモジュール(@INC配下のモジュール) … FindWorker
  • プロジェクトモジュール(プロジェクト設定lib-path配下のモジュール) … FindWorker
  • その他のモジュール … BuildWorker

その他のモジュールはプロジェクトモジュールとなります。

モジュールの取得

モジュールは、 PlSense::ModuleKeeper によって管理されます。 モジュール取得の主なメソッド、 get_module は以下のフローで最初に見つかったモジュールを返します。

モジュールの保存/復元

モジュールは、BuildWorker/FindWorkerで生成、BuildWorkerで更新、その他のプロセスで利用、 という感じで、キャッシュから復元、キャッシュへ保存、という処理が各プロセスで行われます。

モジュールは、他のモジュールへの参照を保持することで、モジュールを使う側に 適切な情報を提供できるようにしていますが、モジュールをキャッシュへ保存する際、 参照先のモジュールは各々、別のデータとして保存されてしまいます。 そのため、そのまま復元すると、以下のように参照関係が正しく復元されません。

これを回避するため、 PlSense::ModuleKeeperstore_module / load_module では以下の処理を行なっています。

store_module

保存するモジュールが保持している他モジュールは、新しく空のオブジェクトを生成して、それを参照させる。

load_module

復元したモジュールが保持している他モジュールは、それをキーに モジュールの取得 を行い、 取得されたモジュールを参照し直す。