B - Perl コンパイラ

目次


名前

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" を参照してください.

sv_undef

Cでの変数sv_undefに対応するSVオブジェクトを返します.

sv_yes

Cでの変数sv_yesに対応するSVオブジェクトを返します.

sv_no

Cでの変数sv_noに対応するSVオブジェクトを返します.

svref_2object(SVREF)

何らかの Perl の値へのリファレンスを受け取り, 参照されている値を 対応する B:OP もしくは B::SV クラス派生のオブジェクトに変換します. main_root の様な関数は別として, これはperlの内部データ構造 の入り口となる"ハンドル"(initial "handle")を取得する主要な方法です. ここから他のアクセスメソッドを使うことになります.

返されるオブジェクトはOPやSVが存在しているのと同じ間だけ有効です. 参照する構造が解放された後はそのオブジェクトを使わないでください.

amagic_generation

Cでの変数amagic_generationに対応するSVオブジェクトを返します.

init_av

INIT ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.

check_av

CHECK ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.

begin_av

BEGIN ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.

end_av

END ブロックを表現する AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.

comppadlist

グローバルcomppadlistの AV オブジェクト(つまりB::AVクラスの オブジェクト)を返します.

regex_padav

perl が ithreads でコンパイルされたときのみ.

main_cv

Perlプログラムのメイン部分に対応する(擬似的な)CVを返します.

シンボルテーブルを調査する関数

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 メソッドです. 後述の"B::GV Methods"を参照してください.

B::OP オブジェクトを返す関数及びopツリーの巡回

これらのクラスの階層図及び呼び出せるメソッドに関しては, 後述の "OVERVIEW OF CLASSES" 及び "SV-RELATED CLASSES" を参照してください.

main_root

Perlプラグラムのメイン部分に当たるルートop(つまり適当な B::OP から 派生したクラスのオブジェクト)を返します.

main_start

Perl プラグラムのメイン部分の始まるopを返します.

walkoptree(OP, METHOD)

OP から構文ツリーを辿って各opでMETHODを呼び出します. ノードは子の 前に呼び出されます. walkoptree_debug(後述)がデバッグを有効に するように呼び出されていたら, 各opでMETHODが呼び出される前に walkoptree_debug が呼び出されます.

walkoptree_debug(DEBUG)

現在の walkoptree のデバッグフラグを返します. もし任意の引数 DEBUG が0でなければ, デバッグフラグをその値に設定します. デバッグフラグが何を行うのかは前述のwalkoptreeを参照してください.

いろいろなユーティリティ関数

ppname(OPNUM)

op番号OPNUMのPP関数名(例えば "pp_add")を返します.

hash(STR)

文字列STRに対するperlが使うハッシュ値を "0x..." という形式の 文字列で返します.

cast_I32(I)

I を perl内部の I32 型にキャストします.

minus_c

-c コマンドラインオプションと同じことをします. 明らかなことですが, これは BEGIN ブロックの中でのみ有効であって, それ以外では遅すぎます.

cstring(STR)

Cソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します.

perlstring(STR)

Perlソースコードで文字列として使えるようにダブルクオートで囲んだ バージョンのSTRを返します.

class(OBJ)

オブジェクトのクラスを, 最初の"::"の前に当たる部分を省いて返します.

threadsv_names

スレッド対応でコンパイルされているperlで, 特殊なスレッド毎のthreadsv 変数のリストを返します.


クラスの概要

Perl の内部で SV 及び OP 情報 (PVIV, AV, HV, ..., OP, SVOP, UNOP, ...) を保持するために使われる C 構造体はクラス階層としてモデル化 されており, B モジュールからはそれらに対して真にクラス階層と 仕手のアクセスが提供されています. 他のオブジェクト(SV か OP の 一種)を参照する構造体フィールドは適切なクラスの Perl オブジェクト として B モジュールによって表現されます.

B モジュールの大部分はこれらの構造体のフィールドにアクセス するためのメソッドです.

全てのアクセスは読み込み専用です. このモジュールでは内部の変更は できません. また, このモジュールによって生成される B::OP や B::SV のオブジェクトはそれの元となっているオブジェクトが 存在している間のみ有効です; これらの生成は元のオブジェクトの 参照カウンタの増加は行いません. 解放されたオブジェクトの フィールドへのアクセスは不可解な結果, 若しくはもっと悪い結果に なるでしょう.

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, ...). 前置句はそれを外すとメソッド名がぶつかる時に だけ残っています. 例えば GvREFCNT はその短縮形がスーパー クラスのメソッド REFCNT (C 関数 SvREFCNT に対応) と ぶつかるのでそのままになっています.

B::SV メソッド

REFCNT
FLAGS
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.

B::IV Methods

IV

Returns the value of the IV, interpreted as a signed integer. This will be misleading if FLAGS & SVf_IVisUV. Perhaps you want the int_value method instead?

IVX
UVX
int_value

This method returns the value of the IV as an integer. It differs from IV in that it returns the correct value regardless of whether it's stored signed or unsigned.

needs64bits
packiv

B::NV Methods

NV
NVX

B::RV Methods

RV

B::PV Methods

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.

RV

Same as B::RV::RV, except that it will die() if the PV isn't a reference.

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.

B::PVMG Methods

MAGIC
SvSTASH

B::MAGIC Methods

MOREMAGIC
precomp

Only valid on r-magic, returns the string that generated the regexp.

PRIVATE
TYPE
FLAGS
OBJ

Will die() if called on r-magic.

PTR
REGEX

Only valid on r-magic, returns the integer value of the REGEX stored in the MAGIC.

B::PVLV Methods

TARGOFF
TARGLEN
TYPE
TARG

B::BM Methods

USEFUL
PREVIOUS
RARE
TABLE

B::GV Methods

is_empty

This method returns TRUE if the GP field of the GV is NULL.

名前
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 ${"^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.

STASH
SV
IO
FORM
AV
HV
EGV
CV
CVGEN
LINE
ファイル
FILEGV
GvREFCNT
FLAGS

B::IO Methods

LINES
PAGE
PAGE_LEN
LINES_LEFT
TOP_NAME
TOP_GV
FMT_NAME
FMT_GV
BOTTOM_NAME
BOTTOM_GV
SUBPROCESS
IoTYPE
IoFLAGS
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() ).

B::AV Methods

FILL
MAX
OFF
ARRAY
ARRAYelt

Like ARRAY, but takes an index as an argument to get only one element, rather than a list of all of them.

AvFLAGS

B::CV Methods

STASH
START
ROOT
GV
ファイル
DEPTH
PADLIST
OUTSIDE
OUTSIDE_SEQ
XSUB
XSUBANY

For constant subroutines, returns the constant SV returned by the subroutine.

CvFLAGS
const_sv

B::HV Methods

FILL
MAX
KEYS
RITER
名前
PMROOT
ARRAY

OP-RELATED CLASSES

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_") を取り除いたメソッドを使います.

B::OP のメソッド

これらのメソッドでは OP データ構造の似た名前のフィールドの値を 取得します. より詳細な情報は op.h の最初を参照してください.

next
sibling
name

これはop名を文字列で返します(例: "add", "rv2av").

ppaddr

これは関数名を文字列で返します(例: "PL_ppaddr[OP_ADD]", "PL_ppaddr[OP_RV2AV]").

desc

これはopの説明をCのグローバルPL_op_desc配列から返します(例: "addition" "array deref").

targ
type
opt
static
flags
private
spare

B::UNOP METHOD

first

B::BINOP METHOD

last

B::LOGOP METHOD

other

B::LISTOP METHOD

children

B::PMOP Methods

pmreplroot
pmreplstart
pmnext
pmregexp
pmflags
pmdynflags
pmpermflags
precomp
pmoffset

Only when perl was compiled with ithreads.

B::SVOP METHOD

sv
gv

B::PADOP METHOD

padix

B::PVOP METHOD

pv

B::LOOP Methods

redoop
nextop
lastop

B::COP Methods

label
stash
stashpv
file
cop_seq
arybase
line
warnings
io

著者

Malcolm Beattie, mbeattie@sable.ox.ac.uk

B - Perl コンパイラ

索引

B - Perl コンパイラ