Index: Parser/tokenizer.c =================================================================== --- Parser/tokenizer.c (révision 66817) +++ Parser/tokenizer.c (copie de travail) @@ -460,6 +460,7 @@ Py_XDECREF(tok->decoding_readline); readline = PyObject_GetAttrString(stream, "readline"); tok->decoding_readline = readline; + tok->lineno = -1; cleanup: Py_XDECREF(stream); Index: Lib/test/test_traceback.py =================================================================== --- Lib/test/test_traceback.py (révision 66817) +++ Lib/test/test_traceback.py (copie de travail) @@ -6,6 +6,7 @@ import unittest import re from test.support import run_unittest, is_jython, Error, captured_output +import codecs import traceback @@ -90,6 +91,38 @@ err = traceback.format_exception_only(None, None) self.assertEqual(err, ['None\n']) + def test_lineno(self): + import tempfile, sys, subprocess, os + def do_test(firstlines, message, charset, lineno): + handle, path = tempfile.mkstemp() + output = codecs.open(handle, "w", charset) + output.write("""%simport sys, traceback +try: + raise RuntimeError("%s") +except: + sys.exit(traceback.tb_lineno(sys.exc_info()[2])) +else: + sys.exit(0) +""" % (firstlines, message)) + output.close() + process = subprocess.Popen([sys.executable, path], + stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + stdout, stderr = process.communicate() + os.remove(path) + err_line = 'raise RuntimeError("{0}")'.format(message) + stdout = str(stdout, "ASCII") + stdout = stdout.splitlines() + self.assert_(("line %s" % lineno) in stdout[1], + "Invalid line number: {0!r} instead of {1}".format(stdout[1], lineno)) + self.assert_(stdout[2].endswith(err_line), + "Invalid tracback line: {0!r} instead of {1!r}".format(stdout[2], err_line)) + do_test("", "foo", "ascii", 3) + do_test("# coding: utf-8\n", "foo", "utf-8", 4) + do_test("# coding: ascii\n", "foo", "ascii", 4) + do_test("#\n# coding: utf-8\n", "foo", "utf-8", 5) + do_test("#\n# coding: ascii\n", "foo", "ascii", 5) + do_test("# coding: GBK\n", r"--\xa8--", "GBK", 4) + do_test("#\n# coding: GBK\n", r"--\xa8--", "GBK", 5) class TracebackFormatTests(unittest.TestCase):