@@ -708,12 +708,33 @@ _PyLong_Sign(PyObject *vv)
708708 return Py_SIZE (v ) == 0 ? 0 : (Py_SIZE (v ) < 0 ? -1 : 1 );
709709}
710710
711+ /* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
712+ 2**k if d is nonzero, else 0. */
713+
714+ static const unsigned char BitLengthTable [32 ] = {
715+ 0 , 1 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
716+ 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5
717+ };
718+
719+ static int
720+ bits_in_digit (digit d )
721+ {
722+ int d_bits = 0 ;
723+ while (d >= 32 ) {
724+ d_bits += 6 ;
725+ d >>= 6 ;
726+ }
727+ d_bits += (int )BitLengthTable [d ];
728+ return d_bits ;
729+ }
730+
711731size_t
712732_PyLong_NumBits (PyObject * vv )
713733{
714734 PyLongObject * v = (PyLongObject * )vv ;
715735 size_t result = 0 ;
716736 Py_ssize_t ndigits ;
737+ int msd_bits ;
717738
718739 assert (v != NULL );
719740 assert (PyLong_Check (v ));
@@ -724,12 +745,10 @@ _PyLong_NumBits(PyObject *vv)
724745 if ((size_t )(ndigits - 1 ) > SIZE_MAX / (size_t )PyLong_SHIFT )
725746 goto Overflow ;
726747 result = (size_t )(ndigits - 1 ) * (size_t )PyLong_SHIFT ;
727- do {
728- ++ result ;
729- if (result == 0 )
730- goto Overflow ;
731- msd >>= 1 ;
732- } while (msd );
748+ msd_bits = bits_in_digit (msd );
749+ if (SIZE_MAX - msd_bits < result )
750+ goto Overflow ;
751+ result += msd_bits ;
733752 }
734753 return result ;
735754
@@ -1414,26 +1433,6 @@ PyLong_AsLongLongAndOverflow(PyObject *vv, int *overflow)
14141433 Py_RETURN_NOTIMPLEMENTED; \
14151434 } while(0)
14161435
1417- /* bits_in_digit(d) returns the unique integer k such that 2**(k-1) <= d <
1418- 2**k if d is nonzero, else 0. */
1419-
1420- static const unsigned char BitLengthTable [32 ] = {
1421- 0 , 1 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 ,
1422- 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5 , 5
1423- };
1424-
1425- static int
1426- bits_in_digit (digit d )
1427- {
1428- int d_bits = 0 ;
1429- while (d >= 32 ) {
1430- d_bits += 6 ;
1431- d >>= 6 ;
1432- }
1433- d_bits += (int )BitLengthTable [d ];
1434- return d_bits ;
1435- }
1436-
14371436/* x[0:m] and y[0:n] are digit vectors, LSD first, m >= n required. x[0:n]
14381437 * is modified in place, by adding y to it. Carries are propagated as far as
14391438 * x[m-1], and the remaining carry (0 or 1) is returned.
@@ -5079,7 +5078,8 @@ static PyObject *
50795078long_bit_length (PyLongObject * v )
50805079{
50815080 PyLongObject * result , * x , * y ;
5082- Py_ssize_t ndigits , msd_bits = 0 ;
5081+ Py_ssize_t ndigits ;
5082+ int msd_bits ;
50835083 digit msd ;
50845084
50855085 assert (v != NULL );
@@ -5090,11 +5090,7 @@ long_bit_length(PyLongObject *v)
50905090 return PyLong_FromLong (0 );
50915091
50925092 msd = v -> ob_digit [ndigits - 1 ];
5093- while (msd >= 32 ) {
5094- msd_bits += 6 ;
5095- msd >>= 6 ;
5096- }
5097- msd_bits += (long )(BitLengthTable [msd ]);
5093+ msd_bits = bits_in_digit (msd );
50985094
50995095 if (ndigits <= PY_SSIZE_T_MAX /PyLong_SHIFT )
51005096 return PyLong_FromSsize_t ((ndigits - 1 )* PyLong_SHIFT + msd_bits );
0 commit comments