2012-05-12 3 views
11

私はmod_perl-Apache-Perlとの互換性に関する何らかの調査をしています。最近、Perl 5.14.2を使ってmod_perl 2.0.4をビルドしようとしました。Perl 5.14でGvGCの(0 + GvGP(gv) - > gp_cv)定義を使用するのはなぜですか?

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

定義から、この 0+取り外しは

mod_perlの2.0.4が正常にコンパイルされることを可能にし、0+...は以前のバージョンに比べ左辺として認識されないので、これは問題です。

GVCVの定義に0+が使用されているのはなぜですか?それを削除して、以前のバージョンのPerlのようにGvCV(gv)の定義を持つことは安全ですか?

+2

+1よく研究質問を。 – pilcrow

答えて

12

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

ショートログ:

add GvCV_set() and GvGP_set() macros.

and make GvCV() and GvGP() rvalue-only.

This it to allow a future commit to eliminate some backref magic between GV and CVs, which will require complete control over assignment to the gp_cv slot.

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

関連の議論:http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

+2

したがって、* lvalues *としてCVの使用をなくすために、この '0 +'接頭辞が追加され、開発者は代わりに 'GvCV_set()'を使用します。そして、この '0 +'プレフィックスを削除するのは安全ではありません。私は正しく理解しましたか? mod_perlについて:Perl 5.14で正常にコンパイルされた新しいバージョンがあります(ちょうど 'GvCV_set()'が使われています)。 2.0.4は古いものです。あなたの答えは、私が期待したものに十分近いと思います。ありがとう。 – ArtM

+0

はい、それは '物事を理解する方法。 – Mat

+0

@ArtMはい、それはまさにそれです。 – ikegami

関連する問題