|
55 | 55 | #define BOUNDS_CHECK(x, MIN, MAX) x = (x < MIN || MAX < x) ? MAX : x |
56 | 56 |
|
57 | 57 |
|
| 58 | +/* _Py_DEC_MINALLOC >= MPD_MINALLOC */ |
| 59 | +#define _Py_DEC_MINALLOC 4 |
| 60 | + |
58 | 61 | typedef struct { |
59 | 62 | PyObject_HEAD |
60 | | - mpd_t *dec; |
| 63 | + mpd_t dec; |
| 64 | + mpd_uint_t data[_Py_DEC_MINALLOC]; |
61 | 65 | } PyDecObject; |
62 | 66 |
|
63 | 67 | typedef struct { |
@@ -90,7 +94,7 @@ static PyTypeObject PyDecContextManager_Type; |
90 | 94 | #define PyDec_Check(v) PyObject_TypeCheck(v, &PyDec_Type) |
91 | 95 | #define PyDecSignalDict_Check(v) (Py_TYPE(v) == PyDecSignalDict_Type) |
92 | 96 | #define PyDecContext_Check(v) PyObject_TypeCheck(v, &PyDecContext_Type) |
93 | | -#define MPD(v) (((PyDecObject *)v)->dec) |
| 97 | +#define MPD(v) (&((PyDecObject *)v)->dec) |
94 | 98 | #define SdFlagAddr(v) (((PyDecSignalDictObject *)v)->flags) |
95 | 99 | #define SdFlags(v) (*((PyDecSignalDictObject *)v)->flags) |
96 | 100 | #define CTX(v) (&((PyDecContextObject *)v)->ctx) |
@@ -1789,35 +1793,33 @@ static PyTypeObject PyDecContextManager_Type = |
1789 | 1793 | static PyObject * |
1790 | 1794 | PyDecType_New(PyTypeObject *type) |
1791 | 1795 | { |
1792 | | - PyObject *dec; |
| 1796 | + PyDecObject *dec; |
1793 | 1797 |
|
1794 | 1798 | if (type == &PyDec_Type) { |
1795 | | - dec = (PyObject *)PyObject_New(PyDecObject, &PyDec_Type); |
| 1799 | + dec = PyObject_New(PyDecObject, &PyDec_Type); |
1796 | 1800 | } |
1797 | 1801 | else { |
1798 | | - dec = type->tp_alloc(type, 0); |
| 1802 | + dec = (PyDecObject *)type->tp_alloc(type, 0); |
1799 | 1803 | } |
1800 | 1804 | if (dec == NULL) { |
1801 | 1805 | return NULL; |
1802 | 1806 | } |
1803 | 1807 |
|
1804 | | - MPD(dec) = mpd_qnew(); |
1805 | | - if (MPD(dec) == NULL) { |
1806 | | - Py_DECREF(dec); |
1807 | | - PyErr_NoMemory(); |
1808 | | - return NULL; |
1809 | | - } |
| 1808 | + MPD(dec)->flags = MPD_STATIC|MPD_STATIC_DATA; |
| 1809 | + MPD(dec)->exp = 0; |
| 1810 | + MPD(dec)->digits = 0; |
| 1811 | + MPD(dec)->len = 0; |
| 1812 | + MPD(dec)->alloc = _Py_DEC_MINALLOC; |
| 1813 | + MPD(dec)->data = dec->data; |
1810 | 1814 |
|
1811 | | - return dec; |
| 1815 | + return (PyObject *)dec; |
1812 | 1816 | } |
1813 | 1817 | #define dec_alloc() PyDecType_New(&PyDec_Type) |
1814 | 1818 |
|
1815 | 1819 | static void |
1816 | 1820 | dec_dealloc(PyObject *dec) |
1817 | 1821 | { |
1818 | | - if (MPD(dec)) { |
1819 | | - mpd_del(MPD(dec)); |
1820 | | - } |
| 1822 | + mpd_del(MPD(dec)); |
1821 | 1823 | Py_TYPE(dec)->tp_free(dec); |
1822 | 1824 | } |
1823 | 1825 |
|
@@ -5342,7 +5344,7 @@ PyInit__decimal(void) |
5342 | 5344 | mpd_reallocfunc = PyMem_Realloc; |
5343 | 5345 | mpd_callocfunc = mpd_callocfunc_em; |
5344 | 5346 | mpd_free = PyMem_Free; |
5345 | | - mpd_setminalloc(4); |
| 5347 | + mpd_setminalloc(_Py_DEC_MINALLOC); |
5346 | 5348 |
|
5347 | 5349 |
|
5348 | 5350 | /* Init types */ |
|
0 commit comments