@@ -1858,18 +1858,13 @@ save_long(PicklerObject *self, PyObject *obj)
18581858 PyObject * repr = NULL ;
18591859 Py_ssize_t size ;
18601860 long val ;
1861+ int overflow ;
18611862 int status = 0 ;
18621863
1863- const char long_op = LONG ;
1864-
1865- val = PyLong_AsLong (obj );
1866- if (val == -1 && PyErr_Occurred ()) {
1867- /* out of range for int pickling */
1868- PyErr_Clear ();
1869- }
1870- else if (self -> bin &&
1871- (sizeof (long ) <= 4 ||
1872- (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1 )))) {
1864+ val = PyLong_AsLongAndOverflow (obj , & overflow );
1865+ if (!overflow && (sizeof (long ) <= 4 ||
1866+ (val <= 0x7fffffffL && val >= (-0x7fffffffL - 1 ))))
1867+ {
18731868 /* result fits in a signed 4-byte integer.
18741869
18751870 Note: we can't use -0x80000000L in the above condition because some
@@ -1882,31 +1877,35 @@ save_long(PicklerObject *self, PyObject *obj)
18821877 char pdata [32 ];
18831878 Py_ssize_t len = 0 ;
18841879
1885- pdata [ 1 ] = ( unsigned char )( val & 0xff );
1886- pdata [2 ] = (unsigned char )(( val >> 8 ) & 0xff );
1887- pdata [3 ] = (unsigned char )((val >> 16 ) & 0xff );
1888- pdata [4 ] = (unsigned char )((val >> 24 ) & 0xff );
1889-
1890- if (( pdata [ 4 ] == 0 ) && ( pdata [ 3 ] == 0 )) {
1891- if (pdata [2 ] = = 0 ) {
1892- pdata [0 ] = BININT1 ;
1893- len = 2 ;
1880+ if ( self -> bin ) {
1881+ pdata [1 ] = (unsigned char )(val & 0xff );
1882+ pdata [2 ] = (unsigned char )((val >> 8 ) & 0xff );
1883+ pdata [3 ] = (unsigned char )((val >> 16 ) & 0xff );
1884+ pdata [ 4 ] = ( unsigned char )(( val >> 24 ) & 0xff );
1885+
1886+ if (( pdata [4 ] != 0 ) || ( pdata [ 3 ] ! = 0 ) ) {
1887+ pdata [0 ] = BININT ;
1888+ len = 5 ;
18941889 }
1895- else {
1890+ else if ( pdata [ 2 ] != 0 ) {
18961891 pdata [0 ] = BININT2 ;
18971892 len = 3 ;
18981893 }
1894+ else {
1895+ pdata [0 ] = BININT1 ;
1896+ len = 2 ;
1897+ }
18991898 }
19001899 else {
1901- pdata [ 0 ] = BININT ;
1902- len = 5 ;
1900+ sprintf ( pdata , "%c%ld\n" , INT , val ) ;
1901+ len = strlen ( pdata ) ;
19031902 }
1904-
19051903 if (_Pickler_Write (self , pdata , len ) < 0 )
19061904 return -1 ;
19071905
19081906 return 0 ;
19091907 }
1908+ assert (!PyErr_Occurred ());
19101909
19111910 if (self -> proto >= 2 ) {
19121911 /* Linear-time pickling. */
@@ -1986,6 +1985,7 @@ save_long(PicklerObject *self, PyObject *obj)
19861985 goto error ;
19871986 }
19881987 else {
1988+ const char long_op = LONG ;
19891989 const char * string ;
19901990
19911991 /* proto < 2: write the repr and newline. This is quadratic-time (in
0 commit comments