pyderasn.py | 27 ++++++++++++++++----------- diff --git a/pyderasn.py b/pyderasn.py index d41b0a4b4bbe51a385eb564c86807e4d8c83e4be9e8e4a7b1cb5e97bb049e610..ef4146be4d705b169271ecc2c582231071981ed0cee66e360ac1f00617796fea 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -555,6 +555,8 @@ from six import indexbytes from six import int2byte from six import integer_types from six import iterbytes +from six import iteritems +from six import itervalues from six import PY2 from six import string_types from six import text_type @@ -1861,7 +1863,7 @@ return self._value < their._value @property def named(self): - for name, value in self.specs.items(): + for name, value in iteritems(self.specs): if value == self._value: return name @@ -2243,7 +2245,7 @@ ) @property def named(self): - return [name for name, bit in self.specs.items() if self[bit]] + return [name for name, bit in iteritems(self.specs) if self[bit]] def __call__( self, @@ -3355,7 +3357,7 @@ def _value_sanitize(self, value): if isinstance(value, self.__class__): value = value._value elif isinstance(value, integer_types): - for _value in self.specs.values(): + for _value in itervalues(self.specs): if _value == value: break else: @@ -4067,7 +4069,7 @@ self._assert_ready() return self._value[1].encode() def _decode(self, tlv, offset, decode_path, ctx, tag_only): - for choice, spec in self.specs.items(): + for choice, spec in iteritems(self.specs): sub_decode_path = decode_path + (choice,) try: spec.decode( @@ -4552,7 +4554,7 @@ self._value = default_obj.copy()._value @property def ready(self): - for name, spec in self.specs.items(): + for name, spec in iteritems(self.specs): value = self._value.get(name) if value is None: if spec.optional: @@ -4567,7 +4569,7 @@ @property def bered(self): if self.expl_lenindef or self.lenindef or self.ber_encoded: return True - return any(value.bered for value in self._value.values()) + return any(value.bered for value in itervalues(self._value)) def copy(self): obj = self.__class__(schema=self.specs) @@ -4581,7 +4583,7 @@ obj.vlen = self.vlen obj.expl_lenindef = self.expl_lenindef obj.lenindef = self.lenindef obj.ber_encoded = self.ber_encoded - obj._value = {k: v.copy() for k, v in self._value.items()} + obj._value = {k: v.copy() for k, v in iteritems(self._value)} return obj def __eq__(self, their): @@ -4642,7 +4644,7 @@ return None def _encoded_values(self): raws = [] - for name, spec in self.specs.items(): + for name, spec in iteritems(self.specs): value = self._value.get(name) if value is None: if spec.optional: @@ -4708,7 +4710,7 @@ sub_offset = offset + tlen + llen values = {} ber_encoded = False ctx_allow_default_values = ctx.get("allow_default_values", False) - for name, spec in self.specs.items(): + for name, spec in iteritems(self.specs): if spec.optional and ( (lenindef and v[:EOC_LEN].tobytes() == EOC) or len(v) == 0 @@ -4902,6 +4904,9 @@ raws.sort() v = b"".join(raws) return b"".join((self.tag, len_encode(len(v)), v)) + def _specs_items(self): + return iteritems(self.specs) + def _decode(self, tlv, offset, decode_path, ctx, tag_only): try: t, tlen, lv = tag_strip(tlv) @@ -4956,11 +4961,11 @@ ber_encoded = False ctx_allow_default_values = ctx.get("allow_default_values", False) ctx_allow_unordered_set = ctx.get("allow_unordered_set", False) value_prev = memoryview(v[:0]) - specs_items = self.specs.items + while len(v) > 0: if lenindef and v[:EOC_LEN].tobytes() == EOC: break - for name, spec in specs_items(): + for name, spec in self._specs_items(): sub_decode_path = decode_path + (name,) try: spec.decode(