@@ -309,7 +309,7 @@ BCinfo {
309
309
// struct Bigint is defined in pycore_dtoa.h.
310
310
typedef struct Bigint Bigint ;
311
311
312
- #ifndef Py_USING_MEMORY_DEBUGGER
312
+ #if !defined( Py_NOGIL ) && !defined( Py_USING_MEMORY_DEBUGGER )
313
313
314
314
/* Memory management: memory is allocated from, and returned to, Kmax+1 pools
315
315
of memory, where pool k (0 <= k <= Kmax) is for Bigints b with b->maxwds ==
@@ -428,7 +428,7 @@ Bfree(Bigint *v)
428
428
}
429
429
}
430
430
431
- #endif /* Py_USING_MEMORY_DEBUGGER */
431
+ #endif /* !defined(Py_NOGIL) && !defined( Py_USING_MEMORY_DEBUGGER) */
432
432
433
433
#define Bcopy (x ,y ) memcpy((char *)&x->sign, (char *)&y->sign, \
434
434
y->wds*sizeof(Long) + 2*sizeof(int))
@@ -673,7 +673,7 @@ mult(Bigint *a, Bigint *b)
673
673
static Bigint *
674
674
pow5mult (Bigint * b , int k )
675
675
{
676
- Bigint * b1 , * p5 , * p51 ;
676
+ Bigint * b1 , * p5 , * * p5s ;
677
677
int i ;
678
678
static const int p05 [3 ] = { 5 , 25 , 125 };
679
679
@@ -685,19 +685,12 @@ pow5mult(Bigint *b, int k)
685
685
686
686
if (!(k >>= 2 ))
687
687
return b ;
688
+ assert (k < (1 << (Bigint_Pow5max )));
688
689
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 ;
700
691
for (;;) {
692
+ p5 = * p5s ;
693
+ p5s ++ ;
701
694
if (k & 1 ) {
702
695
b1 = mult (b , p5 );
703
696
Bfree (b );
@@ -707,17 +700,6 @@ pow5mult(Bigint *b, int k)
707
700
}
708
701
if (!(k >>= 1 ))
709
702
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 ;
721
703
}
722
704
return b ;
723
705
}
@@ -2811,3 +2793,42 @@ _Py_dg_dtoa(double dd, int mode, int ndigits,
2811
2793
}
2812
2794
2813
2795
#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