summaryrefslogtreecommitdiff
path: root/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c
diff options
context:
space:
mode:
Diffstat (limited to 'AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c')
-rw-r--r--AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c112
1 files changed, 112 insertions, 0 deletions
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c
new file mode 100644
index 0000000000..087cc92c54
--- /dev/null
+++ b/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c
@@ -0,0 +1,112 @@
+#include "Python.h"
+
+
+#define GET_WEAKREFS_LISTPTR(o) \
+ ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))
+
+
+PyDoc_STRVAR(weakref_getweakrefcount__doc__,
+"getweakrefcount(object) -- return the number of weak references\n"
+"to 'object'.");
+
+static PyObject *
+weakref_getweakrefcount(PyObject *self, PyObject *object)
+{
+ PyObject *result = NULL;
+
+ if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {
+ PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);
+
+ result = PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list));
+ }
+ else
+ result = PyInt_FromLong(0);
+
+ return result;
+}
+
+
+PyDoc_STRVAR(weakref_getweakrefs__doc__,
+"getweakrefs(object) -- return a list of all weak reference objects\n"
+"that point to 'object'.");
+
+static PyObject *
+weakref_getweakrefs(PyObject *self, PyObject *object)
+{
+ PyObject *result = NULL;
+
+ if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {
+ PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);
+ Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);
+
+ result = PyList_New(count);
+ if (result != NULL) {
+ PyWeakReference *current = *list;
+ Py_ssize_t i;
+ for (i = 0; i < count; ++i) {
+ PyList_SET_ITEM(result, i, (PyObject *) current);
+ Py_INCREF(current);
+ current = current->wr_next;
+ }
+ }
+ }
+ else {
+ result = PyList_New(0);
+ }
+ return result;
+}
+
+
+PyDoc_STRVAR(weakref_proxy__doc__,
+"proxy(object[, callback]) -- create a proxy object that weakly\n"
+"references 'object'. 'callback', if given, is called with a\n"
+"reference to the proxy when 'object' is about to be finalized.");
+
+static PyObject *
+weakref_proxy(PyObject *self, PyObject *args)
+{
+ PyObject *object;
+ PyObject *callback = NULL;
+ PyObject *result = NULL;
+
+ if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) {
+ result = PyWeakref_NewProxy(object, callback);
+ }
+ return result;
+}
+
+
+static PyMethodDef
+weakref_functions[] = {
+ {"getweakrefcount", weakref_getweakrefcount, METH_O,
+ weakref_getweakrefcount__doc__},
+ {"getweakrefs", weakref_getweakrefs, METH_O,
+ weakref_getweakrefs__doc__},
+ {"proxy", weakref_proxy, METH_VARARGS,
+ weakref_proxy__doc__},
+ {NULL, NULL, 0, NULL}
+};
+
+
+PyMODINIT_FUNC
+init_weakref(void)
+{
+ PyObject *m;
+
+ m = Py_InitModule3("_weakref", weakref_functions,
+ "Weak-reference support module.");
+ if (m != NULL) {
+ Py_INCREF(&_PyWeakref_RefType);
+ PyModule_AddObject(m, "ref",
+ (PyObject *) &_PyWeakref_RefType);
+ Py_INCREF(&_PyWeakref_RefType);
+ PyModule_AddObject(m, "ReferenceType",
+ (PyObject *) &_PyWeakref_RefType);
+ Py_INCREF(&_PyWeakref_ProxyType);
+ PyModule_AddObject(m, "ProxyType",
+ (PyObject *) &_PyWeakref_ProxyType);
+ Py_INCREF(&_PyWeakref_CallableProxyType);
+ PyModule_AddObject(m, "CallableProxyType",
+ (PyObject *) &_PyWeakref_CallableProxyType);
+ }
+}