12

私はmod_perl-Apache-Perlの互換性に関連するある種の調査を行っています。最近、Perl5.14.2を使用してmod_perl2.0.4をビルドしようとしました。コンパイルフェーズがエラーで途中で終了しました:

modperl_perl.c: In function ‘modperl_perl_core_global_init’:
modperl_perl.c:58:9: error: lvalue required as left operand of assignment

この場所に次のコードが書かれています:

    GvCV(gv) = get_cv(cglobals->sub_name, TRUE);

このエラーを生成する可能性のあるものを検索して、以前のバージョンのPerlとPerl 5.14(CORE / gv.h)の違いを見つけました。

    #define GvCV(gv) (GvGP(gv)->gp_cv)   /* previous versions */

vs

    #define GvCV(gv) (0+GvGP(gv)->gp_cv)  /* in Perl 5.14 */

これを定義から削除する0+と、mod_perl 2.0.4を正常にコンパイルできます。これは、以前のバージョンと比較し て左辺値0+...として認識されないため、問題ありません。

GvCVの定義で使用されるのはなぜ0+ですか?それは必要ですか?GvCV(gv)または、それを削除して、以前のバージョンのPerlのように定義しても安全ですか?

4

1 に答える 1

13

この変更をプッシュしたコミットはこれです。

短いログ:

GvCV_set()およびGvGP_set()マクロを追加します。

GvCV()とGvGP()を右辺値のみにします。

これは、将来のコミットでGVとCV間のバックリファレンスマジックを排除できるようにするためのものであり、gp_cvスロットへの割り当てを完全に制御する必要があります。

したがって、その目的は、0+これらのマクロを右辺値にすることです。mod_perlマクロを元に戻すことはある時点で無効になるため、新しいセマンティクスに一致するようにコードを更新するのを待つ方がよいでしょう。(その「将来のコミット」がすでに実装されているかどうかはわかりません。)

関連するディスカッション:http ://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

于 2012-05-12T13:15:44.133 に答える