9

私が継承したいくつかの XS コードを理解しようとしています。Perl マジックを呼び出すセクションにコメントを追加しようとしていますが、この行を理解するのに役立つドキュメントが見つかりません。

SvRMAGICAL_off((SV *) myVar);

RMAGICALのためですか?Perl マジック変数を操作するとき、いつオンまたはオフにする必要がありますか?

アップデート

Perlguts Illustrated は非常に興味深いもので、RMAGICAL (「R」は「ランダム」を表す) に関する情報が少しありますが、それをいじるタイミングについては言及されていません: http://cpansearch.perl.org/src/ RURBAN/illguts-0.42/index.html

4

2 に答える 2

4

SVs_RMGフラグ (テストSvRMAGICALおよび設定/クリアするもの) は、変数に、魔法の getter メソッド (フラグで示される) と魔法の setter メソッド ( で示される)SvRMAGICAL_on/SvRMAGICAL_off以外の何らかの魔法が関連付けられていることを意味します。SVs_GMGSVs_SMG

ここでは詳しく説明しませんが、RMAGICがオンになっている変数の例には、ほとんどの値%ENV(プログラムの開始時に設定されるものであり、実行時に定義するものではありません) 、%!およびの値が含まれます。 %SIG、および名前付きサブルーチンの stash 値 (つまり、プログラム内)

 package main;
 sub foo { 42 }

$::{"foo"}RMAGICAL であり、そうで$::{"bar"}はない)。使用Devel::Peekすることは少しですが、この魔法が何であるかについて完全に啓発するわけではありません:

$ /usr/bin/perl -MDevel::Peek -e 'Dump $ENV{HOSTNAME}'
SV = PVMG(0x8003e910) at 0x800715f0
  REFCNT = 1
  FLAGS = (SMG,RMG,POK,pPOK)
  IV = 0
  NV = 0
  PV = 0x80072790 "localhost"\0
  CUR = 10
  LEN = 12
  MAGIC = 0x800727a0
    MG_VIRTUAL = &PL_vtbl_envelem
    MG_TYPE = PERL_MAGIC_envelem(e)
    MG_LEN = 8
    MG_PTR = 0x800727c0 "HOSTNAME"

ここで、保持され$ENV{HOSTNAME}ているスカラーにMG_TYPEandMG_VIRTUALがあることがわかります。これは、この変数の魔法の方法と理由ではなく、何を提供するかを示します。「通常の」魔法の変数では、これらは通常 (常に?)PERL_MAGIC_sv&PL_vtbl_sv:

$ /usr/bin/perl -MDevel::Peek -e 'Dump $='
SV = PVMG(0x8008e080) at 0x80071de8
  REFCNT = 1
  FLAGS = (GMG,SMG)
  IV = 0
  NV = 0
  PV = 0
  MAGIC = 0x80085aa8
    MG_VIRTUAL = &PL_vtbl_sv
    MG_TYPE = PERL_MAGIC_sv(\0)
    MG_OBJ = 0x80071d58
    MG_LEN = 1
    MG_PTR = 0x80081ad0 "="

SvRMAGICAL_offが使用されている perl ソース内の 1 つの場所がありperlio.cますXS(XS_io_MODIFY_SCALAR_ATTRIBUTES)

XS(XS_io_MODIFY_SCALAR_ATTRIBUTES)
{
    dXSARGS;
    SV * const sv = SvRV(ST(1));
    AV * const av = newAV();
    MAGIC *mg;
    int count = 0;
    int i;
    sv_magic(sv, MUTABLE_SV(av), PERL_MAGIC_ext, NULL, 0);

    SvRMAGICAL_off(sv);

    mg = mg_find(sv, PERL_MAGIC_ext);
    mg->mg_virtual = &perlio_vtab;
    mg_magical(sv);
    Perl_warn(aTHX_ "attrib %" SVf, SVfARG(sv));
    for (i = 2; i < items; i++) {
    STRLEN len;
    const char * const name = SvPV_const(ST(i), len);
    SV * const layer = PerlIO_find_layer(aTHX_ name, len, 1);
    if (layer) {
        av_push(av, SvREFCNT_inc_simple_NN(layer));
    }
    else {
        ST(count) = ST(i);
        count++;
    }
    }
    SvREFCNT_dec(av);
    XSRETURN(count);
}

なんらかの理由で (繰り返しますが、私は理解できません)、彼らはmg_find通話中にその魔法をオフにしたいと考えています。

于 2013-05-13T19:54:20.973 に答える