Inline::Cで学ぶperlguts(その1)

そういえば、gutsってどういう意味なんですかね?


たぶんですが、「中心部」とか、そういう感じっぽいです。

こちらから言葉を借りると、「内部構造」って表現が良さそうですね。

第16回 Perl内部構造の深遠に迫る(1) – Perl Hackers Hub
http://gihyo.jp/dev/serial/01/perl-hackers-hub/001601

という訳で、まずはInline::Cの書き方から。

use v5.14;
use strict;
use warnings;

use Inline C => q{
    SV * get_ref_cnt(SV *sv) {
        SV *ret = newSViv( SvREFCNT(sv) );
        return ret;
    }
};

my $sv = 1;
say 'REFCNT = ', get_ref_cnt( $sv );

$ perl aaa.pl
REFCNT = 1

関数の引数であるSV *svは、
ScalarValueの略なので、要は$のついた変数の代わり。

Perlは参照カウント駆動のガベージコレクトを採用している(*1)ので、
いくつの変数から参照されているかを調べる関数を作ってみた。

SvREFCNT()は、大文字から始まっているので、
たぶんマクロと思われる。
newSViv()は、IntegerValue(整数)を受け取って変数を生成する。
生成した変数は、Perlの管轄でメモリ管理されているので破棄する必要はない。
その代わり、必要以上に参照されていると破棄されないので、
それを調べる方法として、参照カウンタの値を取得する関数を定義した。

さて、今度はどうだろう?

use v5.14;
use strict;
use warnings;

use Inline C => q{
    SV * get_ref_cnt(SV *sv) {
        SV *ret = newSViv( SvREFCNT(sv) );
        return ret;
    }
};

my $sv = 1;
my $bar = \$sv;
say 'REFCNT = ', get_ref_cnt( $sv );

$ perl bbb.pl
REFCNT = 2

とりあえず、ちゃんと動いてるっぽい。

おしまい。

(*1) http://perldoc.jp/docs/perl/5.20.1/perlguts.pod

Leave a Comment