]> granicus.if.org Git - python/commitdiff
Issue #21709: Improved implementation to cover the frozen module case.
authorVinay Sajip <vinay_sajip@yahoo.co.uk>
Thu, 12 Jun 2014 22:36:33 +0000 (23:36 +0100)
committerVinay Sajip <vinay_sajip@yahoo.co.uk>
Thu, 12 Jun 2014 22:36:33 +0000 (23:36 +0100)
Lib/logging/__init__.py

index 21ab627c0138270280cab4fb0ed10757955e9a66..a61c2b07c9d027edfd3f9a2616a725e068c4b9c3 100644 (file)
@@ -51,34 +51,6 @@ __date__    = "07 February 2010"
 #   Miscellaneous module data
 #---------------------------------------------------------------------------
 
-#
-# _srcfile is used when walking the stack to check when we've got the first
-# caller stack frame.
-#
-if hasattr(sys, 'frozen'):
-    _srcfile = os.path.join('logging', '__init__.py')
-else:
-    _srcfile = __file__
-_srcfile = os.path.normcase(_srcfile)
-
-
-if hasattr(sys, '_getframe'):
-    currentframe = lambda: sys._getframe(3)
-else: #pragma: no cover
-    def currentframe():
-        """Return the frame object for the caller's stack frame."""
-        try:
-            raise Exception
-        except Exception:
-            return sys.exc_info()[2].tb_frame.f_back
-
-# _srcfile is only used in conjunction with sys._getframe().
-# To provide compatibility with older versions of Python, set _srcfile
-# to None if _getframe() is not available; this value will prevent
-# findCaller() from being called.
-#if not hasattr(sys, "_getframe"):
-#    _srcfile = None
-
 #
 #_startTime is used as the base when calculating the relative time of events
 #
@@ -172,6 +144,40 @@ def addLevelName(level, levelName):
     finally:
         _releaseLock()
 
+if hasattr(sys, '_getframe'):
+    currentframe = lambda: sys._getframe(3)
+else: #pragma: no cover
+    def currentframe():
+        """Return the frame object for the caller's stack frame."""
+        try:
+            raise Exception
+        except Exception:
+            return sys.exc_info()[2].tb_frame.f_back
+
+#
+# _srcfile is used when walking the stack to check when we've got the first
+# caller stack frame, by skipping frames whose filename is that of this
+# module's source. It therefore should contain the filename of this module's
+# source file.
+#
+# Ordinarily we would use __file__ for this, but frozen modules don't always
+# have __file__ set, for some reason (see Issue #21736). Thus, we get the
+# filename from a handy code object from a function defined in this module.
+# (There's no particular reason for picking addLevelName.)
+#
+
+_srcfile = os.path.normcase(addLevelName.__code__.co_filename)
+
+# _srcfile is only used in conjunction with sys._getframe().
+# To provide compatibility with older versions of Python, set _srcfile
+# to None if _getframe() is not available; this value will prevent
+# findCaller() from being called. You can also do this if you want to avoid
+# the overhead of fetching caller information, even when _getframe() is
+# available.
+#if not hasattr(sys, '_getframe'):
+#    _srcfile = None
+
+
 def _checkLevel(level):
     if isinstance(level, int):
         rv = level