タグ

ブックマーク / gfx.hatenadiary.org (4)

  • Test::LeakTrace 0.07 - Islands in the byte stream (legacy)

    Devel::LeakTraceもそうだが,0.07以前のTest::LeakTraceは不可解な値を報告することがあった。 $ perl -MDevel::LeakTrace::Fast -e 'my $a; my $b = \$a' leaked SV(0x0x8f87dd8) from -e line 1 leaked SV(0x0x8f87c94) from -e line 1 $ perl -MTest::LeakTrace::Script -le -e 'my $a; my $b = \$a' leaked SCALAR(0x9f4cdd8) from -e line 1. $ 「Test::LeakTraceをCPANにあげた」の記事でも,目的の相互参照だけでなく,空のハッシュが報告されている。 長らくこれが何なのか分からなかったのだが,この現象のメカニズムをどうやら特定でき

    Test::LeakTrace 0.07 - Islands in the byte stream (legacy)
    nurai
    nurai 2009/03/05
  • Re: XSの勉強を始めるためのエントリーポイントは? - Islands in the byte stream (legacy)

    Re: XSの勉強を始めるためのエントリーポイントは? あまり参考にならないかもしれませんが,私がXSを勉強するにあたっては,CPANのモジュールのソースコードを読むより実際に書いてみるのが一番だと思います。ただし,何か特定の目的があって,そのために関係がありそうなコードを探して読む,ということは非常によくあります。 以下,思いついたことを適当に並べてみます。 自分でコードを書いてみて初めて分かることが少なくない 学ぶのに適した理想的なコードは,そう簡単には見つからない 古い書き方やおかしな書き方をしているコードも大量にあるので,そういうコードをフィルタリングするためにも,いろいろな作者のコードを読んだほうがいい 多くのコードの中から理想的な部分を抜き出して,それを身につけていく 目的とまったく関係ないコードから閃きを得ることも多い perlのソースコードをすぐ参照できるようにしておくのは

    Re: XSの勉強を始めるためのエントリーポイントは? - Islands in the byte stream (legacy)
    nurai
    nurai 2009/01/22
  • strict無効化の誤謬 - Islands in the byte stream (legacy)

    シンボルテーブルを操作するときに"no strict 'refs'"で一時的にstrictを無効化することはよくあるが,デバッグしにくいバグが紛れ込む可能性がある。 たとえば,以下のようにアクセサを動的に生成するコードはCPANのそこかしこにある。 sub make_accessor{ my($class, $property) = @_; no strict 'refs'; # simple read-only accessor *{$class. '::' . $property} = sub{ my($self) = @_; return $self->{$property}; } } このようなコードによって生成されたメソッドを,正しくオブジェクトに対して使う分には問題ない。しかし,このメソッドをクラスメソッドとして呼び出すと,グローバル変数${$self}を参照し,その値をハッシ

    strict無効化の誤謬 - Islands in the byte stream (legacy)
  • モダンなXSの書き方 - Islands in the byte stream (legacy)

    PerlのソースコードはPerl言語以上に変化が大きく,それに伴ってXSの書き方もだいぶ変わってきている。新しいAPIを使ったほうが可読性がよかったり高速だったり使いやすかったりする。 たとえば,スカラー(SV)から文字列(PV: pointer valueつまりchar*)を得るAPIの変遷は次のようになっている。 /* SV*からPVを得る古い書き方 */ STRLEN len; const char* pv = SvPV(pv, len); # pvとlen両方ほしいとき const char* pv_only = SvPV(pv, PL_na); # pvだけほしいとき /* その後SvPV_nolen()が追加され,PL_naはdeprecatedに */ const char* pv_only = SvPV_nolen(pv); /* 今は*_constが追加されたのでcons

    モダンなXSの書き方 - Islands in the byte stream (legacy)
    nurai
    nurai 2009/01/16
  • 1