@@ -309,7 +309,7 @@ BCinfo {
309309// struct Bigint is defined in pycore_dtoa.h.
310310typedef struct Bigint Bigint ;
311311
312- #ifndef Py_USING_MEMORY_DEBUGGER
312+ #if !defined( Py_NOGIL ) && !defined( Py_USING_MEMORY_DEBUGGER )
313313
314314/* Memory management: memory is allocated from, and returned to, Kmax+1 pools
315315 of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
@@ -428,7 +428,7 @@ Bfree(Bigint *v)
428428 }
429429}
430430
431- #endif /* Py_USING_MEMORY_DEBUGGER */
431+ #endif /* !defined(Py_NOGIL) && !defined( Py_USING_MEMORY_DEBUGGER) */
432432
433433#define Bcopy (x ,y ) memcpy((char *)&x->sign, (char *)&y->sign, \
434434 y->wds*sizeof(Long) + 2*sizeof(int))
@@ -673,7 +673,7 @@ mult(Bigint *a, Bigint *b)
673673static Bigint *
674674pow5mult (Bigint * b , int k )
675675{
676- Bigint * b1 , * p5 , * p51 ;
676+ Bigint * b1 , * p5 , * * p5s ;
677677 int i ;
678678 static const int p05 [3 ] = { 5 , 25 , 125 };
679679
@@ -685,19 +685,12 @@ pow5mult(Bigint *b, int k)
685685
686686 if (!(k >>= 2 ))
687687 return b ;
688+ assert (k < (1 << (Bigint_Pow5max )));
688689 PyInterpreterState * interp = _PyInterpreterState_GET ();
689- p5 = interp -> dtoa .p5s ;
690- if (!p5 ) {
691- /* first time */
692- p5 = i2b (625 );
693- if (p5 == NULL ) {
694- Bfree (b );
695- return NULL ;
696- }
697- interp -> dtoa .p5s = p5 ;
698- p5 -> next = 0 ;
699- }
690+ p5s = interp -> dtoa .p5s ;
700691 for (;;) {
692+ p5 = * p5s ;
693+ p5s ++ ;
701694 if (k & 1 ) {
702695 b1 = mult (b , p5 );
703696 Bfree (b );
@@ -707,17 +700,6 @@ pow5mult(Bigint *b, int k)
707700 }
708701 if (!(k >>= 1 ))
709702 break ;
710- p51 = p5 -> next ;
711- if (!p51 ) {
712- p51 = mult (p5 ,p5 );
713- if (p51 == NULL ) {
714- Bfree (b );
715- return NULL ;
716- }
717- p51 -> next = 0 ;
718- p5 -> next = p51 ;
719- }
720- p5 = p51 ;
721703 }
722704 return b ;
723705}
@@ -2811,3 +2793,42 @@ _Py_dg_dtoa(double dd, int mode, int ndigits,
28112793}
28122794
28132795#endif // _PY_SHORT_FLOAT_REPR == 1
2796+
2797+ PyStatus
2798+ _PyDtoa_Init (PyInterpreterState * interp )
2799+ {
2800+ #if _PY_SHORT_FLOAT_REPR == 1 && !defined(Py_USING_MEMORY_DEBUGGER )
2801+ Bigint * * p5s = interp -> dtoa .p5s ;
2802+
2803+ // 5**4 = 625
2804+ Bigint * p5 = i2b (625 );
2805+ if (p5 == NULL ) {
2806+ return PyStatus_NoMemory ();
2807+ }
2808+ p5s [0 ] = p5 ;
2809+
2810+ // compute 5**8, 5**16, 5**32, ..., 5**256
2811+ for (Py_ssize_t i = 1 ; i < Bigint_Pow5max ; i ++ ) {
2812+ p5 = mult (p5 , p5 );
2813+ if (p5 == NULL ) {
2814+ return PyStatus_NoMemory ();
2815+ }
2816+ p5s [i ] = p5 ;
2817+ }
2818+
2819+ #endif
2820+ return PyStatus_Ok ();
2821+ }
2822+
2823+ void
2824+ _PyDtoa_Fini (PyInterpreterState * interp )
2825+ {
2826+ #if _PY_SHORT_FLOAT_REPR == 1 && !defined(Py_USING_MEMORY_DEBUGGER )
2827+ Bigint * * p5s = interp -> dtoa .p5s ;
2828+ for (Py_ssize_t i = 0 ; i < Bigint_Pow5max ; i ++ ) {
2829+ Bigint * p5 = p5s [i ];
2830+ p5s [i ] = NULL ;
2831+ Bfree (p5 );
2832+ }
2833+ #endif
2834+ }
0 commit comments