XS ソースコードリーディング - List::Util編 -
 perlXStut(perlXStut - XSUB を書くためのチュートリアル)も一通り読み終わったので、perlxs(perlxs - XS言語リファレンスマニュアル)を参考にしつつ、実際に XS で書かれた CPAN モジュールのソースコードを読んでみることにした。。

 で、とりあえずは、動作が分かりやすい List::Util から読んでみたら、面白いコードがあった。

void
min(...)
PROTOTYPE: @
ALIAS:
min = 0
max = 1
CODE:
{
int index;
NV retval;
SV *retsv;
if(!items) {
XSRETURN_UNDEF;
}
retsv = ST(0);
retval = slu_sv_value(retsv);
for(index = 1 ; index < items ; index++) {
SV *stacksv = ST(index);
NV val = slu_sv_value(stacksv);
if(val < retval ? !ix : ix) {
retsv = stacksv;
retval = val;
}
}
ST(0) = retsv;
XSRETURN(1);
}

 ALIAS というキーワードを使うと、同じ関数を異なる名前で呼び出すことができ、呼ばれた名前に従って ix という変数に値がセットされるらしい。上のコードの例で言うと、min が呼ばれたときは ix に 0 が、max が呼ばれたときは ix に 1 がセットされる。なので、
val < retval ? !ix : ix 
というコードは、min が呼ばれたときには
val < retval ? true : false
という意味になり、max が呼ばれたときには
val < retval ? false : true
という意味になる。

 なるほどなぁ。

参考:perlxs - XS言語リファレンスマニュアル
ALIAS: というキーワードは、XSUB に対して二つ以上のユニークな Perl での名前を持たせ、また、起動されたときに使われている(そういったユニークな Perl での) 名前を知るための手段を持たせます。 Perl での名前は完全修飾されたパッケージ名とすることができます。それぞれの別名はインデックスとして与えられます。コンパイラは、使用される別名のインデックスが格納されている ix と呼ばれる変数をセットアップします。 XSUB が ix という名前と共に呼び出されたとき、その値は 0 となります。

[PR]
by fkmn | 2008-07-08 23:55 | IT
<< 「ゆの in hoge」という... perlXStut を少し読ん... >>


とあるWebアプリケーションエンジニアの日記
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
カテゴリ
以前の記事
ブログパーツ
リンク
検索
タグ
最新のトラックバック
プログラミングが「出来る..
from とりあえず9JP?
Genographic ..
from ナンジャモンジャ
ジュセリーノ
from ありの出来事
くちこみブログ集(ライフ..
from くちこみブログ集(ライフ)(..
以降、丁寧語で行こう!
from エッセイ的な何か
その他のジャンル
ファン
記事ランキング
ブログジャンル
画像一覧

fkmnの最近読んだ本 フィードメーター - フッ君の日常 あわせて読みたい AX