@@ -877,15 +877,11 @@ static int _fspacker_packer_ver2_int(packerObject_ver2 *self, PyObject *obj) {
877877 return _fspacker_buffer_append (self->output , &VER2_OP_ZERO_INTERGER, 1 );
878878 }
879879 int isNeg = sign<0 ;
880- Py_ssize_t nbits = _PyLong_NumBits (obj);
881- Py_ssize_t nbytes = (nbits >> 3 )+1 ;
882- if (nbytes > ITEM_LIMIT) {
883- PyErr_SetString (self->module ->PackingError , " Too big integer to pack" );
884- return -1 ;
885- }
886880 PyObject *absVal = NULL ;
887881 unsigned char *pdata = NULL ;
888882 PyObject *repr = NULL ;
883+ Py_ssize_t nbits = 0 ;
884+ Py_ssize_t nbytes = 0 ;
889885 switch (_fspacker_packer_ver2_register (self, obj)) {
890886 case 1 :
891887 goto done;
@@ -894,17 +890,44 @@ static int _fspacker_packer_ver2_int(packerObject_ver2 *self, PyObject *obj) {
894890 case -1 :
895891 return -1 ;
896892 }
897- repr = PyBytes_FromStringAndSize (NULL , nbytes);
898- if (repr == NULL ) {
899- goto memoryError;
900- }
901- pdata = (unsigned char *)PyBytes_AS_STRING (repr);
902- Py_DECREF (repr);
903- absVal = isNeg ? PyNumber_Absolute (obj):NULL ;
904- if (_PyLong_AsByteArray ((PyLongObject *)(absVal != NULL ? absVal:obj), pdata, nbytes, 1 , 0 ) < 0 ) {
905- goto memoryError;
893+ if ( isNeg ) {
894+ absVal = PyNumber_Absolute (obj);
895+ if ( absVal == NULL ) {
896+ goto memoryError;
897+ }
898+ nbits = _PyLong_NumBits (absVal);
899+ nbytes = (nbits >> 3 )+1 ;
900+ if (nbytes > ITEM_LIMIT) {
901+ PyErr_SetString (self->module ->PackingError , " Too big integer to pack" );
902+ goto error;
903+ }
904+ repr = PyBytes_FromStringAndSize (NULL , nbytes);
905+ if (repr == NULL ) {
906+ goto memoryError;
907+ }
908+ pdata = (unsigned char *)PyBytes_AS_STRING (repr);
909+ Py_DECREF (repr);
910+ if (_PyLong_AsByteArray ((PyLongObject *)(absVal), pdata, nbytes, 1 , 0 ) < 0 ) {
911+ goto memoryError;
912+ }
913+ Py_DECREF (absVal);
914+ } else {
915+ nbits = _PyLong_NumBits (obj);
916+ nbytes = (nbits >> 3 )+1 ;
917+ if (nbytes > ITEM_LIMIT) {
918+ PyErr_SetString (self->module ->PackingError , " Too big integer to pack" );
919+ goto error;
920+ }
921+ repr = PyBytes_FromStringAndSize (NULL , nbytes);
922+ if (repr == NULL ) {
923+ goto memoryError;
924+ }
925+ pdata = (unsigned char *)PyBytes_AS_STRING (repr);
926+ Py_DECREF (repr);
927+ if (_PyLong_AsByteArray ((PyLongObject *)(obj), pdata, nbytes, 1 , 0 ) < 0 ) {
928+ goto memoryError;
929+ }
906930 }
907- Py_XDECREF (absVal);
908931 if ((nbytes*8 )-nbits >= 8 ) {
909932 nbytes -= 1 ;
910933 }
0 commit comments