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
This commit is contained in:
Amaury Forgeot d'Arc 2008-03-28 20:45:42 +00:00
parent 198e353735
commit 8432d86b9f
3 changed files with 8 additions and 0 deletions

View file

@ -398,6 +398,10 @@ if 1:
del d[..., ...] del d[..., ...]
self.assertEqual((Ellipsis, Ellipsis) in d, False) 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(): def test_main():
test_support.run_unittest(TestSpecifics) test_support.run_unittest(TestSpecifics)

View file

@ -12,6 +12,9 @@ What's New in Python 2.5.3?
Core and builtins 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 - Issue #1477: With narrow Unicode builds, the unicode escape sequence
\Uxxxxxxxx did not accept values outside the Basic Multilingual Plane. This \Uxxxxxxxx did not accept values outside the Basic Multilingual Plane. This
affected raw unicode literals and the 'raw-unicode-escape' codec. Now affected raw unicode literals and the 'raw-unicode-escape' codec. Now

View file

@ -2061,6 +2061,7 @@ compiler_class(struct compiler *c, stmt_ty s)
if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s, if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s,
s->lineno)) s->lineno))
return 0; return 0;
Py_XDECREF(c->u->u_private);
c->u->u_private = s->v.ClassDef.name; c->u->u_private = s->v.ClassDef.name;
Py_INCREF(c->u->u_private); Py_INCREF(c->u->u_private);
str = PyString_InternFromString("__name__"); str = PyString_InternFromString("__name__");