mirror of
https://github.com/python/cpython.git
synced 2024-12-04 07:15:09 +08:00
gh-106078: Move external C-API functions to decimal module global state (#106616)
This commit is contained in:
parent
c0c041a31b
commit
e5c32a811c
@ -81,6 +81,14 @@ typedef struct {
|
||||
PyObject *Rational;
|
||||
|
||||
PyObject *SignalTuple;
|
||||
|
||||
/* External C-API functions */
|
||||
binaryfunc _py_long_multiply;
|
||||
binaryfunc _py_long_floor_divide;
|
||||
ternaryfunc _py_long_power;
|
||||
unaryfunc _py_float_abs;
|
||||
PyCFunction _py_long_bit_length;
|
||||
PyCFunction _py_float_as_integer_ratio;
|
||||
} decimal_state;
|
||||
|
||||
static decimal_state global_state;
|
||||
@ -2299,14 +2307,6 @@ PyDecType_FromLongExact(PyTypeObject *type, PyObject *v,
|
||||
return dec;
|
||||
}
|
||||
|
||||
/* External C-API functions */
|
||||
static binaryfunc _py_long_multiply;
|
||||
static binaryfunc _py_long_floor_divide;
|
||||
static ternaryfunc _py_long_power;
|
||||
static unaryfunc _py_float_abs;
|
||||
static PyCFunction _py_long_bit_length;
|
||||
static PyCFunction _py_float_as_integer_ratio;
|
||||
|
||||
/* Return a PyDecObject or a subtype from a PyFloatObject.
|
||||
Conversion is exact. */
|
||||
static PyObject *
|
||||
@ -2322,8 +2322,8 @@ PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
|
||||
uint32_t status = 0;
|
||||
mpd_context_t maxctx;
|
||||
|
||||
#ifdef Py_DEBUG
|
||||
decimal_state *state = GLOBAL_STATE();
|
||||
#ifdef Py_DEBUG
|
||||
assert(PyType_IsSubtype(type, state->PyDec_Type));
|
||||
#endif
|
||||
if (PyLong_Check(v)) {
|
||||
@ -2358,13 +2358,13 @@ PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
|
||||
}
|
||||
|
||||
/* absolute value of the float */
|
||||
tmp = _py_float_abs(v);
|
||||
tmp = state->_py_float_abs(v);
|
||||
if (tmp == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* float as integer ratio: numerator/denominator */
|
||||
n_d = _py_float_as_integer_ratio(tmp, NULL);
|
||||
n_d = state->_py_float_as_integer_ratio(tmp, NULL);
|
||||
Py_DECREF(tmp);
|
||||
if (n_d == NULL) {
|
||||
return NULL;
|
||||
@ -2372,7 +2372,7 @@ PyDecType_FromFloatExact(PyTypeObject *type, PyObject *v,
|
||||
n = PyTuple_GET_ITEM(n_d, 0);
|
||||
d = PyTuple_GET_ITEM(n_d, 1);
|
||||
|
||||
tmp = _py_long_bit_length(d, NULL);
|
||||
tmp = state->_py_long_bit_length(d, NULL);
|
||||
if (tmp == NULL) {
|
||||
Py_DECREF(n_d);
|
||||
return NULL;
|
||||
@ -3660,14 +3660,14 @@ dec_as_integer_ratio(PyObject *self, PyObject *args UNUSED)
|
||||
goto error;
|
||||
}
|
||||
|
||||
Py_SETREF(exponent, _py_long_power(tmp, exponent, Py_None));
|
||||
Py_SETREF(exponent, state->_py_long_power(tmp, exponent, Py_None));
|
||||
Py_DECREF(tmp);
|
||||
if (exponent == NULL) {
|
||||
goto error;
|
||||
}
|
||||
|
||||
if (exp >= 0) {
|
||||
Py_SETREF(numerator, _py_long_multiply(numerator, exponent));
|
||||
Py_SETREF(numerator, state->_py_long_multiply(numerator, exponent));
|
||||
if (numerator == NULL) {
|
||||
goto error;
|
||||
}
|
||||
@ -3683,12 +3683,12 @@ dec_as_integer_ratio(PyObject *self, PyObject *args UNUSED)
|
||||
if (tmp == NULL) {
|
||||
goto error;
|
||||
}
|
||||
Py_SETREF(numerator, _py_long_floor_divide(numerator, tmp));
|
||||
Py_SETREF(numerator, state->_py_long_floor_divide(numerator, tmp));
|
||||
if (numerator == NULL) {
|
||||
Py_DECREF(tmp);
|
||||
goto error;
|
||||
}
|
||||
Py_SETREF(denominator, _py_long_floor_divide(denominator, tmp));
|
||||
Py_SETREF(denominator, state->_py_long_floor_divide(denominator, tmp));
|
||||
Py_DECREF(tmp);
|
||||
if (denominator == NULL) {
|
||||
goto error;
|
||||
@ -5834,13 +5834,14 @@ PyInit__decimal(void)
|
||||
decimal_state *state = GLOBAL_STATE();
|
||||
|
||||
/* Init external C-API functions */
|
||||
_py_long_multiply = PyLong_Type.tp_as_number->nb_multiply;
|
||||
_py_long_floor_divide = PyLong_Type.tp_as_number->nb_floor_divide;
|
||||
_py_long_power = PyLong_Type.tp_as_number->nb_power;
|
||||
_py_float_abs = PyFloat_Type.tp_as_number->nb_absolute;
|
||||
ASSIGN_PTR(_py_float_as_integer_ratio, cfunc_noargs(&PyFloat_Type,
|
||||
"as_integer_ratio"));
|
||||
ASSIGN_PTR(_py_long_bit_length, cfunc_noargs(&PyLong_Type, "bit_length"));
|
||||
state->_py_long_multiply = PyLong_Type.tp_as_number->nb_multiply;
|
||||
state->_py_long_floor_divide = PyLong_Type.tp_as_number->nb_floor_divide;
|
||||
state->_py_long_power = PyLong_Type.tp_as_number->nb_power;
|
||||
state->_py_float_abs = PyFloat_Type.tp_as_number->nb_absolute;
|
||||
ASSIGN_PTR(state->_py_float_as_integer_ratio,
|
||||
cfunc_noargs(&PyFloat_Type, "as_integer_ratio"));
|
||||
ASSIGN_PTR(state->_py_long_bit_length,
|
||||
cfunc_noargs(&PyLong_Type, "bit_length"));
|
||||
|
||||
|
||||
/* Init types */
|
||||
|
@ -449,12 +449,6 @@ Modules/_cursesmodule.c - initialised -
|
||||
Modules/_cursesmodule.c - initialised_setupterm -
|
||||
Modules/_cursesmodule.c - initialisedcolors -
|
||||
Modules/_cursesmodule.c - screen_encoding -
|
||||
Modules/_decimal/_decimal.c - _py_long_multiply -
|
||||
Modules/_decimal/_decimal.c - _py_long_floor_divide -
|
||||
Modules/_decimal/_decimal.c - _py_long_power -
|
||||
Modules/_decimal/_decimal.c - _py_float_abs -
|
||||
Modules/_decimal/_decimal.c - _py_long_bit_length -
|
||||
Modules/_decimal/_decimal.c - _py_float_as_integer_ratio -
|
||||
Modules/_elementtree.c - expat_capi -
|
||||
Modules/readline.c - libedit_append_replace_history_offset -
|
||||
Modules/readline.c - using_libedit_emulation -
|
||||
|
Can't render this file because it has a wrong number of fields in line 4.
|
Loading…
Reference in New Issue
Block a user