summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-03-28 20:45:42 +0000
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-03-28 20:45:42 +0000
commit8432d86b9f7a6295718544dd5e7c93fd9e3f94e7 (patch)
treea78ec5d71fa1ccf156812b8bbc5bff84ee79af99
parent198e353735be424ee7e21381504a6ab13d2f5fa7 (diff)
downloadcpython-git-8432d86b9f7a6295718544dd5e7c93fd9e3f94e7.tar.gz
Fix a reference leak found by Georg, when compiling a class nested in another class.
Test is run with "regrtest.py -R:: test_compile" Backport of r62015
-rw-r--r--Lib/test/test_compile.py4
-rw-r--r--Misc/NEWS3
-rw-r--r--Python/compile.c1
3 files changed, 8 insertions, 0 deletions
diff --git a/Lib/test/test_compile.py b/Lib/test/test_compile.py
index 1a98d2ff9d..0aba1c213d 100644
--- a/Lib/test/test_compile.py
+++ b/Lib/test/test_compile.py
@@ -398,6 +398,10 @@ if 1:
del d[..., ...]
self.assertEqual((Ellipsis, Ellipsis) in d, False)
+ def test_nested_classes(self):
+ # Verify that it does not leak
+ compile("class A:\n class B: pass", 'tmp', 'exec')
+
def test_main():
test_support.run_unittest(TestSpecifics)
diff --git a/Misc/NEWS b/Misc/NEWS
index 695e71b6f5..c914050134 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -12,6 +12,9 @@ What's New in Python 2.5.3?
Core and builtins
-----------------
+- The compilation of a class nested in another class used to leak one
+ reference on the outer class name.
+
- Issue #1477: With narrow Unicode builds, the unicode escape sequence
\Uxxxxxxxx did not accept values outside the Basic Multilingual Plane. This
affected raw unicode literals and the 'raw-unicode-escape' codec. Now
diff --git a/Python/compile.c b/Python/compile.c
index f40c325bbf..d40357c429 100644
--- a/Python/compile.c
+++ b/Python/compile.c
@@ -2061,6 +2061,7 @@ compiler_class(struct compiler *c, stmt_ty s)
if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
s->lineno))
return 0;
+ Py_XDECREF(c->u->u_private);
c->u->u_private = s->v.ClassDef.name;
Py_INCREF(c->u->u_private);
str = PyString_InternFromString("__name__");