summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Lib/test/test_compile.py9
-rw-r--r--Misc/NEWS5
-rw-r--r--Python/compile.c2
3 files changed, 15 insertions, 1 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 5011d03685..c567fa432a 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -252,6 +252,15 @@ if 1:
for stmt in fail:
self.assertRaises(SyntaxError, compile, stmt, 'tmp', 'exec')
+ def test_for_distinct_code_objects(self):
+ # SF bug 1048870
+ def f():
+ f1 = lambda x=1: x
+ f2 = lambda x=2: x
+ return f1, f2
+ f1, f2 = f()
+ self.assertNotEqual(id(f1.func_code), id(f2.func_code))
+
def test_main():
test_support.run_unittest(TestSpecifics)
diff --git a/Misc/NEWS b/Misc/NEWS
index e12621de7a..d0a5af5bd6 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -37,7 +37,10 @@ Core and builtins
Extension Modules
-----------------
-...
+- Bug #1048870: the compiler now generates distinct code objects for
+ functions with identical bodies. This was producing confusing
+ traceback messages which pointed to the function where the code
+ object was first defined rather than the function being executed.
Library
-------
diff --git a/Python/compile.c b/Python/compile.c
index dc636c0ea7..dfb94d38e3 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -261,6 +261,8 @@ code_compare(PyCodeObject *co, PyCodeObject *cp)
if (cmp) return (cmp<0)?-1:1;
cmp = co->co_flags - cp->co_flags;
if (cmp) return (cmp<0)?-1:1;
+ cmp = co->co_firstlineno - cp->co_firstlineno;
+ if (cmp) return (cmp<0)?-1:1;
cmp = PyObject_Compare(co->co_code, cp->co_code);
if (cmp) return cmp;
cmp = PyObject_Compare(co->co_consts, cp->co_consts);