@@ -81,6 +81,14 @@ typedef struct {
81
81
PyObject * Rational ;
82
82
83
83
PyObject * SignalTuple ;
84
+
85
+ /* External C-API functions */
86
+ binaryfunc _py_long_multiply ;
87
+ binaryfunc _py_long_floor_divide ;
88
+ ternaryfunc _py_long_power ;
89
+ unaryfunc _py_float_abs ;
90
+ PyCFunction _py_long_bit_length ;
91
+ PyCFunction _py_float_as_integer_ratio ;
84
92
} decimal_state ;
85
93
86
94
static decimal_state global_state ;
@@ -2299,14 +2307,6 @@ PyDecType_FromLongExact(PyTypeObject *type, PyObject *v,
2299
2307
return dec ;
2300
2308
}
2301
2309
2302
- /* External C-API functions */
2303
- static binaryfunc _py_long_multiply ;
2304
- static binaryfunc _py_long_floor_divide ;
2305
- static ternaryfunc _py_long_power ;
2306
- static unaryfunc _py_float_abs ;
2307
- static PyCFunction _py_long_bit_length ;
2308
- static PyCFunction _py_float_as_integer_ratio ;
2309
-
2310
2310
/* Return a PyDecObject or a subtype from a PyFloatObject.
2311
2311
Conversion is exact. */
2312
2312
static PyObject *
@@ -2322,8 +2322,8 @@ PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
2322
2322
uint32_t status = 0 ;
2323
2323
mpd_context_t maxctx ;
2324
10000
2324
2325
- #ifdef Py_DEBUG
2326
2325
decimal_state * state = GLOBAL_STATE ();
2326
+ #ifdef Py_DEBUG
2327
2327
assert (PyType_IsSubtype (type , state -> PyDec_Type ));
2328
2328
#endif
2329
2329
if (PyLong_Check (v )) {
@@ -2358,21 +2358,21 @@ PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
2358
2358
}
2359
2359
2360
2360
/* absolute value of the float */
2361
- tmp = _py_float_abs (v );
2361
+ tmp = state -> _py_float_abs (v );
2362
2362
if (tmp == NULL ) {
2363
2363
return NULL ;
2364
2364
}
2365
2365
2366
2366
/* float as integer ratio: numerator/denominator */
2367
- n_d = _py_float_as_integer_ratio (tmp , NULL );
2367
+ n_d = state -> _py_float_as_integer_ratio (tmp , NULL );
2368
2368
Py_DECREF (tmp );
2369
2369
if (n_d == NULL ) {
2370
2370
return NULL ;
2371
2371
}
2372
2372
n = PyTuple_GET_ITEM (n_d , 0 );
2373
2373
d = PyTuple_GET_ITEM (n_d , 1 );
2374
2374
2375
- tmp = _py_long_bit_length (d , NULL );
2375
+ tmp = state -> _py_long_bit_length (d , NULL );
2376
2376
if (tmp == NULL ) {
2377
2377
Py_DECREF (n_d );
2378
2378
return NULL ;
@@ -3660,14 +3660,14 @@ dec_as_integer_ratio(PyObject *self, PyObject *args UNUSED)
3660
3660
goto error ;
3661
3661
}
3662
3662
3663
- Py_SETREF (exponent , _py_long_power (tmp , exponent , Py_None ));
3663
+ Py_SETREF (exponent , state -> _py_long_power (tmp , exponent , Py_None ));
3664
3664
Py_DECREF (tmp );
3665
3665
if (exponent == NULL ) {
3666
3666
goto error ;
3667
3667
}
3668
3668
3669
3669
if (exp >= 0 ) {
3670
- Py_SETREF (numerator , _py_long_multiply (numerator , exponent ));
3670
+ Py_SETREF (numerator , state -> _py_long_multiply (numerator , exponent ));
3671
3671
if (numerator == NULL ) {
3672
3672
goto error ;
3673
3673
}
@@ -3683,12 +3683,12 @@ dec_as_integer_ratio(PyObject *self, PyObject *args UNUSED)
3683
3683
if (tmp == NULL ) {
3684
3684
goto error ;
3685
3685
}
3686
- Py_SETREF (numerator , _py_long_floor_divide (numerator , tmp ));
3686
+ Py_SETREF (numerator , state -> _py_long_floor_divide (numerator , tmp ));
3687
3687
if (numerator == NULL ) {
3688
3688
Py_DECREF (tmp );
3689
3689
goto error ;
3690
3690
}
3691
- Py_SETREF (denominator , _py_long_floor_divide (denominator , tmp ));
3691
+ Py_SETREF (denominator , state -> _py_long_floor_divide (denominator , tmp ));
3692
3692
Py_DECREF (tmp );
3693
3693
if (denominator == NULL ) {
3694
3694
goto error ;
@@ -5834,13 +5834,14 @@ PyInit__decimal(void)
5834
5834
decimal_state * state = GLOBAL_STATE ();
5835
5835
5836
5836
/* Init external C-API functions */
5837
- _py_long_multiply = PyLong_Type .tp_as_number -> nb_multiply ;
5838
- _py_long_floor_divide = PyLong_Type .tp_as_number -> nb_floor_divide ;
5839
- _py_long_power = PyLong_Type .tp_as_number -> nb_power ;
5840
- _py_float_abs = PyFloat_Type .tp_as_number -> nb_absolute ;
5841
- ASSIGN_PTR (_py_float_as_integer_ratio , cfunc_noargs (& PyFloat_Type ,
5842
- "as_integer_ratio" ));
5843
- ASSIGN_PTR (_py_long_bit_length , cfunc_noargs (& PyLong_Type , "bit_length" ));
5837
+ state -> _py_long_multiply = PyLong_Type .tp_as_number -> nb_multiply ;
5838
+ state -> _py_long_floor_divide = PyLong_Type .tp_as_number -> nb_floor_divide ;
5839
+ state -> _py_long_power = PyLong_Type .tp_as_number -> nb_power ;
5840
+ state -> _py_float_abs = PyFloat_Type .tp_as_number -> nb_absolute ;
5841
+ ASSIGN_PTR (state -> _py_float_as_integer_ratio ,
5842
+ cfunc_noargs (& PyFloat_Type , "as_integer_ratio" ));
5843
+ ASSIGN_PTR (state -> _py_long_bit_length ,
5844
+ cfunc_noargs (& PyLong_Type , "bit_length" ));
5844
5845
5845
5846
5846
5847
/* Init types */
0 commit comments