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