From 3f94cbf9eba7adef027cfc5d087b3660800df9d7 Mon Sep 17 00:00:00 2001 From: Nick Coghlan Date: Sun, 15 Jul 2012 19:10:39 +1000 Subject: [PATCH] Actually initialize __main__.__loader__ with loader instances, not the corresponding type objects --- Lib/test/test_cmd_line_script.py | 3 ++- Python/pythonrun.c | 8 ++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Lib/test/test_cmd_line_script.py b/Lib/test/test_cmd_line_script.py index 849abe24772..8b6083e84f9 100644 --- a/Lib/test/test_cmd_line_script.py +++ b/Lib/test/test_cmd_line_script.py @@ -37,7 +37,8 @@ f() assertEqual(result, ['Top level assignment', 'Lower level reference']) # Check population of magic variables assertEqual(__name__, '__main__') -_loader = __loader__ if isinstance(__loader__, type) else type(__loader__) +from importlib.machinery import BuiltinImporter +_loader = __loader__ if __loader__ is BuiltinImporter else type(__loader__) print('__loader__==%a' % _loader) print('__file__==%a' % __file__) assertEqual(__cached__, None) diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 970834e0bbd..8130cc52893 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1355,11 +1355,15 @@ set_main_loader(PyObject *d, const char *filename, const char *loader_name) { PyInterpreterState *interp; PyThreadState *tstate; - PyObject *loader; + PyObject *loader_type, *loader; /* Get current thread state and interpreter pointer */ tstate = PyThreadState_GET(); interp = tstate->interp; - loader = PyObject_GetAttrString(interp->importlib, loader_name); + loader_type = PyObject_GetAttrString(interp->importlib, loader_name); + if (loader_type == NULL) { + return -1; + } + loader = PyObject_CallFunction(loader_type, "ss", "__main__", filename); if (loader == NULL || (PyDict_SetItemString(d, "__loader__", loader) < 0)) { return -1;