tokuhirom's Blog

Devel::Peek の出力の読み方

Devel::Peek::Dump の出力はこういう風になっているわけですが

SV = IV(0xedb740) at 0xedb748
  REFCNT = 2
  FLAGS = (PADMY,IOK,pIOK)
  IV = 1

さて、"IV(0xedb740) at 0xedb748" ってなんだ? ってなるわけです。

"IV(0xedb740)" のアドレスは、sv_any のアドレスで、0xedb748 の方は SV そのもののアドレスです。

なお、struct sv は疑似コードでいうと以下のような構造になっています。

template <class T>
struct SV {
  T sv_any;       // 値本体へのポインタ
  uint32_t sv_refcnt; // リファレンスカウント
  uint32_t sv_flags; // フラッグ
  union {
    char *svu_pv;
    IV      svu_iv;
    UV    svu_uv;
    SV*   svu_rv;
    SV** svu_array;
    HE** svu_hash;
    PerlIO* svu_fp;
  } sv_union_t;
}