理系学生日記

おまえはいつまで学生気分なのか

XS で ST を使うときは参照カウンタに気をつける

なんか注意しろとか書いてあるな.
ぼくたちが SV * を XS の返り値として返すときは,RETVAL が mortal にされるとかなんとか.
で,下記の二つのコードが同じとか.

void
alpha()
    PPCODE:
        ST(0) = newSVpv("Hello World",0);
        sv_2mortal(ST(0));
        XSRETURN(1);

SV *
beta()
    CODE:
        RETVAL = newSVpv("Hello World",0);
    OUTPUT:
        RETVAL

いや,話の展開が意味わからんし!!というわけでここ調べるよー.
今分からんのはこのへん.

  • PPCODE: セクションてなに
  • mortal てどういう状態や! sv_2mortal てなにしてるんや!

PPCODE セクション

xsubpp コンパイラに対して,プログラマが戻り値のために引数スタックを操作するコード書くから!大丈夫だから!っていうのを伝えるためのセクションとのこと.XSUB の戻り値としてリストとか返すときに必要になるっぽい.スタックポインタの位置もちがうみたいだけど,今のところはスルーする.

mortal

perlxs の中にそれといった解説はみつからない.
で,とりあえず Google 先生にお聞きしたら,id:wakapon さんの記事が見つかった.XS で調べるとだいたい wakapon さんの記事がヒットするという仕様.

うーん,perlguts かー.perlxs を読んでいたら perlguts を読まなければならないということですね.分かります.