10000 gh-106078: Move static variables initialized once to decimal module global state by CharlieZhao95 · Pull Request #106475 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

8000 Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Move Rational and SignalTuple
  • Loading branch information
CharlieZhao95 committed Jul 10, 2023
commit 6b64f7bb0af894ce081ad4c692a59b424f6b9ca5
23 changes: 13 additions & 10 deletions Modules/_decimal/_decimal.c
85CF
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,11 @@ typedef struct {
PyObject *extended_context_template;

PyObject *round_map[_PY_DEC_ROUND_GUARD];

/* Convert rationals for comparison */
PyObject *Rational;

PyObject *SignalTuple;
} decimal_state;

static decimal_state global_state;
Expand Down Expand Up @@ -563,11 +568,11 @@ signaldict_len(PyObject *self UNUSED)
return SIGNAL_MAP_LEN;
}

static PyObject *SignalTuple;
static PyObject *
signaldict_iter(PyObject *self UNUSED)
{
return PyTuple_Type.tp_iter(SignalTuple);
decimal_state *state = GLOBAL_STATE();
return PyTuple_Type.tp_iter(state->SignalTuple);
}

static PyObject *
Expand Down Expand Up @@ -2990,8 +2995,6 @@ convert_op(int type_err, PyObject **conv, PyObject *v, PyObject *context)
/* Implicit conversions to Decimal for comparison */
/******************************************************************************/

/* Convert rationals for comparison */
static PyObject *Rational = NULL;
static PyObject *
multiply_by_denominator(PyObject *v, PyObject *r, PyObject *context)
{
Expand Down Expand Up @@ -3120,7 +3123,7 @@ convert_op_cmp(PyObject **vcmp, PyObject **wcmp, PyObject *v, PyObject *w,
}
}
else {
int is_rational = PyObject_IsInstance(w, Rational);
int is_rational = PyObject_IsInstance(w, state->Rational);
if (is_rational < 0) {
*wcmp = NULL;
}
Expand Down Expand Up @@ -5868,7 +5871,7 @@ PyInit__decimal(void)
(PyObject *)state->PyDec_Type));
Py_CLEAR(obj);
/* Rational is a global variable used for fraction comparisons. */
ASSIGN_PTR(Rational, PyObject_GetAttrString(numbers, "Rational"));
ASSIGN_PTR(state->Rational, PyObject_GetAttrString(numbers, "Rational"));
/* Done with numbers, Number */
Py_CLEAR(numbers);
Py_CLEAR(Number);
Expand Down Expand Up @@ -5915,7 +5918,7 @@ PyInit__decimal(void)
CHECK_INT(PyModule_AddType(m, (PyTypeObject *)state->DecimalException));

/* Create signal tuple */
ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));
ASSIGN_PTR(state->SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));

/* Add exceptions that correspond to IEEE signals */
for (i = SIGNAL_MAP_LEN-1; i >= 0; i--) {
Expand Down Expand Up @@ -5956,7 +5959,7 @@ PyInit__decimal(void)
CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));

/* add to signal tuple */
PyTuple_SET_ITEM(SignalTuple, i, Py_NewRef(cm->ex));
PyTuple_SET_ITEM(state->SignalTuple, i, Py_NewRef(cm->ex));
}

/*
Expand Down Expand Up @@ -6048,11 +6051,11 @@ PyInit__decimal(void)
Py_CLEAR(obj); /* GCOV_NOT_REACHED */
Py_CLEAR(numbers); /* GCOV_NOT_REACHED */
Py_CLEAR(Number); /* GCOV_NOT_REACHED */
Py_CLEAR(Rational); /* GCOV_NOT_REACHED */
Py_CLEAR(state->Rational); /* GCOV_NOT_REACHED */
Py_CLEAR(collections); /* GCOV_NOT_REACHED */
Py_CLEAR(collections_abc); /* GCOV_NOT_REACHED */
Py_CLEAR(MutableMapping); /* GCOV_NOT_REACHED */
Py_CLEAR(SignalTuple); /* GCOV_NOT_REACHED */
Py_CLEAR(state->SignalTuple); /* GCOV_NOT_REACHED */
Py_CLEAR(state->DecimalTuple); /* GCOV_NOT_REACHED */
Py_CLEAR(state->default_context_template); /* GCOV_NOT_REACHED */
#ifndef WITH_DECIMAL_CONTEXTVAR
Expand Down
0