diff options
author | Stefan Krah <skrah@bytereef.org> | 2012-11-07 22:12:25 (GMT) |
---|---|---|
committer | Stefan Krah <skrah@bytereef.org> | 2012-11-07 22:12:25 (GMT) |
commit | f4abc7b8a016da5b1783f471f2f376d7e9c27d60 (patch) | |
tree | c4b211cbec57136a5fd25b019fd10008e630b6cf /Modules/_decimal | |
parent | 33363f43e34defa17ad958ad6d718328f9e78db8 (diff) | |
download | cpython-f4abc7b8a016da5b1783f471f2f376d7e9c27d60.zip cpython-f4abc7b8a016da5b1783f471f2f376d7e9c27d60.tar.gz cpython-f4abc7b8a016da5b1783f471f2f376d7e9c27d60.tar.bz2 |
Issue #16431: Use the type information when constructing a Decimal subtype
from a Decimal argument.
Diffstat (limited to 'Modules/_decimal')
-rw-r--r-- | Modules/_decimal/_decimal.c | 29 |
1 files changed, 27 insertions, 2 deletions
diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 996f9da..0bc484f 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -2338,6 +2338,32 @@ PyDecType_FromFloat(PyTypeObject *type, PyObject *v, return dec; } +/* Return a new PyDecObject (subtype) from a Decimal. */ +static PyObject * +PyDecType_FromDecimalExact(PyTypeObject *type, PyObject *v, PyObject *context) +{ + PyObject *dec; + uint32_t status = 0; + + if (type == &PyDec_Type) { + Py_INCREF(v); + return v; + } + + dec = PyDecType_New(type); + if (dec == NULL) { + return NULL; + } + + mpd_qcopy(MPD(dec), MPD(v), &status); + if (dec_addstatus(context, status)) { + Py_DECREF(dec); + return NULL; + } + + return dec; +} + static PyObject * sequence_as_tuple(PyObject *v, PyObject *ex, const char *mesg) { @@ -2642,8 +2668,7 @@ PyDecType_FromObjectExact(PyTypeObject *type, PyObject *v, PyObject *context) return PyDecType_FromSsizeExact(type, 0, context); } else if (PyDec_Check(v)) { - Py_INCREF(v); - return v; + return PyDecType_FromDecimalExact(type, v, context); } else if (PyUnicode_Check(v)) { return PyDecType_FromUnicodeExactWS(type, v, context); |