Commit 9ae66b09 authored by Fred Drake's avatar Fred Drake

Add support for weak references to the function and method types.

parent a182d9a7
...@@ -1805,6 +1805,7 @@ PyMethod_New(PyObject *func, PyObject *self, PyObject *class) ...@@ -1805,6 +1805,7 @@ PyMethod_New(PyObject *func, PyObject *self, PyObject *class)
if (im == NULL) if (im == NULL)
return NULL; return NULL;
} }
im->im_weakreflist = NULL;
Py_INCREF(func); Py_INCREF(func);
im->im_func = func; im->im_func = func;
Py_XINCREF(self); Py_XINCREF(self);
...@@ -1902,6 +1903,7 @@ instancemethod_getattro(register PyMethodObject *im, PyObject *name) ...@@ -1902,6 +1903,7 @@ instancemethod_getattro(register PyMethodObject *im, PyObject *name)
static void static void
instancemethod_dealloc(register PyMethodObject *im) instancemethod_dealloc(register PyMethodObject *im)
{ {
PyObject_ClearWeakRefs((PyObject *)im);
PyObject_GC_Fini(im); PyObject_GC_Fini(im);
Py_DECREF(im->im_func); Py_DECREF(im->im_func);
Py_XDECREF(im->im_self); Py_XDECREF(im->im_self);
...@@ -2019,9 +2021,12 @@ PyTypeObject PyMethod_Type = { ...@@ -2019,9 +2021,12 @@ PyTypeObject PyMethod_Type = {
(getattrofunc)instancemethod_getattro, /* tp_getattro */ (getattrofunc)instancemethod_getattro, /* tp_getattro */
(setattrofunc)instancemethod_setattro, /* tp_setattro */ (setattrofunc)instancemethod_setattro, /* tp_setattro */
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_HAVE_WEAKREFS,
0, /* tp_doc */ 0, /* tp_doc */
(traverseproc)instancemethod_traverse, /* tp_traverse */ (traverseproc)instancemethod_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
offsetof(PyMethodObject, im_weakreflist) /* tp_weaklistoffset */
}; };
/* Clear out the free list */ /* Clear out the free list */
......
...@@ -13,6 +13,7 @@ PyFunction_New(PyObject *code, PyObject *globals) ...@@ -13,6 +13,7 @@ PyFunction_New(PyObject *code, PyObject *globals)
if (op != NULL) { if (op != NULL) {
PyObject *doc; PyObject *doc;
PyObject *consts; PyObject *consts;
op->func_weakreflist = NULL;
Py_INCREF(code); Py_INCREF(code);
op->func_code = code; op->func_code = code;
Py_INCREF(globals); Py_INCREF(globals);
...@@ -245,6 +246,7 @@ func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value) ...@@ -245,6 +246,7 @@ func_setattro(PyFunctionObject *op, PyObject *name, PyObject *value)
static void static void
func_dealloc(PyFunctionObject *op) func_dealloc(PyFunctionObject *op)
{ {
PyObject_ClearWeakRefs((PyObject *) op);
PyObject_GC_Fini(op); PyObject_GC_Fini(op);
Py_DECREF(op->func_code); Py_DECREF(op->func_code);
Py_DECREF(op->func_globals); Py_DECREF(op->func_globals);
...@@ -327,13 +329,16 @@ PyTypeObject PyFunction_Type = { ...@@ -327,13 +329,16 @@ PyTypeObject PyFunction_Type = {
0, /*tp_as_number*/ 0, /*tp_as_number*/
0, /*tp_as_sequence*/ 0, /*tp_as_sequence*/
0, /*tp_as_mapping*/ 0, /*tp_as_mapping*/
0, /*tp_hash*/ 0, /*tp_hash*/
0, /*tp_call*/ 0, /*tp_call*/
0, /*tp_str*/ 0, /*tp_str*/
(getattrofunc)func_getattro, /*tp_getattro*/ (getattrofunc)func_getattro, /*tp_getattro*/
(setattrofunc)func_setattro, /*tp_setattro*/ (setattrofunc)func_setattro, /*tp_setattro*/
0, /* tp_as_buffer */ 0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC | Py_TPFLAGS_HAVE_WEAKREFS,
0, /* tp_doc */ 0, /* tp_doc */
(traverseproc)func_traverse, /* tp_traverse */ (traverseproc)func_traverse, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
offsetof(PyFunctionObject, func_weakreflist), /* tp_weaklistoffset */
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment