mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Issue #8268: Old-style classes (not just instances) now support weak
references.
This commit is contained in:
parent
26cc99da2a
commit
a57df2cf1d
5 changed files with 29 additions and 2 deletions
|
@ -18,6 +18,7 @@ typedef struct {
|
||||||
PyObject *cl_getattr;
|
PyObject *cl_getattr;
|
||||||
PyObject *cl_setattr;
|
PyObject *cl_setattr;
|
||||||
PyObject *cl_delattr;
|
PyObject *cl_delattr;
|
||||||
|
PyObject *cl_weakreflist; /* List of weak references */
|
||||||
} PyClassObject;
|
} PyClassObject;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -544,7 +544,7 @@ class SizeofTest(unittest.TestCase):
|
||||||
class class_oldstyle():
|
class class_oldstyle():
|
||||||
def method():
|
def method():
|
||||||
pass
|
pass
|
||||||
check(class_oldstyle, size(h + '6P'))
|
check(class_oldstyle, size(h + '7P'))
|
||||||
# instance (old-style class)
|
# instance (old-style class)
|
||||||
check(class_oldstyle(), size(h + '3P'))
|
check(class_oldstyle(), size(h + '3P'))
|
||||||
# instancemethod (old-style class)
|
# instancemethod (old-style class)
|
||||||
|
|
|
@ -685,6 +685,26 @@ class ReferencesTestCase(TestBase):
|
||||||
# No exception should be raised here
|
# No exception should be raised here
|
||||||
gc.collect()
|
gc.collect()
|
||||||
|
|
||||||
|
def test_classes(self):
|
||||||
|
# Check that both old-style classes and new-style classes
|
||||||
|
# are weakrefable.
|
||||||
|
class A(object):
|
||||||
|
pass
|
||||||
|
class B:
|
||||||
|
pass
|
||||||
|
l = []
|
||||||
|
weakref.ref(int)
|
||||||
|
a = weakref.ref(A, l.append)
|
||||||
|
A = None
|
||||||
|
gc.collect()
|
||||||
|
self.assertEqual(a(), None)
|
||||||
|
self.assertEqual(l, [a])
|
||||||
|
b = weakref.ref(B, l.append)
|
||||||
|
B = None
|
||||||
|
gc.collect()
|
||||||
|
self.assertEqual(b(), None)
|
||||||
|
self.assertEqual(l, [a, b])
|
||||||
|
|
||||||
|
|
||||||
class SubclassableWeakrefTestCase(TestBase):
|
class SubclassableWeakrefTestCase(TestBase):
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 2.7 beta 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #8268: Old-style classes (not just instances) now support weak
|
||||||
|
references.
|
||||||
|
|
||||||
- Issue #8211: Save/restore CFLAGS around AC_PROG_CC in configure.in, compiler
|
- Issue #8211: Save/restore CFLAGS around AC_PROG_CC in configure.in, compiler
|
||||||
optimizations are disabled when --with-pydebug is used.
|
optimizations are disabled when --with-pydebug is used.
|
||||||
|
|
||||||
|
|
|
@ -123,6 +123,7 @@ alloc_error:
|
||||||
op->cl_dict = dict;
|
op->cl_dict = dict;
|
||||||
Py_XINCREF(name);
|
Py_XINCREF(name);
|
||||||
op->cl_name = name;
|
op->cl_name = name;
|
||||||
|
op->cl_weakreflist = NULL;
|
||||||
|
|
||||||
op->cl_getattr = class_lookup(op, getattrstr, &dummy);
|
op->cl_getattr = class_lookup(op, getattrstr, &dummy);
|
||||||
op->cl_setattr = class_lookup(op, setattrstr, &dummy);
|
op->cl_setattr = class_lookup(op, setattrstr, &dummy);
|
||||||
|
@ -188,6 +189,8 @@ static void
|
||||||
class_dealloc(PyClassObject *op)
|
class_dealloc(PyClassObject *op)
|
||||||
{
|
{
|
||||||
_PyObject_GC_UNTRACK(op);
|
_PyObject_GC_UNTRACK(op);
|
||||||
|
if (op->cl_weakreflist != NULL)
|
||||||
|
PyObject_ClearWeakRefs((PyObject *) op);
|
||||||
Py_DECREF(op->cl_bases);
|
Py_DECREF(op->cl_bases);
|
||||||
Py_DECREF(op->cl_dict);
|
Py_DECREF(op->cl_dict);
|
||||||
Py_XDECREF(op->cl_name);
|
Py_XDECREF(op->cl_name);
|
||||||
|
@ -454,7 +457,7 @@ PyTypeObject PyClass_Type = {
|
||||||
(traverseproc)class_traverse, /* tp_traverse */
|
(traverseproc)class_traverse, /* tp_traverse */
|
||||||
0, /* tp_clear */
|
0, /* tp_clear */
|
||||||
0, /* tp_richcompare */
|
0, /* tp_richcompare */
|
||||||
0, /* tp_weaklistoffset */
|
offsetof(PyClassObject, cl_weakreflist), /* tp_weaklistoffset */
|
||||||
0, /* tp_iter */
|
0, /* tp_iter */
|
||||||
0, /* tp_iternext */
|
0, /* tp_iternext */
|
||||||
0, /* tp_methods */
|
0, /* tp_methods */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue