From 2bee8feac614599d172ea4483a17294b81063fdc Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Thu, 9 Sep 1999 16:32:41 +0000 Subject: [PATCH] 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. --- Lib/pdb.py | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/Lib/pdb.py b/Lib/pdb.py index 97a49751642..b897efb6335 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 @@ 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