2012-05-12 3 views
11

Estoy haciendo un tipo de investigación relacionada con la compatibilidad de mod_perl-Apache-Perl. Recientemente traté de construir mod_perl 2.0.4 usando Perl 5.14.2. La fase de compilación se terminó prematuramente con un error:¿Por qué Perl 5.14 usa la definición (0 + GvGP (gv) -> gp_cv) para GvGC?

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

En este lugar el siguiente código está escrito:

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

búsqueda de lo que podría generar este error, he encontrado una diferencia entre las versiones anteriores de Perl y 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 */ 

La eliminación de este 0+ de la definición permite mod_perl 2.0.4 a ser compilado con éxito, y esto está bien porque 0+... no se reconoce como un valor- en comparación con las versiones anteriores.

¿Por qué se usa 0+ en la definición de GvCV y es necesario? ¿o es seguro eliminarlo y tener la definición de GvCV(gv) como en versiones anteriores de Perl?

+2

1 pregunta bien investigado. – pilcrow

Respuesta

12

La confirmación que ha provocado este cambio es this one.

troncos cortos:

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.

Así que el propósito de esa 0+ es precisamente para hacer esas macros rvalues ​​. Será mejor que espere mod_perl para actualizar su código para que coincida con la nueva semántica, porque revertir esas macros no será válido en algún momento. (No sé si ese "futuro Commit" ya está implementado o no.)

discusión relacionada: http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

+2

Por lo tanto, este prefijo '0 +' se agrega para eliminar cualquier uso de CV como * lvalues ​​* y hacer que los desarrolladores usen 'GvCV_set()' en su lugar. Y no es seguro eliminar este prefijo '0 +'. ¿Entendí correctamente? sobre mod_perl: tiene versiones más nuevas que compilan satisfactoriamente con Perl 5.14 (solo se miró, 'GvCV_set()' se usa allí); 2.0.4 es un antiguo. Creo que tu respuesta es lo suficientemente cercana a lo que esperaba. Gracias. – ArtM

+0

Sí, eso 'cómo entiendo las cosas. – Mat

+0

@ArtM, sí, eso es exactamente. – ikegami

Cuestiones relacionadas