@@ -284,18 +284,45 @@ getmultibytecodec(void)
284284 return _PyImport_GetModuleAttrString ("_multibytecodec" , "__create_codec" );
285285}
286286
287+ static void
288+ destroy_codec_capsule (PyObject * capsule )
289+ {
290+ void * ptr = PyCapsule_GetPointer (capsule , CODEC_CAPSULE );
291+ codec_capsule * data = (codec_capsule * )ptr ;
292+ Py_DECREF (data -> cjk_module );
293+ PyMem_Free (ptr );
294+ }
295+
296+ static codec_capsule *
297+ capsulate_codec (PyObject * mod , const MultibyteCodec * codec )
298+ {
299+ codec_capsule * data = PyMem_Malloc (sizeof (codec_capsule ));
300+ if (data == NULL ) {
301+ PyErr_NoMemory ();
302+ return NULL ;
303+ }
304+ data -> codec = codec ;
305+ data -> cjk_module = Py_NewRef (mod );
306+ return data ;
307+ }
308+
287309static PyObject *
288- _getcodec (const MultibyteCodec * codec )
310+ _getcodec (PyObject * self , const MultibyteCodec * codec )
289311{
290312 PyObject * cofunc = getmultibytecodec ();
291313 if (cofunc == NULL ) {
292314 return NULL ;
293315 }
294316
295- PyObject * codecobj = PyCapsule_New ((void * )codec ,
296- PyMultibyteCodec_CAPSULE_NAME ,
297- NULL );
317+ codec_capsule * data = capsulate_codec (self , codec );
318+ if (data == NULL ) {
319+ Py_DECREF (cofunc );
320+ return NULL ;
321+ }
322+ PyObject * codecobj = PyCapsule_New (data , CODEC_CAPSULE ,
323+ destroy_codec_capsule );
298324 if (codecobj == NULL ) {
325+ PyMem_Free (data );
299326 Py_DECREF (cofunc );
300327 return NULL ;
301328 }
@@ -323,7 +350,7 @@ getcodec(PyObject *self, PyObject *encoding)
323350 for (int i = 0 ; i < st -> num_codecs ; i ++ ) {
324351 const MultibyteCodec * codec = & st -> codec_list [i ];
325352 if (strcmp (codec -> encoding , enc ) == 0 ) {
326- return _getcodec (codec );
353+ return _getcodec (self , codec );
327354 }
328355 }
329356
@@ -352,8 +379,7 @@ register_maps(PyObject *module)
352379 char mhname [256 ] = "__map_" ;
353380 strcpy (mhname + sizeof ("__map_" ) - 1 , h -> charset );
354381
355- PyObject * capsule = PyCapsule_New ((void * )h ,
356- PyMultibyteCodec_CAPSULE_NAME , NULL );
382+ PyObject * capsule = PyCapsule_New ((void * )h , MAP_CAPSULE , NULL );
357383 if (capsule == NULL ) {
358384 return -1 ;
359385 }
@@ -417,14 +443,14 @@ importmap(const char *modname, const char *symbol,
417443 o = PyObject_GetAttrString (mod , symbol );
418444 if (o == NULL )
419445 goto errorexit ;
420- else if (!PyCapsule_IsValid (o , PyMultibyteCodec_CAPSULE_NAME )) {
446+ else if (!PyCapsule_IsValid (o , MAP_CAPSULE )) {
421447 PyErr_SetString (PyExc_ValueError ,
422448 "map data must be a Capsule." );
423449 goto errorexit ;
424450 }
425451 else {
426452 struct dbcs_map * map ;
427- map = PyCapsule_GetPointer (o , PyMultibyteCodec_CAPSULE_NAME );
453+ map = PyCapsule_GetPointer (o , MAP_CAPSULE );
428454 if (encmap != NULL )
429455 * encmap = map -> encmap ;
430456 if (decmap != NULL )
0 commit comments