5

के साथ गणना की गई घटनाएं मैं एक बाइनरी संरचना को रिवर्स इंजीनियर के लिए काटाई स्ट्रक्चर प्राप्त करने की कोशिश कर रहा हूं। seq फ़ील्ड इरादे के अनुसार काम करते हैं, लेकिन instances काम नहीं करते हैं क्योंकि मैं उन्हें चाहता हूं। ,काइटाई संरचना:

types: 
    header: 
    seq: 
     # ... 
     - id: consts 
     type: u8 
     repeat: expr 
     repeat-expr: 0x10 

लेकिन जब मैं निम्नलिखित घोषणा इस्तेमाल करने की कोशिश:

मेरे द्विपदीय प्रारूप स्थिरांक की एक सूची के साथ एक शीर्ष लेख है कि मैं consts सरणी उप क्षेत्र के साथ header क्षेत्र के रूप में पार्स शामिल

instances: 
    index_const: 
    value: '_root.header.consts[idx - 0x40]' 
    if: idx >= 0x40 and idx <= 0x4f 

यह की सरणी में देखकर index_const के मान की गणना करने का इरादा है यदि केवल idx [0x40..0x4f] की सीमा में है।

मैं अपने लक्ष्य भाषा के रूप में अजगर का उपयोग करें और मुझे लगता है कि ऐसा लगता है कि एक कोड जेनरेट करना चाहिए:

@property 
    def index_const(self): 
     if hasattr(self, '_m_index_const'): 
      return self._m_index_const 
     if self.idx >= 64 and self.idx <= 79: 
      self._m_index_const = self._root.header.consts[(self.idx - 64)]; 
      return self._m_index_const 

हालांकि, मैं क्या मिलता है:

@property 
    def index_const(self): 
     if hasattr(self, '_m_index_const'): 
      return self._m_index_const 

     self._m_index_const = self._root.header.consts[(self.idx - 64)]; 
     return self._m_index_const 

यह सिर्फ मुझे है, मैं कर रहा हूँ कुछ स्पष्ट याद आ रही है, या यह कaitई संरचना में एक बग है?

उत्तर

2

हाँ, मुझे लगता है कि इसे एक बग माना जाना चाहिए। कम से कम, संकलक को या तो मान उदाहरणों में if का उपयोग करने की अनुमति देनी चाहिए और इसे ठीक से संसाधित करना चाहिए, या if को अस्वीकार करना चाहिए और एक त्रुटि संदेश जारी करना चाहिए।

इसके बारे में सोच है, मैं क्यों if नियमित instances के लिए अनुमति दी है, लेकिन valueinstances के लिए इस तरह से इलाज किया कोई कारण नहीं देखते हैं।

इसकी रिपोर्ट करने के लिए धन्यवाद, मैंने an issue सबमिट किया है।

+0

धन्यवाद! यह एक दयालु बात है कि यह एक बग है :(वर्कअराउंड पर किसी भी विचार या मुझे बगफिक्स के लिए कितना इंतजार करना चाहिए? –

+0

सबसे आसान कामकाज केवल उस स्थान पर 'if' में है जो आप अपने' index_const' तक पहुंचाना चाहते हैं वास्तविक कोड में ऐसा करना आम तौर पर ठीक है, लेकिन यह केएस आंतरिक अभिव्यक्ति भाषा के लिए कुछ मुश्किल हो सकता है। मैं आपको अद्यतन रखने की कोशिश करूंगा। – GreyCat