Почему Perl 5.14 использует (0 + GvGP (gv) → gp_cv) определение для GvGC?

Я занимаюсь некоторыми исследованиями, связанными с совместимостью с mod_perl-Apache-Perl. Недавно я попытался создать mod_perl 2.0.4 с помощью Perl 5.14.2. Фаза компиляции была досрочно прекращена с ошибкой:

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 */

против

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

Удаление этого 0+ из определения позволяет скомпилировать mod_perl 2.0.4, и это прекрасно, потому что 0+... не распознается как lvalue по сравнению с предыдущими версиями.

Почему 0+ используется в определении GvCV и нужно ли это? или безопасно удалить его и иметь определение GvCV(gv), как в предыдущих версиях Perl?

Ответ 1

Конец, который нажал это изменение, этот.

Короткая запись:

добавить макросы GvCV_set() и GvGP_set().

и сделайте GvCV() и GvGP() только с rvalue.

Это означает, что он позволяет будущему фиксации устранить магию магии назад GV и CV, что потребует полного контроля над присвоением Слот gp_cv.

Таким образом, цель этого 0+ заключается именно в том, чтобы сделать эти макросы rvalues. Вам будет лучше ждать mod_perl, чтобы обновить его код, чтобы он соответствовал новой семантике, поскольку возврат некоторых макросов в какой-то момент будет недействительным. (Я не знаю, выполнено ли это "будущая фиксация" или нет.)

Связанное обсуждение: http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html