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