名前¶
perlmroapi - Perl method resolution plugin interface
perlmroapi - Perl メソッド解決プラグインインターフェース
説明¶
As of Perl 5.10.1 there is a new interface for plugging and using method resolution orders other than the default (linear depth first search). The C3 method resolution order added in 5.10.0 has been re-implemented as a plugin, without changing its Perl-space interface.
Perl 5.10.1 から、デフォルト(深さ優先線形検索)以外のメソッド解決順序を プラグインとして使うための新しいインターフェースがあります。 5.10.0 で追加された C3 メソッド解決順序は、Perl 側のインターフェースを 変更することなくプラグインとして再実装されました。
Each plugin should register itself by providing the following structure
それぞれのプラグインは以下の構造体を提供することで自分自身を登録します
struct mro_alg {
AV *(*resolve)(pTHX_ HV *stash, U32 level);
const char *name;
U16 length;
U16 kflags;
U32 hash;
};
and calling Perl_mro_register
:
そして Perl_mro_register
を呼び出します:
Perl_mro_register(aTHX_ &my_mro_alg);
- resolve
-
Pointer to the linearisation function, described below.
後述する線形化関数へのポインタ
- name
-
Name of the MRO, either in ISO-8859-1 or UTF-8.
MRO の名前 (ISO-8859-1 か UTF-8 のどちらか)。
- length
-
Length of the name.
名前の長さ。
- kflags
-
If the name is given in UTF-8, set this to
HVhek_UTF8
. The value is passed direct as the parameter kflags tohv_common()
.名前が UTF-8 で与えられた場合、これを
HVhek_UTF8
に設定します。 この値はhv_common()
の kflags に直接渡されます。 - hash
-
A precomputed hash value for the MRO's name, or 0.
MRO 名のための事前に計算されたハッシュ値、または 0。
コールバック¶
The resolve
function is called to generate a linearised ISA for the given stash, using this MRO. It is called with a pointer to the stash, and a level of 0. The core always sets level to 0 when it calls your function - the parameter is provided to allow your implementation to track depth if it needs to recurse.
resolve
関数は、与えられたスタッシュのための線形化された ISA を この MRO を使って生成するために呼び出されます。 これはスタッシュへのポインタおよび、0 を入れた level で呼び出されます。 この関数を呼び出すときにはコアは常に level に 0 を設定します - この引数は再帰が必要なときに深さを記録できるようにします。
The function should return a reference to an array containing string SVs giving the names of parent classes in order. The names of the classes should be the result of calling HvENAME()
on the stash. In those cases where HvENAME()
returns null, HvNAME()
should be used instead.
関数は親クラスの名前をもった文字列 SV を並べたものが入った配列への リファレンスを返します。 クラスの名前はスタッシュに対して HvENAME()
を呼び出した結果です。 そのような場合で HvENAME()
が null を返すと、HvNAME()
が代わりに 使われます。
The caller is responsible for incrementing the reference count of the array returned if it wants to keep the structure. Hence, if you have created a temporary value that you keep no pointer to, sv_2mortal()
to ensure that it is disposed of correctly. If you have cached your return value, then return a pointer to it without changing the reference count.
呼び出し元は、構造体を保持したいなら返された配列の参照カウントを インクリメントする責任を負います。 従って、ポインタで指していない一時的な値を作った場合、正しく捨てられるために sv_2mortal()
します。 返り値をキャッシュする場合、参照カウントを変更することなくポインタを 返します。
キャッシュ¶
Computing MROs can be expensive. The implementation provides a cache, in which you can store a single SV *
, or anything that can be cast to SV *
, such as AV *
. To read your private value, use the macro MRO_GET_PRIVATE_DATA()
, passing it the mro_meta
structure from the stash, and a pointer to your mro_alg
structure:
MRO の計算は高く付くことがあります。 実装は、単一の SV *
、または AV *
のような SV *
にキャッシュできる もののキャッシュを提供します。 プライベートな値を読み込むには、 MRO_GET_PRIVATE_DATA()
マクロを使って、スタッシュと mro_alg
構造体への ポインタから mro_meta
構造体を渡します:
meta = HvMROMETA(stash);
private_sv = MRO_GET_PRIVATE_DATA(meta, &my_mro_alg);
To set your private value, call Perl_mro_set_private_data()
:
プライベートな値を設定するには、Perl_mro_set_private_data()
を 呼び出します:
Perl_mro_set_private_data(aTHX_ meta, &c3_alg, private_sv);
The private data cache will take ownership of a reference to private_sv, much the same way that hv_store()
takes ownership of a reference to the value that you pass it.
プライベートデータキャッシュは private_sv へのリファレンスの所有権を 取ります; hv_store()
が渡された値へのリファレンスの所有権を取るのと 同様です。
例¶
For examples of MRO implementations, see S_mro_get_linear_isa_c3()
and the BOOT:
section of ext/mro/mro.xs, and S_mro_get_linear_isa_dfs()
in mro_core.c
MRO 実装の例については、ext/mro/mro.xs の S_mro_get_linear_isa_c3()
と BOOT:
の節、および mro_core.c の S_mro_get_linear_isa_dfs()
を 参照してください。
作者¶
The implementation of the C3 MRO and switchable MROs within the perl core was written by Brandon L Black. Nicholas Clark created the pluggable interface, refactored Brandon's implementation to work with it, and wrote this document.
C3 MRO と perl コア内の切り替え可能な MRO の実装は Brandon L Black によって 書かれました。 Nicholas Clark はプラグイン可能なインターフェースを作成し、これで動くように Brandon の実装をリファクタリングし、この文書を書きました。