]> granicus.if.org Git - python/commitdiff
Use Marc Lemburg's tb_lineno() to calculate the correct line number.
authorGuido van Rossum <guido@python.org>
Fri, 26 Sep 1997 22:43:02 +0000 (22:43 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 26 Sep 1997 22:43:02 +0000 (22:43 +0000)
Apparently the traceback object doesn't contains the right linenumber
when -O is used.  Rather than guessing whether -O is on or off, use
tb_lineno() unconditionally.

Lib/traceback.py

index 968a9cb0db3c9bc1f7d619b81b1ec30640ce7401..d508e03dfe9ab6f9724ba90fc40c143e5dfcb879 100644 (file)
@@ -37,7 +37,7 @@ def print_tb(tb, limit=None, file=None):
        n = 0
        while tb is not None and (limit is None or n < limit):
                f = tb.tb_frame
-               lineno = tb.tb_lineno
+               lineno = tb_lineno(tb)
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -59,7 +59,7 @@ def extract_tb(tb, limit = None):
        n = 0
        while tb is not None and (limit is None or n < limit):
                f = tb.tb_frame
-               lineno = tb.tb_lineno
+               lineno = tb_lineno(tb)
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -169,7 +169,7 @@ def extract_stack(f=None, limit = None):
        list = []
        n = 0
        while f is not None and (limit is None or n < limit):
-               lineno = f.f_lineno
+               lineno = f.f_lineno     # XXX Too bad if -O is used
                co = f.f_code
                filename = co.co_filename
                name = co.co_name
@@ -181,3 +181,21 @@ def extract_stack(f=None, limit = None):
                n = n+1
        list.reverse()
        return list
+
+# Calculate the correct line number of the traceback given in tb (even
+# with -O on).
+# Coded by Marc-Andre Lemburg from the example of PyCode_Addr2Line()
+# in compile.c.
+
+def tb_lineno(tb):
+       c = tb.tb_frame.f_code
+       tab = c.co_lnotab
+       line = c.co_firstlineno
+       stopat = tb.tb_lasti
+       addr = 0
+       for i in range(0, len(tab), 2):
+               addr = addr + ord(tab[i])
+               if addr > stopat:
+                       break
+               line = line + ord(tab[i+1])
+       return line