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.
This commit is contained in:
Barry Warsaw 1999-09-09 16:32:41 +00:00
parent a2e48552d2
commit 2bee8feac6
1 changed files with 23 additions and 8 deletions

View File

@ -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 @@ def __init__(self):
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 @@ def lineinfo(self, identifier):
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