@@ -413,7 +413,7 @@ module_from_def_and_spec(
413413 for (cur_slot = def_like -> m_slots ; cur_slot && cur_slot -> slot ; cur_slot ++ ) {
414414 // Macro to copy a non-NULL, non-repeatable slot that's unusable with
415415 // PyModuleDef. The destination must be initially NULL.
416- #define COPY_COMMON_SLOT (SLOT , TYPE , DEST ) \
416+ #define COPY_COMMON_SLOT (SLOT , TYPE , DEST , ORIG_FIELD ) \
417417 do { \
418418 if (!(TYPE)(cur_slot->value)) { \
419419 PyErr_Format( \
@@ -422,7 +422,13 @@ module_from_def_and_spec(
422422 name); \
423423 goto error; \
424424 } \
425- if (original_def) { \
425+ if (ORIG_FIELD) { \
426+ PyErr_Format( \
427+ PyExc_SystemError, \
428+ "module %s: " #SLOT " used with PyModuleDef", \
429+ name); \
430+ } \
431+ else if (original_def) { \
426432 PyErr_Format( \
427433 PyExc_SystemError, \
428434 "module %s: " #SLOT " used with PyModuleDef", \
@@ -453,7 +459,7 @@ module_from_def_and_spec(
453459 case Py_mod_exec :
454460 has_execution_slots = 1 ;
455461 if (!original_def ) {
456- COPY_COMMON_SLOT (Py_mod_exec , _Py_modexecfunc , m_exec );
462+ COPY_COMMON_SLOT (Py_mod_exec , _Py_modexecfunc , m_exec , 0 );
457463 }
458464 break ;
459465 case Py_mod_multiple_interpreters :
@@ -484,33 +490,33 @@ module_from_def_and_spec(
484490 }
485491 break ;
486492 case Py_mod_name :
487- COPY_COMMON_SLOT (Py_mod_name , char * , def_like -> m_name );
493+ COPY_COMMON_SLOT (Py_mod_name , char * , def_like -> m_name , original_def -> m_name );
488494 break ;
489495 case Py_mod_doc :
490- COPY_COMMON_SLOT (Py_mod_doc , char * , def_like -> m_doc );
496+ COPY_COMMON_SLOT (Py_mod_doc , char * , def_like -> m_doc , original_def -> m_doc );
491497 break ;
492498 case Py_mod_state_size :
493499 COPY_COMMON_SLOT (Py_mod_state_size , Py_ssize_t ,
494- def_like -> m_size );
500+ def_like -> m_size , 0 );
495501 break ;
496502 case Py_mod_methods :
497503 COPY_COMMON_SLOT (Py_mod_methods , PyMethodDef * ,
498- def_like -> m_methods );
504+ def_like -> m_methods , 0 );
499505 break ;
500506 case Py_mod_state_traverse :
501507 COPY_COMMON_SLOT (Py_mod_state_traverse , traverseproc ,
502- def_like -> m_traverse );
508+ def_like -> m_traverse , 0 );
503509 break ;
504510 case Py_mod_state_clear :
505511 COPY_COMMON_SLOT (Py_mod_state_clear , inquiry ,
506- def_like -> m_clear );
512+ def_like -> m_clear , 0 );
507513 break ;
508514 case Py_mod_state_free :
509515 COPY_COMMON_SLOT (Py_mod_state_free , freefunc ,
510- def_like -> m_free );
516+ def_like -> m_free , 0 );
511517 break ;
512518 case Py_mod_token :
513- COPY_COMMON_SLOT (Py_mod_token , void * , token );
519+ COPY_COMMON_SLOT (Py_mod_token , void * , token , 0 );
514520 break ;
515521 default :
516522 assert (cur_slot -> slot < 0 || cur_slot -> slot > _Py_mod_LAST_SLOT );
0 commit comments