summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>1999-09-09 16:32:41 (GMT)
committerBarry Warsaw <barry@python.org>1999-09-09 16:32:41 (GMT)
commit2bee8feac614599d172ea4483a17294b81063fdc (patch)
tree79dce4028f7268534fa3bf874d94a75f8b0a751f
parenta2e48552d28721eec0df75912d479f7d44c14d0a (diff)
downloadcpython-2bee8feac614599d172ea4483a17294b81063fdc.zip
cpython-2bee8feac614599d172ea4483a17294b81063fdc.tar.gz
cpython-2bee8feac614599d172ea4483a17294b81063fdc.tar.bz2
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.
-rwxr-xr-xLib/pdb.py31
1 files changed, 23 insertions, 8 deletions
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 cmd
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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
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 @@ class Pdb(bdb.Bdb, cmd.Cmd):
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