2012-05-12 3 views
11

Ich mache eine Art von Forschung in Bezug auf mod_perl-Apache-Perl-Kompatibilität. Kürzlich habe ich versucht, mod_perl 2.0.4 mit Perl 5.14.2 zu erstellen. Die Kompilation Phase wurde vorzeitig mit einem Fehler abgebrochen:Warum verwendet Perl 5.14 die Definition von (0 + GvGP (gv) -> gp_cv) für GvGC?

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

In diesem Ort der folgende Code geschrieben:

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

Suche nach was diesen Fehler erzeugen könnte, habe ich einen Unterschied zwischen früheren Versionen von gefunden Perl und 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 */ 

diesen 0+ aus der Definition Entfernen ermöglicht 2.0.4 mod_perl erfolgreich kompiliert werden, und das ist in Ordnung, weil 0+... als lvalue nicht erkannt wird im Vergleich zu früheren Versionen.

Warum wird 0+ in der Definition von GvCV verwendet und ist es notwendig? oder ist es sicher, es zu entfernen und die Definition von GvCV(gv) wie in früheren Versionen von Perl zu haben?

+2

+1 gut recherchiert Frage. – pilcrow

Antwort

12

Das Commit, das diese Änderung ausgelöst hat, ist this one.

Kurzholz:

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.

So ist der Zweck dieser 0+ ist genau die Makros rvalues ​​ zu machen. Es wäre besser, wenn Sie darauf warten, dass mod_perl seinen Code aktualisiert, damit er mit der neuen Semantik übereinstimmt, da das Zurücksetzen dieser Makros an einem bestimmten Punkt ungültig ist. (Ich weiß nicht, ob die „künftigen commit“ bereits umgesetzt wird oder nicht.)

Verwandte Diskussion: http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

+2

Also wird dieses '0 +' Präfix hinzugefügt, um jegliche Verwendung von CVs als * lvalues ​​* zu eliminieren und Entwickler 'GvCV_set()' stattdessen verwenden zu lassen. Und es ist nicht sicher, dieses Präfix "0 +" zu entfernen. Habe ich richtig verstanden? über mod_perl: es hat neuere Versionen, die erfolgreich mit Perl 5.14 kompilieren (nur angeschaut, 'GvCV_set()' wird dort benutzt); 2.0.4 ist ein alter. Ich denke deine Antwort ist nah genug an dem, was ich erwartet habe. Vielen Dank. – ArtM

+0

Ja, das 'wie verstehen Dinge. – Mat

+0

@ArtM, Ja, das ist es genau. – ikegami

Verwandte Themen