VERSION | 2 +- doc/news.rst | 6 ++++++ pyderasn.py | 48 ++++++++++++++++++++++++------------------------ diff --git a/VERSION b/VERSION index ae93b695fac83ee53e1e7fa1cafe3d225d0bd4f364d2af94be5abc0b693a9027..454e621a24f73c12a1dc8330a78fccc9553c4c6a2c47b6e630804f25d0d3e26e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.7 +4.8 diff --git a/doc/news.rst b/doc/news.rst index 3893a982abd4d0fd62d5130298f2b63c48abe78971ec31a087a075e8d79bbd02..5011eae2d5b15738c40388c7236a7a6a36785b6392237b13ca8f61743a7d01e9 100644 --- a/doc/news.rst +++ b/doc/news.rst @@ -1,6 +1,12 @@ News ==== +.. _release4.8: + +4.8 +--- +* Minor decode speed improvements + .. _release4.7: 4.7 diff --git a/pyderasn.py b/pyderasn.py index 774968dee5b0485689133b9267c7d7015044dac34202aeb220aba7ebc6f0612c..0c97144154de673a1d644bd32f556dbfa812fe5e87cdefa3d6b01c11aff498ba 100755 --- a/pyderasn.py +++ b/pyderasn.py @@ -1551,10 +1551,10 @@ if value is None: self._value = default def _value_sanitize(self, value): + if isinstance(value, bool): + return value if issubclass(value.__class__, Boolean): return value._value - if isinstance(value, bool): - return value raise InvalidValueType((self.__class__, bool)) @property @@ -1800,10 +1800,10 @@ if self._value is None: self._value = default def _value_sanitize(self, value): - if issubclass(value.__class__, Integer): - value = value._value - elif isinstance(value, integer_types): + if isinstance(value, integer_types): pass + elif issubclass(value.__class__, Integer): + value = value._value elif isinstance(value, str): value = self.specs.get(value) if value is None: @@ -2155,8 +2155,6 @@ octets[i] = int(bits[i * 8:(i * 8) + 8], 2) return bit_len, bytes(octets) def _value_sanitize(self, value): - if issubclass(value.__class__, BitString): - return value._value if isinstance(value, (string_types, binary_type)): if ( isinstance(value, string_types) and @@ -2197,6 +2195,8 @@ return self._bits2octets("".join( ("1" if bit in bits else "0") for bit in six_xrange(max(bits) + 1) )) + if issubclass(value.__class__, BitString): + return value._value raise InvalidValueType((self.__class__, binary_type, string_types)) @property @@ -2605,10 +2605,10 @@ num=tag_num, ) def _value_sanitize(self, value): - if issubclass(value.__class__, OctetString): - value = value._value - elif isinstance(value, binary_type): + if isinstance(value, binary_type): pass + elif issubclass(value.__class__, OctetString): + value = value._value else: raise InvalidValueType((self.__class__, bytes)) if not self._bound_min <= len(value) <= self._bound_max: @@ -3708,10 +3708,6 @@ if self._value is None: self._value = default def _value_sanitize(self, value): - if isinstance(value, self.__class__): - return value._value - if isinstance(value, datetime): - return value.strftime(self.fmt).encode("ascii") if isinstance(value, binary_type): try: value_decoded = value.decode("ascii") @@ -3725,6 +3721,10 @@ raise DecodeError("invalid UTCTime format") return value else: raise DecodeError("invalid UTCTime length") + if isinstance(value, self.__class__): + return value._value + if isinstance(value, datetime): + return value.strftime(self.fmt).encode("ascii") raise InvalidValueType((self.__class__, datetime)) def __eq__(self, their): @@ -3810,12 +3810,6 @@ fmt = "%Y%m%d%H%M%SZ" fmt_ms = "%Y%m%d%H%M%S.%fZ" def _value_sanitize(self, value): - if isinstance(value, self.__class__): - return value._value - if isinstance(value, datetime): - return value.strftime( - self.fmt_ms if value.microsecond > 0 else self.fmt - ).encode("ascii") if isinstance(value, binary_type): try: value_decoded = value.decode("ascii") @@ -3842,6 +3836,12 @@ raise DecodeError( "invalid GeneralizedTime length", klass=self.__class__, ) + if isinstance(value, self.__class__): + return value._value + if isinstance(value, datetime): + return value.strftime( + self.fmt_ms if value.microsecond > 0 else self.fmt + ).encode("ascii") raise InvalidValueType((self.__class__, datetime)) def todatetime(self): @@ -3967,8 +3967,6 @@ if value is None: self._value = default_obj.copy()._value def _value_sanitize(self, value): - if isinstance(value, self.__class__): - return value._value if isinstance(value, tuple) and len(value) == 2: choice, obj = value spec = self.specs.get(choice) @@ -3977,6 +3975,8 @@ raise ObjUnknown(choice) if not isinstance(obj, spec.__class__): raise InvalidValueType((spec,)) return (choice, spec(obj)) + if isinstance(value, self.__class__): + return value._value raise InvalidValueType((self.__class__, tuple)) @property @@ -4212,12 +4212,12 @@ self._value = None if value is None else self._value_sanitize(value) self.defined = None def _value_sanitize(self, value): + if isinstance(value, binary_type): + return value if isinstance(value, self.__class__): return value._value if isinstance(value, Obj): return value.encode() - if isinstance(value, binary_type): - return value raise InvalidValueType((self.__class__, Obj, binary_type)) @property