2012-05-12 14 views
11

Tôi đang thực hiện một số nghiên cứu liên quan đến khả năng tương thích mod_perl-Apache-Perl. Gần đây tôi đã cố gắng xây dựng mod_perl 2.0.4 bằng Perl 5.14.2. Giai đoạn biên soạn đã được chấm dứt sớm với một lỗi:Tại sao Perl 5.14 sử dụng định nghĩa (0 + GvGP (gv) -> gp_cv) cho GvGC?

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

Ở vị trí này, các mã sau đây được viết:

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

Tìm kiếm những gì có thể tạo ra lỗi này, tôi đã tìm thấy một sự khác biệt giữa các phiên bản trước của Perl và 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 */ 

Loại bỏ 0+ này từ định nghĩa cho phép mod_perl 2.0.4 được biên dịch thành công, và điều này là tốt vì 0+... không được công nhận như một giá trị trái so với phiên bản trước.

Tại sao là 0+ được sử dụng trong định nghĩa của GvCV và có cần thiết không? hoặc là nó an toàn để loại bỏ nó và có định nghĩa của GvCV(gv) như trong các phiên bản trước của Perl?

+2

+1 câu hỏi được nghiên cứu kỹ. – pilcrow

Trả lời

12

Cam kết đẩy thay đổi này là this one.

ngắn log:

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.

Vì vậy, mục đích của 0+ đó là chính xác để làm cho những macro rvalues ​​. Bạn nên chờ đợi mod_perl để cập nhật mã của nó để phù hợp với ngữ nghĩa mới, bởi vì việc hoàn nguyên các macro sẽ không hợp lệ tại một số điểm. (Tôi không biết liệu "cam kết trong tương lai" đã được triển khai hay chưa.)

Thảo luận liên quan: http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

+2

Vì vậy, tiền tố '0 +' này được thêm vào để loại bỏ bất kỳ việc sử dụng CV nào làm * lvalues ​​* và làm cho các nhà phát triển sử dụng 'GvCV_set()' thay thế. Và không an toàn để loại bỏ tiền tố '0 +' này. Tôi có hiểu đúng không? về mod_perl: nó có phiên bản mới hơn biên dịch thành công với Perl 5.14 (chỉ cần nhìn, 'GvCV_set()' được sử dụng ở đó); 2.0.4 là phiên bản cũ. Tôi nghĩ câu trả lời của bạn đủ gần với những gì tôi mong đợi. Cảm ơn. – ArtM

+0

Vâng, đó là cách hiểu mọi thứ. – Mat

+0

@ArtM, Vâng, đúng vậy. – ikegami

Các vấn đề liên quan