@@ -5574,8 +5574,6 @@ static PyTypeObject PyDecContext_Type =
5574
5574
/* C-API */
5575
5575
/****************************************************************************/
5576
5576
5577
- static void * _decimal_api [CPYTHON_DECIMAL_MAX_API ];
5578
-
5579
5577
/* Simple API */
5580
5578
static int
5581
5579
PyDec_TypeCheck (const PyObject * v )
@@ -5699,9 +5697,22 @@ PyDec_GetConst(const PyObject *v)
5699
5697
return MPD (v );
5700
5698
}
5701
5699
5700
+ static void
5701
+ destroy_api (PyObject * capsule )
5702
+ {
5703
+ void * capi = PyCapsule_GetPointer (capsule , PyDec_CAPSULE_NAME );
5704
+ PyMem_Free (capi );
5705
+ }
5706
+
5702
5707
static PyObject *
5703
5708
init_api (void )
5704
5709
{
5710
+ void * * _decimal_api = PyMem_Calloc (CPYTHON_DECIMAL_MAX_API , sizeof (void * ));
5711
+ if (_decimal_api == NULL ) {
5712
+ PyErr_NoMemory ();
5713
+ return NULL ;
5714
+ }
5715
+
5705
5716
/* Simple API */
5706
5717
_decimal_api [PyDec_TypeCheck_INDEX ] = (void * )PyDec_TypeCheck ;
5707
5718
_decimal_api [PyDec_IsSpecial_INDEX ] = (void * )PyDec_IsSpecial ;
@@ -5716,7 +5727,11 @@ init_api(void)
5716
5727
_decimal_api [PyDec_Get_INDEX ] = (void * )PyDec_Get ;
5717
5728
_decimal_api [PyDec_GetConst_INDEX ] = (void * )PyDec_GetConst ;
5718
5729
5719
- return PyCapsule_New (_decimal_api , "_decimal._API" , NULL );
5730
+ PyObject * capsule = PyCapsule_New (_decimal_api , PyDec_CAPSULE_NAME , destroy_api );
5731
+ if (!capsule ) {
5732
+ PyMem_Free (_decimal_api );
5733
+ }
5734
+ return capsule ;
5720
5735
}
5721
5736
5722
5737
@@ -6080,8 +6095,7 @@ PyInit__decimal(void)
6080
6095
CHECK_INT (PyModule_AddStringConstant (m , "__libmpdec_version__" , mpd_version ()));
6081
6096
6082
6097
/* Add capsule API */
6083
- Py_INCREF (capsule );
6084
- if (PyModule_AddObject (m , "_API" , capsule ) < 0 ) {
6098
+ if (PyModule_AddObjectRef (m , "_API" , capsule ) < 0 ) {
6085
6099
goto error ;
6086
6100
}
6087
6101
@@ -6107,6 +6121,7 @@ PyInit__decimal(void)
6107
6121
Py_CLEAR (basic_context_template ); /* GCOV_NOT_REACHED */
6108
6122
Py_CLEAR (extended_context_template ); /* GCOV_NOT_REACHED */
6109
6123
Py_CLEAR (m ); /* GCOV_NOT_REACHED */
6124
+ Py_CLEAR (capsule ); /* GCOV_NOT_REACHED */
6110
6125
6111
6126
return NULL ; /* GCOV_NOT_REACHED */
6112
6127
}
0 commit comments