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,6 +4035,7 @@ _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 }
@@ -4061,15 +4062,13 @@ _decimal_Decimal_as_integer_ratio_impl(PyObject *self, PyTypeObject *cls)
40614062 goto error ;
40624063 }
40634064 }
4064-
4065- result = PyTuple_Pack (2 , numerator , denominator );
4066-
4065+ return _PyTuple_FromPairSteal (numerator , denominator );
40674066
40684067error :
40694068 Py_XDECREF (exponent );
40704069 Py_XDECREF (denominator );
40714070 Py_XDECREF (numerator );
4072- return result ;
4071+ return NULL ;
40734072}
40744073
40754074/*[clinic input]
@@ -4613,7 +4612,6 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
46134612 PyObject * q , * r ;
46144613 PyObject * context ;
46154614 uint32_t status = 0 ;
4616- PyObject * ret ;
46174615
46184616 decimal_state * state = find_state_left_or_right (v , w );
46194617 CURRENT_CONTEXT (state , context );
@@ -4642,10 +4640,7 @@ nm_mpd_qdivmod(PyObject *v, PyObject *w)
46424640 return NULL ;
46434641 }
46444642
4645- ret = PyTuple_Pack (2 , q , r );
4646- Py_DECREF (r );
4647- Py_DECREF (q );
4648- return ret ;
4643+ return _PyTuple_FromPairSteal (q , r );
46494644}
46504645
46514646static PyObject *
@@ -6674,7 +6669,6 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
66746669 PyObject * a , * b ;
66756670 PyObject * q , * r ;
66766671 uint32_t status = 0 ;
6677- PyObject * ret ;
66786672
66796673 CONVERT_BINOP_RAISE (& a , & b , x , y , context );
66806674 decimal_state * state = get_module_state_from_ctx (context );
@@ -6701,10 +6695,7 @@ _decimal_Context_divmod_impl(PyObject *context, PyObject *x, PyObject *y)
67016695 return NULL ;
67026696 }
67036697
6704- ret = PyTuple_Pack (2 , q , r );
6705- Py_DECREF (r );
6706- Py_DECREF (q );
6707- return ret ;
6698+ return _PyTuple_FromPairSteal (q , r );
67086699}
67096700
67106701/* Binary or ternary arithmetic functions */
@@ -7810,15 +7801,15 @@ _decimal_exec(PyObject *m)
78107801
78117802 switch (cm -> flag ) {
78127803 case MPD_Float_operation :
7813- base = PyTuple_Pack ( 2 , state -> DecimalException , PyExc_TypeError );
7804+ base = _PyTuple_FromPair ( state -> DecimalException , PyExc_TypeError );
78147805 break ;
78157806 case MPD_Division_by_zero :
7816- base = PyTuple_Pack ( 2 , state -> DecimalException ,
7817- PyExc_ZeroDivisionError );
7807+ base = _PyTuple_FromPair ( state -> DecimalException ,
7808+ PyExc_ZeroDivisionError );
78187809 break ;
78197810 case MPD_Overflow :
7820- base = PyTuple_Pack ( 2 , state -> signal_map [INEXACT ].ex ,
7821- state -> signal_map [ROUNDED ].ex );
7811+ base = _PyTuple_FromPair ( state -> signal_map [INEXACT ].ex ,
7812+ state -> signal_map [ROUNDED ].ex );
78227813 break ;
78237814 case MPD_Underflow :
78247815 base = PyTuple_Pack (3 , state -> signal_map [INEXACT ].ex ,
@@ -7857,7 +7848,7 @@ _decimal_exec(PyObject *m)
78577848 for (cm = state -> cond_map + 1 ; cm -> name != NULL ; cm ++ ) {
78587849 PyObject * base ;
78597850 if (cm -> flag == MPD_Division_undefined ) {
7860- base = PyTuple_Pack ( 2 , state -> signal_map [0 ].ex , PyExc_ZeroDivisionError );
7851+ base = _PyTuple_FromPair ( state -> signal_map [0 ].ex , PyExc_ZeroDivisionError );
78617852 }
78627853 else {
78637854 base = PyTuple_Pack (1 , state -> signal_map [0 ].ex );
0 commit comments