2013年04月05日
http://blog.livedoor.jp/xaicron/archives/54444878.html
これでどういう感じで調べたのかというのをなんとなく書いてみます。
Changes を見る
まず、なにはともあれ Changes を確認します。自分はよく metacpan を利用しているので、
https://metacpan.org/source/KROKI/Cache-Memcached-Fast-0.20/Changes
らへんをさらっとみます。
または、Pod::Cpandoc というモジュールをインストールすると cpandoc
というコマンドが利用可能になるので
$ cpandoc -c Cache::Memcached::Fast
などとしても良いです。
そんなこんなで以下の様な内容が読み取れます
0.20 2013-04-03 - finally fix magic.t failure. Magic handling introduced in 0.18 wasn't correct until this release. Upgrade if you use Perl 'tie' feature or its derivatives like Readonly. Changes since 0.19: Fix RT#57150, RT#67106: magic.t failure. Thanks to <listposter@...> for instructions on how to reproduce the problem. Fix RT#77254: typo in POD documentation. Tnanks to Alex <alex112358@...>. Fix RT#81782: Unnecessary string eval in constructor. Thanks to Andrew Holland for the patch.
ここで RT#57150
とか出て来ました。これは何でしょうか?
もちろん twitter の RT (Re-tweet) ではありません。実は CPAN にはバグトラッカーがあって、RT (Request Tracker) *1 というのを利用しているのでそれの名前です。
つまり、これはバグのチケット番号です。以下の URL にアクセスすると詳細がみられます。
https://rt.cpan.org/Ticket/Display.html?id=57150
でもいちいちこんなの手打ちできないので自分は bookmarklet 使ってます。
(function() { var id = prompt("Please enter RT ticket id"); if (!id) { return; } location.href = "https://rt.cpan.org/Ticket/Display.html?id=" + id; })()
と、みせかけて詳細見るのめんどいですね。
コードの diff を見る
ぶっちゃけ、いきなり diff 見るのが早い。百聞は一見に如かず。
というわけで、metacpan で diff を見ましょう。
https://metacpan.org/release/Cache-Memcached-Fast
のページに行って、Tools のドロップダウンリストから比較したいバージョンを指定しましょう。
そうすると、以下の様な画面になるので、好きなだけ diff を見られます。やった!
というわけで、晴れて以下の様なコードが追加されているっぽいことがわかりますね。
+/* + When SvPV() is called on a magic SV the result of mg_get() is cached + in PV slot. Since we pass around pointers to this storage we have + to avoid value refetch and reallocation that would happen if + mg_get() is called again. Because any magic SV may be put to the + argument list more than once we create a temporal copies of them, + thus braking possible ties and ensuring that every argument is + fetched exactly once. +*/ +static inline +char * +SvPV_stable_storage(SV *sv, STRLEN *lp) +{ + if (SvGAMAGIC(sv)) + sv = sv_2mortal(newSVsv(sv)); + + return SvPV(sv, *lp); +}
SvGAMAGIC を調べる
これはまぁ、SV に magic があるかどうかとかを調べるマクロなんですが、実際になにやっているのかよくわからんちんですね。
perl のソースは見ることがよくあるので、手元に大体おいてあります。ない人は今すぐ wget !
まぁどうせ sv.h に定義してあると思うけど、とりあえず ack してみます。
$ ack SvGAMAGIC *.h sv.h 899:=for apidoc Am|U32|SvGAMAGIC|SV* sv 912:#define SvGAMAGIC(sv) (SvGMAGICAL(sv) || SvAMAGIC(sv))
912 行目にありました。
で、適当にマクロを追っていくと最終的に
#define SVs_GMG 0x00200000 /* has magical get method */
が立っているかを調べている事がわかります。
これが立っていると、SV を取得する前になんかする Hook があるという事になる模様です。詳しくは
https://github.com/gfx/YAPC-Asia-2009-gfx
を御覧ください。
結論
というわけで、magic ついてるような値を Cache::Memcached::Fast に通常は入れないので、特に急いで上げる必要がないという判断です。
ちなみに、SvGAMAGIC() の呼び出しが増えていますが、せいぜいナノ秒単位の差でしょうから何も気にすることはありません。
どちらかと言うと、ドキュメントの typo が直ったことが、version 0.20 の見どころかもしれませんね!
まとめ
metacpan 便利。
あと、metacpan の RSS を取るとか、twitter で @cpan_new をフォローするとか、lingr で perl_jp に join するなどすれば、リアルタイムで CPAN モジュールの更新を追えてあら便利ですね。
更新内容がよくわからなかったら気軽に質問するとよいですね。
コメント一覧
この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
更新された場合に、より良く、より面白いかもしれ
子供はなぜ不審に思ったのか説明できないからとりあえずその人の特徴的な行動を言っただけでそれが悪いと思ってるわけじゃないと思うぞ
たとえ隠れてやっていてもそれは同じ。
子供は大人のコピーしかできない。
たとえ隠れてやっていてもそれは同じ。
子供は大人のコピーしかできない。
たとえ隠れてやっていてもそれは同じ。
子供は大人のコピーしかできない。