@@ -1390,6 +1390,10 @@ context_new(PyTypeObject *type, PyObject *args UNUSED, PyObject *kwds UNUSED)
1390
1390
CtxCaps (self ) = 1 ;
1391
1391
self -> tstate = NULL ;
1392
1392
1393
+ if (type == state -> PyDecContext_Type ) {
1394
+ PyObject_GC_Track (self );
1395
+ }
1396
+ assert (PyObject_GC_IsTracked ((PyObject * )self ));
1393
1397
return (PyObject * )self ;
1394
1398
}
1395
1399
@@ -2038,6 +2042,10 @@ PyDecType_New(PyTypeObject *type)
2038
2042
MPD (dec )-> alloc = _Py_DEC_MINALLOC ;
2039
2043
MPD (dec )-> data = dec -> data ;
2040
2044
2045
+ if (type == state -> PyDec_Type ) {
2046
+ PyObject_GC_Track (dec );
2047
+ }
2048
+ assert (PyObject_GC_IsTracked ((PyObject * )dec ));
2041
2049
return (PyObject * )dec ;
2042
2050
}
2043
2051
#define dec_alloc (st ) PyDecType_New((st)->PyDec_Type)
@@ -6143,8 +6151,22 @@ decimal_clear(PyObject *module)
6143
6151
Py_CLEAR (state -> SignalTuple );
6144
6152
Py_CLEAR (state -> PyDecimal );
6145
6153
6146
- PyMem_Free (state -> signal_map );
6147
- PyMem_Free (state -> cond_map );
6154
+ if (state -> signal_map != NULL ) {
6155
+ for (DecCondMap * cm = state -> signal_map ; cm -> name != NULL ; cm ++ ) {
6156
+ Py_DECREF (cm -> ex );
6157
+ }
6158
+ PyMem_Free (state -> signal_map );
6159
+ state -> signal_map = NULL ;
6160
+ }
6161
+
6162
+ if (state -> cond_map != NULL ) {
6163
+ // cond_map[0].ex has borrowed a reference from signal_map[0].ex
6164
+ for (DecCondMap * cm = state -> cond_map + 1 ; cm -> name != NULL ; cm ++ ) {
6165
+ Py_DECREF (cm -> ex );
6166
+ }
6167
+ PyMem_Free (state -> cond_map );
6168
+ state -> cond_map = NULL ;
6169
+ }
6148
6170
return 0 ;
6149
6171
}
6150
6172
0 commit comments