diff options
author | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-06 23:31:40 (GMT) |
---|---|---|
committer | Antoine Pitrou <solipsis@pitrou.net> | 2014-08-06 23:31:40 (GMT) |
commit | b349e4c929131eb708ff3db569077f0c851338e9 (patch) | |
tree | 3d5b5e89bcc0f2c55587459d3bc91ee34a94d74b /Objects | |
parent | f3440c6881a0fdb24ea30f971ebc0fd091bc7ffb (diff) | |
download | cpython-b349e4c929131eb708ff3db569077f0c851338e9.zip cpython-b349e4c929131eb708ff3db569077f0c851338e9.tar.gz cpython-b349e4c929131eb708ff3db569077f0c851338e9.tar.bz2 |
Issue #22116: C functions and methods (of the 'builtin_function_or_method' type) can now be weakref'ed. Patch by Wei Wu.
Diffstat (limited to 'Objects')
-rw-r--r-- | Objects/methodobject.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/Objects/methodobject.c b/Objects/methodobject.c index f2616d4..686baf9 100644 --- a/Objects/methodobject.c +++ b/Objects/methodobject.c @@ -37,6 +37,7 @@ PyCFunction_NewEx(PyMethodDef *ml, PyObject *self, PyObject *module) if (op == NULL) return NULL; } + op->m_weakreflist = NULL; op->m_ml = ml; Py_XINCREF(self); op->m_self = self; @@ -147,6 +148,9 @@ static void meth_dealloc(PyCFunctionObject *m) { _PyObject_GC_UNTRACK(m); + if (m->m_weakreflist != NULL) { + PyObject_ClearWeakRefs((PyObject*) m); + } Py_XDECREF(m->m_self); Py_XDECREF(m->m_module); if (numfree < PyCFunction_MAXFREELIST) { @@ -352,7 +356,7 @@ PyTypeObject PyCFunction_Type = { (traverseproc)meth_traverse, /* tp_traverse */ 0, /* tp_clear */ meth_richcompare, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ + offsetof(PyCFunctionObject, m_weakreflist), /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ meth_methods, /* tp_methods */ |