2012-05-12 5 views
11

मैं mod_perl-Apache-Perl संगतता से संबंधित किसी प्रकार का शोध कर रहा हूं। हाल ही में मैंने पर्ल 5.14.2 का उपयोग करके mod_perl 2.0.4 बनाने की कोशिश की।जीवीजीसी के लिए परिभाषा (0 + जीवीजीपी (जीवी) -> gp_cv) परिभाषा का उपयोग कर पर्ल 5.14 क्यों है?

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); 

क्या इस त्रुटि उत्पन्न कर सकता है के लिए खोज, मैं के पिछले संस्करणों के बीच एक अंतर पाया है पर्ल और पर्ल 5.14 (कोर/gv.h):

#define GvCV(gv) (GvGP(gv)->gp_cv) /* previous versions */ 

बनाम

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

इस 0+ परिभाषा से निकाला जा रहा है की अनुमति देता है मोड-पर्ल 2.0.4 सफलतापूर्वक संकलित की है, और इस ठीक क्योंकि 0+... एक lvalue पिछले संस्करणों की तुलना में मान्यता प्राप्त नहीं है है।

0+ क्यों जीवीसीवी की परिभाषा में उपयोग किया जाता है और क्या यह आवश्यक है? या इसे हटाने के लिए सुरक्षित है और 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+ के प्रयोजन के उन मैक्रो rvalues ​​ बनाने के लिए ठीक है। नए सेमेटिक्स से मेल खाने के लिए अपने कोड को अपडेट करने के लिए mod_perl के लिए प्रतीक्षा करना बेहतर होगा, क्योंकि थॉस मैक्रोज़ को वापस लेना किसी बिंदु पर अमान्य होगा। (मैं "प्रतिबद्ध भविष्य" यदि पहले से ही लागू किया है कि या नहीं है पता नहीं है।)

संबंधित चर्चा: http://www.nntp.perl.org/group/perl.perl5.porters/2011/01/msg167682.html

+2

तो, यह '0 +' उपसर्ग को सीवी के किसी भी उपयोग को * lvalues ​​* के रूप में समाप्त करने के लिए जोड़ा गया है और डेवलपर्स को इसके बजाय 'GvCV_set()' का उपयोग करें। और यह '0 +' उपसर्ग को हटाने के लिए सुरक्षित नहीं है। क्या मैंने सही ढंग से समझ लिया? mod_perl के बारे में: इसमें पर्ल 5.14 के साथ सफलतापूर्वक संकलित नए संस्करण हैं (बस देखा, 'GvCV_set() 'का उपयोग किया जाता है); 2.0.4 एक पुराना है। मुझे लगता है कि आपका जवाब जो कुछ मैंने अपेक्षित था उसके करीब है। धन्यवाद। – ArtM

+0

हां, वह 'चीजों को कैसे समझता है। – Mat

+0

@ArtM, हां, यह बिल्कुल ठीक है। – ikegami

संबंधित मुद्दे