]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Modules/_weakref.c
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Modules / _weakref.c
CommitLineData
4710c53d 1#include "Python.h"\r
2\r
3\r
4#define GET_WEAKREFS_LISTPTR(o) \\r
5 ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))\r
6\r
7\r
8PyDoc_STRVAR(weakref_getweakrefcount__doc__,\r
9"getweakrefcount(object) -- return the number of weak references\n"\r
10"to 'object'.");\r
11\r
12static PyObject *\r
13weakref_getweakrefcount(PyObject *self, PyObject *object)\r
14{\r
15 PyObject *result = NULL;\r
16\r
17 if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
18 PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
19\r
20 result = PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list));\r
21 }\r
22 else\r
23 result = PyInt_FromLong(0);\r
24\r
25 return result;\r
26}\r
27\r
28\r
29PyDoc_STRVAR(weakref_getweakrefs__doc__,\r
30"getweakrefs(object) -- return a list of all weak reference objects\n"\r
31"that point to 'object'.");\r
32\r
33static PyObject *\r
34weakref_getweakrefs(PyObject *self, PyObject *object)\r
35{\r
36 PyObject *result = NULL;\r
37\r
38 if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
39 PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
40 Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);\r
41\r
42 result = PyList_New(count);\r
43 if (result != NULL) {\r
44 PyWeakReference *current = *list;\r
45 Py_ssize_t i;\r
46 for (i = 0; i < count; ++i) {\r
47 PyList_SET_ITEM(result, i, (PyObject *) current);\r
48 Py_INCREF(current);\r
49 current = current->wr_next;\r
50 }\r
51 }\r
52 }\r
53 else {\r
54 result = PyList_New(0);\r
55 }\r
56 return result;\r
57}\r
58\r
59\r
60PyDoc_STRVAR(weakref_proxy__doc__,\r
61"proxy(object[, callback]) -- create a proxy object that weakly\n"\r
62"references 'object'. 'callback', if given, is called with a\n"\r
63"reference to the proxy when 'object' is about to be finalized.");\r
64\r
65static PyObject *\r
66weakref_proxy(PyObject *self, PyObject *args)\r
67{\r
68 PyObject *object;\r
69 PyObject *callback = NULL;\r
70 PyObject *result = NULL;\r
71\r
72 if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) {\r
73 result = PyWeakref_NewProxy(object, callback);\r
74 }\r
75 return result;\r
76}\r
77\r
78\r
79static PyMethodDef\r
80weakref_functions[] = {\r
81 {"getweakrefcount", weakref_getweakrefcount, METH_O,\r
82 weakref_getweakrefcount__doc__},\r
83 {"getweakrefs", weakref_getweakrefs, METH_O,\r
84 weakref_getweakrefs__doc__},\r
85 {"proxy", weakref_proxy, METH_VARARGS,\r
86 weakref_proxy__doc__},\r
87 {NULL, NULL, 0, NULL}\r
88};\r
89\r
90\r
91PyMODINIT_FUNC\r
92init_weakref(void)\r
93{\r
94 PyObject *m;\r
95\r
96 m = Py_InitModule3("_weakref", weakref_functions,\r
97 "Weak-reference support module.");\r
98 if (m != NULL) {\r
99 Py_INCREF(&_PyWeakref_RefType);\r
100 PyModule_AddObject(m, "ref",\r
101 (PyObject *) &_PyWeakref_RefType);\r
102 Py_INCREF(&_PyWeakref_RefType);\r
103 PyModule_AddObject(m, "ReferenceType",\r
104 (PyObject *) &_PyWeakref_RefType);\r
105 Py_INCREF(&_PyWeakref_ProxyType);\r
106 PyModule_AddObject(m, "ProxyType",\r
107 (PyObject *) &_PyWeakref_ProxyType);\r
108 Py_INCREF(&_PyWeakref_CallableProxyType);\r
109 PyModule_AddObject(m, "CallableProxyType",\r
110 (PyObject *) &_PyWeakref_CallableProxyType);\r
111 }\r
112}\r