diff Python/import.c @ 78344:62033490ca0f

Close #15486: Simplify the mechanism used to remove importlib frames from tracebacks when they just introduce irrelevant noise
author Nick Coghlan <ncoghlan@gmail.com>
date Tue, 31 Jul 2012 21:14:18 +1000
parents 75a30a478dc7
children 9ba8d0b3ff18
line wrap: on
line diff
--- a/Python/import.c	Tue Jul 31 06:14:59 2012 +0300
+++ b/Python/import.c	Tue Jul 31 21:14:18 2012 +1000
@@ -1153,9 +1153,7 @@
 remove_importlib_frames(void)
 {
     const char *importlib_filename = "<frozen importlib._bootstrap>";
-    const char *exec_funcname = "_exec_module";
-    const char *get_code_funcname = "get_code";
-    const char *recursive_import = "_recursive_import";
+    const char *remove_frames = "_call_with_frames_removed";
     int always_trim = 0;
     int trim_get_code = 0;
     int in_importlib = 0;
@@ -1163,18 +1161,8 @@
     PyObject **prev_link, **outer_link = NULL;
 
     /* Synopsis: if it's an ImportError, we trim all importlib chunks
-       from the traceback.  If it's a SyntaxError, we trim any chunks that
-       end with a call to "get_code", We always trim chunks
-       which end with a call to "_exec_module". */
-
-    /* Thanks to issue 15425, we also strip any chunk ending with
-     * _recursive_import. This is used when making a recursive call to the
-     * full import machinery which means the inner stack gets stripped early
-     * and the normal heuristics won't fire properly for outer frames. A
-     * more elegant mechanism would be nice, as this one can misfire if
-     * builtins.__import__ has been replaced with a custom implementation.
-     * However, the current approach at least gets the job done.
-     */
+       from the traceback. We always trim chunks
+       which end with a call to "_call_with_frames_removed". */
 
     PyErr_Fetch(&exception, &value, &base_tb);
     if (!exception || Py_VerboseFlag)
@@ -1207,14 +1195,8 @@
 
         if (in_importlib &&
             (always_trim ||
-             (PyUnicode_CompareWithASCIIString(code->co_name,
-                                              exec_funcname) == 0) ||
-             (PyUnicode_CompareWithASCIIString(code->co_name,
-                                              recursive_import) == 0) ||
-             (trim_get_code &&
-              PyUnicode_CompareWithASCIIString(code->co_name,
-                                              get_code_funcname) == 0)
-           )) {
+             PyUnicode_CompareWithASCIIString(code->co_name,
+                                              remove_frames) == 0)) {
             PyObject *tmp = *outer_link;
             *outer_link = next;
             Py_XINCREF(next);