Pdb.lineinfo(): Don't use os.popen('egrep ...') to find the line in
the file that a function is defined on. Non-portable to Windows and
JPython. Instead, new find_function() uses re module on a similar
(simple-minded) pattern.
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 97a4975..b897efb 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -11,6 +11,27 @@
import bdb
import repr
import os
+import re
+
+def find_function(funcname, filename):
+ cre = re.compile(r'def\s+%s\s*[(]' % funcname)
+ try:
+ fp = open(filename)
+ except IOError:
+ return None
+ # consumer of this info expects the first line to be 1
+ lineno = 1
+ answer = None
+ while 1:
+ line = fp.readline()
+ if line == '':
+ break
+ if cre.match(line):
+ answer = funcname, filename, lineno
+ break
+ lineno = lineno + 1
+ fp.close()
+ return answer
# Interaction prompt line will separate file and call info from code
@@ -26,7 +47,6 @@
bdb.Bdb.__init__(self)
cmd.Cmd.__init__(self)
self.prompt = '(Pdb) '
- self.lineinfoCmd = 'egrep -n "def *%s *[(:]" %s /dev/null'
self.aliases = {}
# Try to load readline if it exists
try:
@@ -283,13 +303,8 @@
if f:
fname = f
item = parts[1]
- grepstring = self.lineinfoCmd % (item, fname)
- answer = os.popen(grepstring, 'r').readline()
- if answer:
- f, line, junk = string.split(answer, ':', 2)
- return(item, f,line)
- else:
- return failed
+ answer = find_function(item, fname)
+ return answer or failed
def checkline(self, filename, lineno):
"""Return line number of first line at or after input