=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::RV | \ / \ | \ / \ | B::PVIV B::NV \ / \____ __/ \ / 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 Returns a reference to the regular scalar corresponding to this B::SV object. In other words, this method is the inverse operation to the svref_2object() subroutine. This scalar and other data it points at should be considered read-only: modifying them is neither safe nor guaranteed to have a sensible effect. =back =head2 B::IV Methods =over 4 =item IV Returns the value of the IV, I. This will be misleading if C. Perhaps you want the C method instead? =item IVX =item UVX =item int_value This method returns the value of the IV as an integer. It differs from C in that it returns the correct value regardless of whether it's stored signed or unsigned. =item needs64bits =item packiv =back =head2 B::NV Methods =over 4 =item NV =item NVX =back =head2 B::RV Methods =over 4 =item RV =back =head2 B::PV Methods =over 4 =item PV This method is the one you usually want. It constructs a string using the length and offset information in the struct: for ordinary scalars it will return the string that you'd see from Perl, even if it contains null characters. =item RV Same as B::RV::RV, except that it will die() if the PV isn't a reference. =item PVX This method is less often useful. It assumes that the string stored in the struct is null-terminated, and disregards the length information. It is the appropriate method to use if you need to get the name of a lexical variable from a padname array. Lexical variable names are always stored with a null terminator, and the length field (SvCUR) is overloaded for other purposes and can't be relied on here. =back =head2 B::PVMG Methods =over 4 =item MAGIC =item SvSTASH =back =head2 B::MAGIC Methods =over 4 =item MOREMAGIC =item precomp Only valid on r-magic, returns the string that generated the regexp. =item PRIVATE =item TYPE =item FLAGS =item OBJ Will die() if called on r-magic. =item PTR =item REGEX Only valid on r-magic, returns the integer value of the REGEX stored in the MAGIC. =back =head2 B::PVLV Methods =over 4 =item TARGOFF =item TARGLEN =item TYPE =item TARG =back =head2 B::BM Methods =over 4 =item USEFUL =item PREVIOUS =item RARE =item TABLE =back =head2 B::GV Methods =over 4 =item is_empty This method returns TRUE if the GP field of the GV is NULL. =item 名前 =item SAFENAME This method returns the name of the glob, but if the first character of the name is a control character, then it converts it to ^X first, so that *^G would return "^G" rather than "\cG". It's useful if you want to print out the name of a variable. If you restrict yourself to globs which exist at compile-time then the result ought to be unambiguous, because code like C<${"^G"} = 1> is compiled as two ops - a constant string and a dereference (rv2gv) - so that the glob is created at runtime. If you're working with globs at runtime, and need to disambiguate *^G from *{"^G"}, then you should use the raw NAME method. =item STASH =item SV =item IO =item FORM =item AV =item HV =item EGV =item CV =item CVGEN =item LINE =item ファイル =item FILEGV =item GvREFCNT =item FLAGS =back =head2 B::IO Methods =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 Takes one arguments ( 'stdin' | 'stdout' | 'stderr' ) and returns true if the IoIFP of the object is equal to the handle whose name was passed as argument ( i.e. $io->IsSTD('stderr') is true if IoIFP($io) == PerlIO_stdin() ). =back =head2 B::AV Methods =over 4 =item FILL =item MAX =item OFF =item ARRAY =item ARRAYelt Like C, but takes an index as an argument to get only one element, rather than a list of all of them. =item AvFLAGS =back =head2 B::CV Methods =over 4 =item STASH =item START =item ROOT =item GV =item ファイル =item DEPTH =item PADLIST =item OUTSIDE =item OUTSIDE_SEQ =item XSUB =item XSUBANY For constant subroutines, returns the constant SV returned by the subroutine. =item CvFLAGS =item const_sv =back =head2 B::HV Methods =over 4 =item FILL =item MAX =item KEYS =item RITER =item 名前 =item PMROOT =item ARRAY =back =head2 OP-RELATED CLASSES 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 METHOD =over 4 =item first =back =head2 B::BINOP METHOD =over 4 =item last =back =head2 B::LOGOP METHOD =over 4 =item other =back =head2 B::LISTOP METHOD =over 4 =item children =back =head2 B::PMOP Methods =over 4 =item pmreplroot =item pmreplstart =item pmnext =item pmregexp =item pmflags =item pmdynflags =item pmpermflags =item precomp =item pmoffset Only when perl was compiled with ithreads. =back =head2 B::SVOP METHOD =over 4 =item sv =item gv =back =head2 B::PADOP METHOD =over 4 =item padix =back =head2 B::PVOP METHOD =over 4 =item pv =back =head2 B::LOOP Methods =over 4 =item redoop =item nextop =item lastop =back =head2 B::COP Methods =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