]> git.proxmox.com Git - mirror_edk2.git/blobdiff - AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c
AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 2/5.
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.10 / Modules / _weakref.c
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 (file)
index 0000000..087cc92
--- /dev/null
@@ -0,0 +1,112 @@
+#include "Python.h"\r
+\r
+\r
+#define GET_WEAKREFS_LISTPTR(o) \\r
+        ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))\r
+\r
+\r
+PyDoc_STRVAR(weakref_getweakrefcount__doc__,\r
+"getweakrefcount(object) -- return the number of weak references\n"\r
+"to 'object'.");\r
+\r
+static PyObject *\r
+weakref_getweakrefcount(PyObject *self, PyObject *object)\r
+{\r
+    PyObject *result = NULL;\r
+\r
+    if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
+        PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
+\r
+        result = PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list));\r
+    }\r
+    else\r
+        result = PyInt_FromLong(0);\r
+\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(weakref_getweakrefs__doc__,\r
+"getweakrefs(object) -- return a list of all weak reference objects\n"\r
+"that point to 'object'.");\r
+\r
+static PyObject *\r
+weakref_getweakrefs(PyObject *self, PyObject *object)\r
+{\r
+    PyObject *result = NULL;\r
+\r
+    if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
+        PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
+        Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);\r
+\r
+        result = PyList_New(count);\r
+        if (result != NULL) {\r
+            PyWeakReference *current = *list;\r
+            Py_ssize_t i;\r
+            for (i = 0; i < count; ++i) {\r
+                PyList_SET_ITEM(result, i, (PyObject *) current);\r
+                Py_INCREF(current);\r
+                current = current->wr_next;\r
+            }\r
+        }\r
+    }\r
+    else {\r
+        result = PyList_New(0);\r
+    }\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(weakref_proxy__doc__,\r
+"proxy(object[, callback]) -- create a proxy object that weakly\n"\r
+"references 'object'.  'callback', if given, is called with a\n"\r
+"reference to the proxy when 'object' is about to be finalized.");\r
+\r
+static PyObject *\r
+weakref_proxy(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *object;\r
+    PyObject *callback = NULL;\r
+    PyObject *result = NULL;\r
+\r
+    if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) {\r
+        result = PyWeakref_NewProxy(object, callback);\r
+    }\r
+    return result;\r
+}\r
+\r
+\r
+static PyMethodDef\r
+weakref_functions[] =  {\r
+    {"getweakrefcount", weakref_getweakrefcount,        METH_O,\r
+     weakref_getweakrefcount__doc__},\r
+    {"getweakrefs",     weakref_getweakrefs,            METH_O,\r
+     weakref_getweakrefs__doc__},\r
+    {"proxy",           weakref_proxy,                  METH_VARARGS,\r
+     weakref_proxy__doc__},\r
+    {NULL, NULL, 0, NULL}\r
+};\r
+\r
+\r
+PyMODINIT_FUNC\r
+init_weakref(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("_weakref", weakref_functions,\r
+                       "Weak-reference support module.");\r
+    if (m != NULL) {\r
+        Py_INCREF(&_PyWeakref_RefType);\r
+        PyModule_AddObject(m, "ref",\r
+                           (PyObject *) &_PyWeakref_RefType);\r
+        Py_INCREF(&_PyWeakref_RefType);\r
+        PyModule_AddObject(m, "ReferenceType",\r
+                           (PyObject *) &_PyWeakref_RefType);\r
+        Py_INCREF(&_PyWeakref_ProxyType);\r
+        PyModule_AddObject(m, "ProxyType",\r
+                           (PyObject *) &_PyWeakref_ProxyType);\r
+        Py_INCREF(&_PyWeakref_CallableProxyType);\r
+        PyModule_AddObject(m, "CallableProxyType",\r
+                           (PyObject *) &_PyWeakref_CallableProxyType);\r
+    }\r
+}\r