From 72ae6c80d489ea9d26958616d57cc37a5bd27d46 Mon Sep 17 00:00:00 2001
From: "Phillip J. Eby" <pje@telecommunity.com>
Date: Sun, 30 Apr 2006 15:59:26 +0000
Subject: Fix infinite regress when inspecting <string> or <stdin> frames.

---
 Lib/inspect.py | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/Lib/inspect.py b/Lib/inspect.py
index 2e4d987..4b2058e 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -353,7 +353,13 @@ def getsourcefile(object):
         if 'b' in mode and string.lower(filename[-len(suffix):]) == suffix:
             # Looks like a binary file.  We want to only return a text file.
             return None
-    if os.path.exists(filename) or hasattr(getmodule(object), '__loader__'):
+    if os.path.exists(filename):
+        return filename
+    # Ugly but necessary - '<stdin>' and '<string>' mean that getmodule()
+    # would infinitely recurse, because they're not real files nor loadable
+    # Note that this means that writing a PEP 302 loader that uses '<'
+    # at the start of a filename is now not a good idea.  :(
+    if filename[:1]!='<' and hasattr(getmodule(object), '__loader__'):
         return filename
 
 def getabsfile(object):
-- 
cgit v0.12

