@@ -3325,6 +3325,53 @@ test_atexit(PyObject *self, PyObject *Py_UNUSED(args))
33253325}
33263326
33273327
3328+ static PyObject *
3329+ check_pyimport_addmodule (PyObject * self , PyObject * args )
3330+ {
3331+ const char * name ;
3332+ if (!PyArg_ParseTuple (args , "s" , & name )) {
3333+ return NULL ;
3334+ }
3335+
3336+ // test PyImport_AddModuleRef()
3337+ PyObject * module = PyImport_AddModuleRef (name );
3338+ if (module == NULL ) {
3339+ return NULL ;
3340+ }
3341+ assert (PyModule_Check (module ));
3342+ // module is a strong reference
3343+
3344+ // test PyImport_AddModule()
3345+ PyObject * module2 = PyImport_AddModule (name );
3346+ if (module2 == NULL ) {
3347+ goto error ;
3348+ }
3349+ assert (PyModule_Check (module2 ));
3350+ assert (module2 == module );
3351+ // module2 is a borrowed ref
3352+
3353+ // test PyImport_AddModuleObject()
3354+ PyObject * name_obj = PyUnicode_FromString (name );
3355+ if (name_obj == NULL ) {
3356+ goto error ;
3357+ }
3358+ PyObject * module3 = PyImport_AddModuleObject (name_obj );
3359+ Py_DECREF (name_obj );
3360+ if (module3 == NULL ) {
3361+ goto error ;
3362+ }
3363+ assert (PyModule_Check (module3 ));
3364+ assert (module3 == module );
3365+ // module3 is a borrowed ref
3366+
3367+ return module ;
3368+
3369+ error :
3370+ Py_DECREF (module );
3371+ return NULL ;
3372+ }
3373+
3374+
33283375static PyMethodDef TestMethods [] = {
33293376 {"set_errno" , set_errno , METH_VARARGS },
33303377 {"test_config" , test_config , METH_NOARGS },
@@ -3468,6 +3515,7 @@ static PyMethodDef TestMethods[] = {
34683515 {"function_get_kw_defaults" , function_get_kw_defaults , METH_O , NULL },
34693516 {"function_set_kw_defaults" , function_set_kw_defaults , METH_VARARGS , NULL },
34703517 {"test_atexit" , test_atexit , METH_NOARGS },
3518+ {"check_pyimport_addmodule" , check_pyimport_addmodule , METH_VARARGS },
34713519 {NULL , NULL } /* sentinel */
34723520};
34733521
0 commit comments