3232#include <Python.h>
3333#include "pycore_object.h" // _PyObject_VisitType()
3434#include "pycore_pystate.h" // _PyThreadState_GET()
35+ #include "pycore_tuple.h" // _PyTuple_FromPair
3536#include "pycore_typeobject.h"
3637
3738#include <mpdecimal.h>
@@ -3975,7 +3976,6 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
39753976 PyObject * numerator = NULL ;
39763977 PyObject * denominator = NULL ;
39773978 PyObject * exponent = NULL ;
3978- PyObject * result = NULL ;
39793979 PyObject * tmp ;
39803980 mpd_ssize_t exp ;
39813981 PyObject * context ;
@@ -4035,13 +4035,16 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
40354035
40364036 if (exp >= 0 ) {
40374037 Py_SETREF (numerator , state -> _py_long_multiply (numerator , exponent ));
4038+ Py_CLEAR (exponent );
40384039 if (numerator == NULL ) {
40394040 goto error ;
40404041 }
40414042 denominator = PyLong_FromLong (1 );
40424043 if (denominator == NULL ) {
40434044 goto error ;
40444045 }
4046+
4047+ return _PyTuple_FromPairSteal (numerator , denominator );
40454048 }
40464049 else {
40474050 denominator = exponent ;
@@ -4060,16 +4063,14 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
40604063 if (denominator == NULL ) {
40614064 goto error ;
40624065 }
4066+ return _PyTuple_FromPairSteal (numerator , denominator );
40634067 }
40644068
4065- result = PyTuple_Pack (2 , numerator , denominator );
4066-
4067-
40684069error :
40694070 Py_XDECREF (exponent );
40704071 Py_XDECREF (denominator );
40714072 Py_XDECREF (numerator );
4072- return result ;
4073+ return NULL ;
40734074}
40744075
40754076/*[clinic input]
@@ -4613,7 +4614,6 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
46134614 PyObject * q , * r ;
46144615 PyObject * context ;
46154616 uint32_t status = 0 ;
4616- PyObject * ret ;
46174617
46184618 decimal_state * state = find_state_left_or_right (v , w );
46194619 CURRENT_CONTEXT (state , context );
@@ -4642,10 +4642,7 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
46424642 return NULL ;
46434643 }
46444644
4645- ret = PyTuple_Pack (2 , q , r );
4646- Py_DECREF (r );
4647- Py_DECREF (q );
4648- return ret ;
4645+ return _PyTuple_FromPairSteal (q , r );
46494646}
46504647
46514648static PyObject *
@@ -6674,7 +6671,6 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
66746671 PyObject * a , * b ;
66756672 PyObject * q , * r ;
66766673 uint32_t status = 0 ;
6677- PyObject * ret ;
66786674
66796675 CONVERT_BINOP_RAISE (& a , & b , x , y , context );
66806676 decimal_state * state = get_module_state_from_ctx (context );
@@ -6701,10 +6697,7 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
67016697 return NULL ;
67026698 }
67036699
6704- ret = PyTuple_Pack (2 , q , r );
6705- Py_DECREF (r );
6706- Py_DECREF (q );
6707- return ret ;
6700+ return _PyTuple_FromPairSteal (q , r );
67086701}
67096702
67106703/* Binary or ternary arithmetic functions */
@@ -7810,15 +7803,15 @@ _decimal_exec(PyObject *m)
78107803
78117804 switch (cm -> flag ) {
78127805 case MPD_Float_operation :
7813- base = PyTuple_Pack ( 2 , state -> DecimalException , PyExc_TypeError );
7806+ base = _PyTuple_FromPair ( state -> DecimalException , PyExc_TypeError );
78147807 break ;
78157808 case MPD_Division_by_zero :
7816- base = PyTuple_Pack ( 2 , state -> DecimalException ,
7817- PyExc_ZeroDivisionError );
7809+ base = _PyTuple_FromPair ( state -> DecimalException ,
7810+ PyExc_ZeroDivisionError );
78187811 break ;
78197812 case MPD_Overflow :
7820- base = PyTuple_Pack ( 2 , state -> signal_map [INEXACT ].ex ,
7821- state -> signal_map [ROUNDED ].ex );
7813+ base = _PyTuple_FromPair ( state -> signal_map [INEXACT ].ex ,
7814+ state -> signal_map [ROUNDED ].ex );
78227815 break ;
78237816 case MPD_Underflow :
78247817 base = PyTuple_Pack (3 , state -> signal_map [INEXACT ].ex ,
@@ -7857,7 +7850,7 @@ _decimal_exec(PyObject *m)
78577850 for (cm = state -> cond_map + 1 ; cm -> name != NULL ; cm ++ ) {
78587851 PyObject * base ;
78597852 if (cm -> flag == MPD_Division_undefined ) {
7860- base = PyTuple_Pack ( 2 , state -> signal_map [0 ].ex , PyExc_ZeroDivisionError );
7853+ base = _PyTuple_FromPair ( state -> signal_map [0 ].ex , PyExc_ZeroDivisionError );
78617854 }
78627855 else {
78637856 base = PyTuple_Pack (1 , state -> signal_map [0 ].ex );
0 commit comments