YAML::Syck のパッチ更新しました

id:charsbar さんが ActivePerl で試してくださいまして,間違ってるよとのことだったので,昨日のパッチを修正しました。ありがとうございます。

具体的には Perl 5.8.7 以前だと SvRV_set() というマクロが定義されてないようです。SvRV_set() で何をしているのかというと,bad alias が発生した後に,対応する anchor のノードを登録する際,bad alias を参照している RV の参照先をダミーオブジェクトから新ノードに付け替えているんです。

しかし,そもそも SvRV() というマクロの定義自体,5.8.8 では

#define SvRV(sv) ((XRV*)  SvANY(sv))->xrv_rv

となっていて内部ポインタを露出させているだけなので,

SvRV_set(rv, new_hv);

となっているところを

SvRV(rv) = new_hv;

とするだけでよさそうだな…と思いましたが,perl-current で PERL_DEBUG_COW というマクロが定義されている場合,SvRV() マクロは参照専用となってしまっているのでよろしくない。と,いうことで,結局 charsbar さんの案に手を加えまして*1

#ifndef SvRV_set
#define SvRV_set(sv, val) \
    STMT_START { \
        (SvRV(sv) = (val)); } STMT_END
#endif

としました。5.8.8 で無理矢理 redefine してうまく動くか調べたんですが,5.8.7 以前での挙動を調べてません。

テストにもいくつか自分でクリティカルかなぁと思うところを追加したので,来週中には RT にあげようかと思います。本体があがっちゃうと困るしね。

*1:SV 構造体のフィールド名等構造が変わっていると困るんで