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
とりあえず、ちゃんと動いてるっぽい。
おしまい。
Leave a Comment