@@ -1228,22 +1228,67 @@ run_presite(PyThreadState *tstate)
12281228 return ;
12291229 }
12301230
1231- PyObject * presite_modname = PyUnicode_FromWideChar (
1232- config -> run_presite ,
1233- wcslen (config -> run_presite )
1234- );
1235- if (presite_modname == NULL ) {
1236- fprintf (stderr , "Could not convert pre-site module name to unicode\n" );
1231+ PyObject * presite = PyUnicode_FromWideChar (config -> run_presite , -1 );
1232+ if (presite == NULL ) {
1233+ fprintf (stderr , "Could not convert pre-site command to Unicode\n" );
1234+ _PyErr_Print (tstate );
1235+ return ;
1236+ }
1237+
1238+ // Accept "mod_name" and "mod_name:func_name" entry point syntax
1239+ Py_ssize_t len = PyUnicode_GET_LENGTH (presite );
1240+ Py_ssize_t pos = PyUnicode_FindChar (presite , ':' , 0 , len , 1 );
1241+ PyObject * mod_name = NULL ;
1242+ PyObject * func_name = NULL ;
1243+ PyObject * module = NULL ;
1244+ if (pos > 0 ) {
1245+ mod_name = PyUnicode_Substring (presite , 0 , pos );
1246+ if (mod_name == NULL ) {
1247+ goto error ;
1248+ }
1249+
1250+ func_name = PyUnicode_Substring (presite , pos + 1 , len );
1251+ if (func_name == NULL ) {
1252+ goto error ;
1253+ }
12371254 }
12381255 else {
1239- PyObject * presite = PyImport_Import (presite_modname );
1240- if (presite == NULL ) {
1241- fprintf (stderr , "pre-site import failed:\n" );
1242- _PyErr_Print (tstate );
1256+ mod_name = Py_NewRef (presite );
1257+ }
1258+
1259+ module = PyImport_Import (mod_name );
1260+ if (module == NULL ) {
1261+ goto error ;
1262+ }
1263+
1264+ if (func_name != NULL ) {
1265+ PyObject * func = PyObject_GetAttr (module , func_name );
1266+ if (func == NULL ) {
1267+ goto error ;
1268+ }
1269+
1270+ PyObject * res = PyObject_CallNoArgs (func );
1271+ Py_DECREF (func );
1272+ if (res == NULL ) {
1273+ goto error ;
12431274 }
1244- Py_XDECREF (presite );
1245- Py_DECREF (presite_modname );
1275+ Py_DECREF (res );
12461276 }
1277+
1278+ Py_DECREF (presite );
1279+ Py_DECREF (mod_name );
1280+ Py_XDECREF (func_name );
1281+ Py_DECREF (module );
1282+ return ;
1283+
1284+ error :
1285+ fprintf (stderr , "pre-site failed:\n" );
1286+ _PyErr_Print (tstate );
1287+
1288+ Py_DECREF (presite );
1289+ Py_XDECREF (mod_name );
1290+ Py_XDECREF (func_name );
1291+ Py_XDECREF (module );
12471292}
12481293#endif
12491294
0 commit comments