diff Objects/classobject.c @ 60112:7b8ba019cd15 legacy-trunk

Issue #8268: Old-style classes (not just instances) now support weak references.
author Antoine Pitrou <solipsis@pitrou.net>
date Wed, 31 Mar 2010 21:32:15 +0000
parents 5d2b66e01968
children fd25030223b0
line wrap: on
line diff
--- a/Objects/classobject.c	Wed Mar 31 21:21:54 2010 +0000
+++ b/Objects/classobject.c	Wed Mar 31 21:32:15 2010 +0000
@@ -123,6 +123,7 @@
 	op->cl_dict = dict;
 	Py_XINCREF(name);
 	op->cl_name = name;
+	op->cl_weakreflist = NULL;
 
 	op->cl_getattr = class_lookup(op, getattrstr, &dummy);
 	op->cl_setattr = class_lookup(op, setattrstr, &dummy);
@@ -188,6 +189,8 @@
 class_dealloc(PyClassObject *op)
 {
 	_PyObject_GC_UNTRACK(op);
+	if (op->cl_weakreflist != NULL)
+		PyObject_ClearWeakRefs((PyObject *) op);
 	Py_DECREF(op->cl_bases);
 	Py_DECREF(op->cl_dict);
 	Py_XDECREF(op->cl_name);
@@ -454,7 +457,7 @@
 	(traverseproc)class_traverse,		/* tp_traverse */
  	0,					/* tp_clear */
 	0,					/* tp_richcompare */
-	0,					/* tp_weaklistoffset */
+	offsetof(PyClassObject, cl_weakreflist), /* tp_weaklistoffset */
 	0,					/* tp_iter */
 	0,					/* tp_iternext */
 	0,					/* tp_methods */