diff options
Diffstat (limited to 'Python/pythonrun.c')
| -rw-r--r-- | Python/pythonrun.c | 34 | 
1 files changed, 25 insertions, 9 deletions
| diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 9ef653b..02a4329 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -35,12 +35,30 @@  #define PATH_MAX MAXPATHLEN  #endif +#ifdef Py_REF_DEBUG +static +void _print_total_refs(void) { +    PyObject *xoptions, *key, *value; +    xoptions = PySys_GetXOptions(); +    if (xoptions == NULL) +        return; +    key = PyUnicode_FromString("showrefcount"); +    if (key == NULL) +        return; +    value = PyDict_GetItem(xoptions, key); +    Py_DECREF(key); +    if (value == Py_True) +        fprintf(stderr, +                "[%" PY_FORMAT_SIZE_T "d refs, " +                "%" PY_FORMAT_SIZE_T "d blocks]\n", +                _Py_GetRefTotal(), _Py_GetAllocatedBlocks()); +} +#endif +  #ifndef Py_REF_DEBUG  #define PRINT_TOTAL_REFS()  #else /* Py_REF_DEBUG */ -#define PRINT_TOTAL_REFS() fprintf(stderr,                              \ -                   "[%" PY_FORMAT_SIZE_T "d refs]\n",                   \ -                   _Py_GetRefTotal()) +#define PRINT_TOTAL_REFS() _print_total_refs()  #endif  #ifdef __cplusplus @@ -526,10 +544,6 @@ Py_Finalize(void)      while (PyGC_Collect() > 0)          /* nothing */;  #endif -    /* We run this while most interpreter state is still alive, so that -       debug information can be printed out */ -    _PyGC_Fini(); -      /* Destroy all modules */      PyImport_Cleanup(); @@ -610,6 +624,7 @@ Py_Finalize(void)      PyFloat_Fini();      PyDict_Fini();      PySlice_Fini(); +    _PyGC_Fini();      /* Cleanup Unicode implementation */      _PyUnicode_Fini(); @@ -827,7 +842,7 @@ Py_GetPythonHome(void)  static void  initmain(PyInterpreterState *interp)  { -    PyObject *m, *d; +    PyObject *m, *d, *loader;      m = PyImport_AddModule("__main__");      if (m == NULL)          Py_FatalError("can't create __main__ module"); @@ -848,7 +863,8 @@ initmain(PyInterpreterState *interp)       * be set if __main__ gets further initialized later in the startup       * process.       */ -    if (PyDict_GetItemString(d, "__loader__") == NULL) { +    loader = PyDict_GetItemString(d, "__loader__"); +    if (loader == NULL || loader == Py_None) {          PyObject *loader = PyObject_GetAttrString(interp->importlib,                                                    "BuiltinImporter");          if (loader == NULL) { | 
