]> granicus.if.org Git - python/commitdiff
Pdb.lineinfo(): Don't use os.popen('egrep ...') to find the line in
authorBarry Warsaw <barry@python.org>
Thu, 9 Sep 1999 16:32:41 +0000 (16:32 +0000)
committerBarry Warsaw <barry@python.org>
Thu, 9 Sep 1999 16:32:41 +0000 (16:32 +0000)
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

index 97a4975164292cb63650f7697df9122d9753d9a3..b897efb6335154f3770fab333496c1509c41f376 100755 (executable)
@@ -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