=head1 名前 B - Perl コンパイラ =head1 概要 use B; =head1 説明 C モジュールは Perl プログラムに自分自身の体内を探るための クラス群を提供します. Perl コンパイラの"バックエンド"の実装にも このモジュールが使われています. 単にコンパイラの使い方であれば このモジュールの知識を必要としません: ユーザから見える部分に 関しては F モジュールを参照してください. C モジュールは 新しいコンパイラバックエンドを書く人のためのモジュールです. このドキュメントでは読み手がperlの内部構造, SV, OP, 内部 シンボルテーブル, プログラムの構文ツリーなどに相当詳しいことを 前提としています. =head1 概要 C モジュールはPerlインタプリタの現在の状態を問い合わせる ためのユーティリティ関数群を含んでいます. これらの関数の 多くは B::SV 及び B::OP クラス及びこれらの派生クラスのオブ ジェクトを返します. これらのクラスはそれらの中でそれらの 内部状態に関して問い合わせるためのメソッドを定義しています. =head1 ユーティリティ関数 C モジュールは様々な関数をエクスポートします. いくつかは 簡単なユーティリティ関数ですが, それ以外は内部オブジェクトの 入り口となる"ハンドル" (initial "handle")を取得する方法を 提供します. =head2 C 若しくは C, C, C オブジェクトを返す関数 これらのクラスの階層図及び呼び出せるメソッドに関しては, 後述の L 及び L を参照してください. =over 4 =item sv_undef Cでの変数Cに対応するSVオブジェクトを返します. =item sv_yes Cでの変数Cに対応するSVオブジェクトを返します. =item sv_no Cでの変数Cに対応するSVオブジェクトを返します. =item svref_2object(SVREF) 何らかの Perl の値へのリファレンスを受け取り, 参照されている値を 対応する B:OP もしくは B::SV クラス派生のオブジェクトに変換します. C の様な関数は別として, これはperlの内部データ構造 の入り口となる"ハンドル"(initial "handle")を取得する主要な方法です. ここから他のアクセスメソッドを使うことになります. 返されるオブジェクトはOPやSVが存在しているのと同じ間だけ有効です. 参照する構造が解放された後はそのオブジェクトを使わないでください. =item amagic_generation Cでの変数Cに対応するSVオブジェクトを返します. =item init_av INIT ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します. =item check_av CHECK ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します. =item begin_av BEGIN ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します. =item end_av END ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します. =item comppadlist グローバルcomppadlistの AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します. =item regex_padav perl が ithreads でコンパイルされたときのみ. =item main_cv Perlプログラムのメイン部分に対応する(擬似的な)CVを返します. =back =head2 シンボルテーブルを調査する関数 =over 4 =item walksymtable(SYMREF, METHOD, RECURSE, PREFIX) 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 メソッドです. 後述のLを参照してください. =back =head2 C オブジェクトを返す関数及びopツリーの巡回 これらのクラスの階層図及び呼び出せるメソッドに関しては, 後述の L 及び L を参照してください. =over 4 =item main_root Perlプラグラムのメイン部分に当たるルートop(つまり適当な B::OP から 派生したクラスのオブジェクト)を返します. =item main_start Perl プラグラムのメイン部分の始まるopを返します. =item walkoptree(OP, METHOD) OP から構文ツリーを辿って各opでMETHODを呼び出します. ノードは子の 前に呼び出されます. C(後述)がデバッグを有効に するように呼び出されていたら, 各opでMETHODが呼び出される前に C が呼び出されます. =item walkoptree_debug(DEBUG) 現在の C のデバッグフラグを返します. もし任意の引数 DEBUG が0でなければ, デバッグフラグをその値に設定します. デバッグフラグが何を行うのかは前述のCを参照してください. =back =head2 いろいろなユーティリティ関数 =over 4 =item ppname(OPNUM) op番号OPNUMのPP関数名(例えば "pp_add")を返します. =item hash(STR) 文字列STRに対するperlが使うハッシュ値を "0x..." という形式の 文字列で返します. =item cast_I32(I) I を perl内部の I32 型にキャストします. =item minus_c C<-c> コマンドラインオプションと同じことをします. 明らかなことですが, これは BEGIN ブロックの中でのみ有効であって, それ以外では遅すぎます. =item cstring(STR) Cソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します. =item perlstring(STR) Perlソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します. =item class(OBJ) オブジェクトのクラスを, 最初のC<"::">の前に当たる部分を省いて返します. =item threadsv_names スレッド対応でコンパイルされているperlで, 特殊なスレッド毎のthreadsv 変数のリストを返します. =back =head1 クラスの概要 Perl の内部で SV 及び OP 情報 (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) を保持するために使われる C 構造体はクラス階層としてモデル化 されており, C モジュールからはそれらに対して真にクラス階層と 仕手のアクセスが提供されています. 他のオブジェクト(SV か OP の 一種)を参照する構造体フィールドは適切なクラスの Perl オブジェクト として C モジュールによって表現されます. C モジュールの大部分はこれらの構造体のフィールドにアクセス するためのメソッドです. 全てのアクセスは読み込み専用です. このモジュールでは内部の変更は できません. また, このモジュールによって生成される B::OP や B::SV のオブジェクトはそれの元となっているオブジェクトが 存在している間のみ有効です; これらの生成は元のオブジェクトの 参照カウンタの増加は行いません. 解放されたオブジェクトの フィールドへのアクセスは不可解な結果, 若しくはもっと悪い結果に なるでしょう. =head2 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, ...). 前置句はそれを外すとメソッド名がぶつかる時に だけ残っています. 例えば C はその短縮形がスーパー クラスのメソッド C (C 関数 C に対応) と ぶつかるのでそのままになっています. =head2 B::SV メソッド =over 4 =item REFCNT =item FLAGS =item object_2svref この B::SV オブジェクトに対応する通常のスカラーへのリファレンスを 返します. 言い換えると, このメソッドは svref_2object() 関数の 逆関数です. このスカラーとそれが指し示すその他のデータは読み込み 専用と考えるべきです: これらへの変更は安全でも効果の保証も ありません. =back =head2 B::IV メソッド =over 4 =item IV IV の値を, I<符号付き整数として処理して>返します. これは C の時に誤解を招きます. 恐らく C メソッドが欲しかったのではないでしょうか? =item IVX =item UVX =item int_value IV の値を整数として返します. C との違いは, そこに格納されている値が符号付きなのか符号無しなのかに 関わらず正しい値を返す点です. =item needs64bits =item packiv =back =head2 B::NV メソッド =over 4 =item NV =item NVX =back =head2 B::RV メソッド =over 4 =item RV =back =head2 B::PV メソッド =over 4 =item PV このメソッドは通常欲しくなるものです. これは構造体の 中の長さとオフセットの情報を使って文字列を構築します: 通常のスカラーのようにnull文字を含んでいたとしても Perl からみれる文字列を返します. =item RV PV がリファレンスでなければ die() する点を除いて B::RV::RV と同じです. =item PVX このメソッドはそんなに便利でもありません. これは 構造体には null 終端している文字列が格納されていると 仮定し, 長さの情報は考えません. これは padname 配列からレキシカル変数の名前をひろう必要 がある時には適切なメソッドです. レキシカル変数名は常に null 終端文字列で格納され, 長さのフィールド (SvCUR) は他の 目的で転用され, 信頼することが出来ません. =back =head2 B::PVMG メソッド =over 4 =item MAGIC =item SvSTASH =back =head2 B::MAGIC メソッド =over 4 =item MOREMAGIC =item precomp r-magic の時のみ有効で, 正規表現を生成した文字列を 返します. =item PRIVATE =item TYPE =item FLAGS =item OBJ r-magic 時に呼び出すと die() します. =item PTR =item REGEX r-magic の時のみ有効で, MAGIC に格納されている REGEX の整数値を 返します. =back =head2 B::PVLV メソッド =over 4 =item TARGOFF =item TARGLEN =item TYPE =item TARG =back =head2 B::BM メソッド =over 4 =item USEFUL =item PREVIOUS =item RARE =item TABLE =back =head2 B::GV メソッド =over 4 =item is_empty このメソッドは GV の GP フィールドが NULL の時に真を返します. =item NAME =item SAFENAME このメソッドはグロブの名前を返しますが, 名前の最初の文字が 制御文字の時には先に ^X へと変換します, つまり, *^G は "\cG" ではなく "^G" を返します. これは変数の名前を表示したいときに便利です. もしコンパイル時 で, 存在するグロブのみに制限したいのであれば, その結果は明白です, なぜなら C<${"^G"} = 1> のようなコードは 2つの op - 文字列定数とデリファレンス (rv2gv) - にコンパイル されるので, グロブは実行時に生成されるようになります. 実行時にグロブに処理しているのであれば, *^G と *{"^G"} の 曖昧さを除去する必要があるため, 生の NAME メソッドを 使う必要があります. =item STASH =item SV =item IO =item FORM =item AV =item HV =item EGV =item CV =item CVGEN =item LINE =item FILE =item FILEGV =item GvREFCNT =item FLAGS =back =head2 B::IO メソッド =over 4 =item LINES =item PAGE =item PAGE_LEN =item LINES_LEFT =item TOP_NAME =item TOP_GV =item FMT_NAME =item FMT_GV =item BOTTOM_NAME =item BOTTOM_GV =item SUBPROCESS =item IoTYPE =item IoFLAGS =item IsSTD 引数を一つ ( 'stdin' | 'stdout' | 'stderr' ) を取って, もしオブジェクトの IoIFP が引数に渡された名前と等しいときに 真を返します(つまり, $io->IsSTD('stderr') は IoIFP($io) == PerlIO_stdin() の時に真になります). =back =head2 B::AV メソッド =over 4 =item FILL =item MAX =item OFF =item ARRAY =item ARRAYelt C と似ていますが全ての要素のリストではなくただ1つの要素を 得るための添字を引数に取ります. =item AvFLAGS =back =head2 B::CV メソッド =over 4 =item STASH =item START =item ROOT =item GV =item ファイル =item DEPTH =item PADLIST =item OUTSIDE =item OUTSIDE_SEQ =item XSUB =item XSUBANY 定数関数の時に関数から返される SV を返します =item CvFLAGS =item const_sv =back =head2 B::HV メソッド =over 4 =item FILL =item MAX =item KEYS =item RITER =item NAME =item PMROOT =item ARRAY =back =head2 OP に関連するクラス C, C, C, C, C, C, C, C, C, C, C. これらのクラスは似た名前のC構造体と対応しています. 疑似継承構造はCの"継承"に基を成します. B::OP | +---------------+--------+--------+ | | | | B::UNOP B::SVOP B::PADOP B::COP ,' `-. / `--. B::BINOP B::LOGOP | | B::LISTOP ,' `. / \ B::LOOP B::PMOP C構造体のフィールドにアクセスするときは, "クラス指示" 接頭辞(C<"op_">) を取り除いたメソッドを使います. =head2 B::OP のメソッド これらのメソッドでは OP データ構造の似た名前のフィールドの値を 取得します. より詳細な情報は C の最初を参照してください. =over 4 =item next =item sibling =item Z<> name これはop名を文字列で返します(例: "add", "rv2av"). =item ppaddr これは関数名を文字列で返します(例: "PL_ppaddr[OP_ADD]", "PL_ppaddr[OP_RV2AV]"). =item desc これはopの説明をCのグローバルPL_op_desc配列から返します(例: "addition" "array deref"). =item targ =item type =item opt =item static =item flags =item private =item spare =back =head2 B::UNOP メソッド =over 4 =item first =back =head2 B::BINOP メソッド =over 4 =item last =back =head2 B::LOGOP メソッド =over 4 =item other =back =head2 B::LISTOP メソッド =over 4 =item children =back =head2 B::PMOP メソッド =over 4 =item pmreplroot =item pmreplstart =item pmnext =item pmregexp =item pmflags =item pmdynflags =item pmpermflags =item precomp =item pmoffset perl が ithreads サポートでコンパイルされているときのみ. =back =head2 B::SVOP メソッド =over 4 =item sv =item gv =back =head2 B::PADOP メソッド =over 4 =item padix =back =head2 B::PVOP メソッド =over 4 =item pv =back =head2 B::LOOP メソッド =over 4 =item redoop =item nextop =item lastop =back =head2 B::COP メソッド =over 4 =item label =item stash =item stashpv =item Z<> file =item cop_seq =item arybase =item line =item Z<> warnings =item io =back =head1 著者 Malcolm Beattie, C