66
77import struct
88from io import BytesIO
9+ from functools import wraps
910
1011__all__ = ["Error" , "Packer" , "Unpacker" , "ConversionError" ]
1112
@@ -31,6 +32,16 @@ def __str__(self):
3132class ConversionError (Error ):
3233 pass
3334
35+ def raise_conversion_error (function ):
36+ """ Wrap any raised struct.errors in a ConversionError. """
37+
38+ @wraps (function )
39+ def result (self , value ):
40+ try :
41+ return function (self , value )
42+ except struct .error as e :
43+ raise ConversionError (e .args [0 ]) from None
44+ return result
3445
3546
3647class Packer :
@@ -47,9 +58,11 @@ def get_buffer(self):
4758 # backwards compatibility
4859 get_buf = get_buffer
4960
61+ @raise_conversion_error
5062 def pack_uint (self , x ):
5163 self .__buf .write (struct .pack ('>L' , x ))
5264
65+ @raise_conversion_error
5366 def pack_int (self , x ):
5467 self .__buf .write (struct .pack ('>l' , x ))
5568
@@ -60,20 +73,24 @@ def pack_bool(self, x):
6073 else : self .__buf .write (b'\0 \0 \0 \0 ' )
6174
6275 def pack_uhyper (self , x ):
63- self .pack_uint (x >> 32 & 0xffffffff )
64- self .pack_uint (x & 0xffffffff )
76+ try :
77+ self .pack_uint (x >> 32 & 0xffffffff )
78+ except (TypeError , struct .error ) as e :
79+ raise ConversionError (e .args [0 ]) from None
80+ try :
81+ self .pack_uint (x & 0xffffffff )
82+ except (TypeError , struct .error ) as e :
83+ raise ConversionError (e .args [0 ]) from None
6584
6685 pack_hyper = pack_uhyper
6786
87+ @raise_conversion_error
6888 def pack_float (self , x ):
69- try : self .__buf .write (struct .pack ('>f' , x ))
70- except struct .error as msg :
71- raise ConversionError (msg )
89+ self .__buf .write (struct .pack ('>f' , x ))
7290
91+ @raise_conversion_error
7392 def pack_double (self , x ):
74- try : self .__buf .write (struct .pack ('>d' , x ))
75- except struct .error as msg :
76- raise ConversionError (msg )
93+ self .__buf .write (struct .pack ('>d' , x ))
7794
7895 def pack_fstring (self , n , s ):
7996 if n < 0 :
0 commit comments