目次
B - Perl コンパイラ
use B;
B モジュールは Perl プログラムに自分自身の体内を探るための
クラス群を提供します. Perl コンパイラの"バックエンド"の実装にも
このモジュールが使われています. 単にコンパイラの使い方であれば
このモジュールの知識を必要としません: ユーザから見える部分に
関しては O モジュールを参照してください. B モジュールは
新しいコンパイラバックエンドを書く人のためのモジュールです.
このドキュメントでは読み手がperlの内部構造, SV, OP, 内部
シンボルテーブル, プログラムの構文ツリーなどに相当詳しいことを
前提としています.
B モジュールはPerlインタプリタの現在の状態を問い合わせる
ためのユーティリティ関数群を含んでいます. これらの関数の
多くは B::SV 及び B::OP クラス及びこれらの派生クラスのオブ
ジェクトを返します. これらのクラスはそれらの中でそれらの
内部状態に関して問い合わせるためのメソッドを定義しています.
B モジュールは様々な関数をエクスポートします. いくつかは
簡単なユーティリティ関数ですが, それ以外は内部オブジェクトの
入り口となる"ハンドル" (initial "handle")を取得する方法を
提供します.
B::SV 若しくは B::AV, B::HV, B::CV オブジェクトを返す関数これらのクラスの階層図及び呼び出せるメソッドに関しては, 後述の "OVERVIEW OF CLASSES" 及び "SV-RELATED CLASSES" を参照してください.
Cでの変数sv_undefに対応するSVオブジェクトを返します.
Cでの変数sv_yesに対応するSVオブジェクトを返します.
Cでの変数sv_noに対応するSVオブジェクトを返します.
何らかの Perl の値へのリファレンスを受け取り, 参照されている値を
対応する B:OP もしくは B::SV クラス派生のオブジェクトに変換します.
main_root の様な関数は別として, これはperlの内部データ構造
の入り口となる"ハンドル"(initial "handle")を取得する主要な方法です.
ここから他のアクセスメソッドを使うことになります.
返されるオブジェクトはOPやSVが存在しているのと同じ間だけ有効です. 参照する構造が解放された後はそのオブジェクトを使わないでください.
Cでの変数amagic_generationに対応するSVオブジェクトを返します.
INIT ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.
CHECK ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.
BEGIN ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.
END ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.
グローバルcomppadlistの AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.
perl が ithreads でコンパイルされたときのみ.
Perlプログラムのメイン部分に対応する(擬似的な)CVを返します.
SYMREF からシンボルテーブルを歩き始め, 各シンボル(B::GVオブジェクト) に着く度にMETHODを呼び出します. 巡回がパッケージシンボルに辿り 着いたときシンボル名を引数にRECURSEを呼び出し, 関数が真を返した 時にのみ再帰的にパッケージを進みます.
PREFIX は巡回するSYMREFの名前です.
例えば:
# Walk CGI's symbol table calling print_subs on each symbol.
# Recurse only into CGI::Util::
walksymtable(\%CGI::, 'print_subs', sub { $_[0] eq 'CGI::Util::' },
'CGI::');
print_subs() は 自分で宣言した B::GV メソッドです. 後述の"B::GV Methods"を参照してください.
B::OP オブジェクトを返す関数及びopツリーの巡回これらのクラスの階層図及び呼び出せるメソッドに関しては, 後述の "OVERVIEW OF CLASSES" 及び "SV-RELATED CLASSES" を参照してください.
Perlプラグラムのメイン部分に当たるルートop(つまり適当な B::OP から 派生したクラスのオブジェクト)を返します.
Perl プラグラムのメイン部分の始まるopを返します.
OP から構文ツリーを辿って各opでMETHODを呼び出します. ノードは子の
前に呼び出されます. walkoptree_debug(後述)がデバッグを有効に
するように呼び出されていたら, 各opでMETHODが呼び出される前に
walkoptree_debug が呼び出されます.
現在の walkoptree のデバッグフラグを返します. もし任意の引数
DEBUG が0でなければ, デバッグフラグをその値に設定します.
デバッグフラグが何を行うのかは前述のwalkoptreeを参照してください.
op番号OPNUMのPP関数名(例えば "pp_add")を返します.
文字列STRに対するperlが使うハッシュ値を "0x..." という形式の 文字列で返します.
I を perl内部の I32 型にキャストします.
-c コマンドラインオプションと同じことをします. 明らかなことですが,
これは BEGIN ブロックの中でのみ有効であって, それ以外では遅すぎます.
Cソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します.
Perlソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します.
オブジェクトのクラスを, 最初の"::"の前に当たる部分を省いて返します.
スレッド対応でコンパイルされているperlで, 特殊なスレッド毎のthreadsv 変数のリストを返します.
Perl の内部で SV 及び OP 情報 (PVIV, AV, HV, ..., OP, SVOP, UNOP,
...) を保持するために使われる C 構造体はクラス階層としてモデル化
されており, B モジュールからはそれらに対して真にクラス階層と
仕手のアクセスが提供されています. 他のオブジェクト(SV か OP の
一種)を参照する構造体フィールドは適切なクラスの Perl オブジェクト
として B モジュールによって表現されます.
B モジュールの大部分はこれらの構造体のフィールドにアクセス
するためのメソッドです.
全てのアクセスは読み込み専用です. このモジュールでは内部の変更は できません. また, このモジュールによって生成される B::OP や B::SV のオブジェクトはそれの元となっているオブジェクトが 存在している間のみ有効です; これらの生成は元のオブジェクトの 参照カウンタの増加は行いません. 解放されたオブジェクトの フィールドへのアクセスは不可解な結果, 若しくはもっと悪い結果に なるでしょう.
B::IV, B::NV, B::RV, B::PV, B::PVIV, B::PVNV, B::PVMG, B::BM, B::PVLV, B::AV, B::HV, B::CV, B::GV, B::FM, B::IO. これらのクラスは 同じような名前を持つ C 構造体への経路に相当します. 継承階層は 元になっている C "継承" に倣っています. 5.9.1 及びそれ以降では 次のようになります:
B::SV
|
+--------------+----------+------------+
| | | |
B::PV B::IV B::NV B::RV
\ / /
\ / /
B::PVIV /
\ /
\ /
\ /
B::PVNV
|
|
B::PVMG
|
+-----+----+------+-----+-----+
| | | | | |
B::BM B::AV B::GV B::HV B::CV B::IO
| |
B::PVLV |
B::FM
5.9.0 及びそれ以前では, PVLV は PVMV の直接のサブクラスで, この図の 下の部分は次のようになっていました:
|
B::PVMG
|
+------+-----+----+------+-----+-----+
| | | | | | |
B::PVLV B::BM B::AV B::GV B::HV B::CV B::IO
|
|
B::FM
アクセスメソッドはフィールドアクセスのための C マクロを元に対応
していますが, 大抵ついていた"クラス識別"前置句ははずされています
(Sv, Av, Hv, ...). 前置句はそれを外すとメソッド名がぶつかる時に
だけ残っています. 例えば GvREFCNT はその短縮形がスーパー
クラスのメソッド REFCNT (C 関数 SvREFCNT に対応) と
ぶつかるのでそのままになっています.
この B::SV オブジェクトに対応する通常のスカラーへのリファレンスを 返します. 言い換えると, このメソッドは svref_2object() 関数の 逆関数です. このスカラーとそれが指し示すその他のデータは読み込み 専用と考えるべきです: これらへの変更は安全でも効果の保証も ありません.
IV の値を, 符号付き整数として処理して返します.
これは FLAGS & SVf_IVisUV の時に誤解を招きます.
恐らく int_value メソッドが欲しかったのではないでしょうか?
IV の値を整数として返します. IV との違いは,
そこに格納されている値が符号付きなのか符号無しなのかに
関わらず正しい値を返す点です.
このメソッドは通常欲しくなるものです. これは構造体の 中の長さとオフセットの情報を使って文字列を構築します: 通常のスカラーのようにnull文字を含んでいたとしても Perl からみれる文字列を返します.
PV がリファレンスでなければ die() する点を除いて B::RV::RV と同じです.
このメソッドはそんなに便利でもありません. これは 構造体には null 終端している文字列が格納されていると 仮定し, 長さの情報は考えません.
これは padname 配列からレキシカル変数の名前をひろう必要 がある時には適切なメソッドです. レキシカル変数名は常に null 終端文字列で格納され, 長さのフィールド (SvCUR) は他の 目的で転用され, 信頼することが出来ません.
r-magic の時のみ有効で, 正規表現を生成した文字列を 返します.
r-magic 時に呼び出すと die() します.
r-magic の時のみ有効で, MAGIC に格納されている REGEX の整数値を 返します.
このメソッドは GV の GP フィールドが NULL の時に真を返します.
このメソッドはグロブの名前を返しますが, 名前の最初の文字が 制御文字の時には先に ^X へと変換します, つまり, *^G は "\cG" ではなく "^G" を返します.
これは変数の名前を表示したいときに便利です. もしコンパイル時
で, 存在するグロブのみに制限したいのであれば,
その結果は明白です, なぜなら ${"^G"} = 1 のようなコードは
2つの op - 文字列定数とデリファレンス (rv2gv) - にコンパイル
されるので, グロブは実行時に生成されるようになります.
実行時にグロブに処理しているのであれば, *^G と *{"^G"} の 曖昧さを除去する必要があるため, 生の NAME メソッドを 使う必要があります.
引数を一つ ( 'stdin' | 'stdout' | 'stderr' ) を取って, もしオブジェクトの IoIFP が引数に渡された名前と等しいときに 真を返します(つまり, $io->IsSTD('stderr') は IoIFP($io) == PerlIO_stdin() の時に真になります).
ARRAY と似ていますが全ての要素のリストではなくただ1つの要素を
得るための添字を引数に取ります.
定数関数の時に関数から返される SV を返します
B::OP, B::UNOP, B::BINOP, B::LOGOP, B::LISTOP, B::PMOP,
B::SVOP, B::PADOP, B::PVOP, B::LOOP, B::COP.
これらのクラスは似た名前のC構造体と対応しています. 疑似継承構造はCの"継承"に基を成します.
B::OP
|
+---------------+--------+--------+
| | | |
B::UNOP B::SVOP B::PADOP B::COP
,' `-.
/ `--.
B::BINOP B::LOGOP
|
|
B::LISTOP
,' `.
/ \
B::LOOP B::PMOP
C構造体のフィールドにアクセスするときは, "クラス指示" 接頭辞("op_")
を取り除いたメソッドを使います.
これらのメソッドでは OP データ構造の似た名前のフィールドの値を
取得します. より詳細な情報は op.h の最初を参照してください.
これはop名を文字列で返します(例: "add", "rv2av").
これは関数名を文字列で返します(例: "PL_ppaddr[OP_ADD]", "PL_ppaddr[OP_RV2AV]").
これはopの説明をCのグローバルPL_op_desc配列から返します(例: "addition" "array deref").
perl が ithreads サポートでコンパイルされているときのみ.
Malcolm Beattie, mbeattie@sable.ox.ac.uk