Ignore:
Timestamp:
Mar 19, 2014, 11:31:01 PM (11 years ago)
Author:
dmik
Message:

python: Merge vendor 2.7.6 to trunk.

Location:
python/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • python/trunk

  • python/trunk/Objects/descrobject.c

    r2 r391  
    77descr_dealloc(PyDescrObject *descr)
    88{
    9         _PyObject_GC_UNTRACK(descr);
    10         Py_XDECREF(descr->d_type);
    11         Py_XDECREF(descr->d_name);
    12         PyObject_GC_Del(descr);
     9    _PyObject_GC_UNTRACK(descr);
     10    Py_XDECREF(descr->d_type);
     11    Py_XDECREF(descr->d_name);
     12    PyObject_GC_Del(descr);
    1313}
    1414
     
    1616descr_name(PyDescrObject *descr)
    1717{
    18         if (descr->d_name != NULL && PyString_Check(descr->d_name))
    19                 return PyString_AS_STRING(descr->d_name);
    20         else
    21                 return "?";
     18    if (descr->d_name != NULL && PyString_Check(descr->d_name))
     19        return PyString_AS_STRING(descr->d_name);
     20    else
     21        return "?";
    2222}
    2323
     
    2525descr_repr(PyDescrObject *descr, char *format)
    2626{
    27         return PyString_FromFormat(format, descr_name(descr),
    28                                    descr->d_type->tp_name);
     27    return PyString_FromFormat(format, descr_name(descr),
     28                               descr->d_type->tp_name);
    2929}
    3030
     
    3232method_repr(PyMethodDescrObject *descr)
    3333{
    34         return descr_repr((PyDescrObject *)descr,
    35                           "<method '%s' of '%s' objects>");
     34    return descr_repr((PyDescrObject *)descr,
     35                      "<method '%s' of '%s' objects>");
    3636}
    3737
     
    3939member_repr(PyMemberDescrObject *descr)
    4040{
    41         return descr_repr((PyDescrObject *)descr,
    42                           "<member '%s' of '%s' objects>");
     41    return descr_repr((PyDescrObject *)descr,
     42                      "<member '%s' of '%s' objects>");
    4343}
    4444
     
    4646getset_repr(PyGetSetDescrObject *descr)
    4747{
    48         return descr_repr((PyDescrObject *)descr,
    49                           "<attribute '%s' of '%s' objects>");
     48    return descr_repr((PyDescrObject *)descr,
     49                      "<attribute '%s' of '%s' objects>");
    5050}
    5151
     
    5353wrapperdescr_repr(PyWrapperDescrObject *descr)
    5454{
    55         return descr_repr((PyDescrObject *)descr,
    56                           "<slot wrapper '%s' of '%s' objects>");
     55    return descr_repr((PyDescrObject *)descr,
     56                      "<slot wrapper '%s' of '%s' objects>");
    5757}
    5858
     
    6060descr_check(PyDescrObject *descr, PyObject *obj, PyObject **pres)
    6161{
    62         if (obj == NULL) {
    63                 Py_INCREF(descr);
    64                 *pres = (PyObject *)descr;
    65                 return 1;
    66         }
    67         if (!PyObject_TypeCheck(obj, descr->d_type)) {
    68                 PyErr_Format(PyExc_TypeError,
    69                              "descriptor '%s' for '%s' objects "
    70                              "doesn't apply to '%s' object",
    71                              descr_name((PyDescrObject *)descr),
    72                              descr->d_type->tp_name,
    73                              obj->ob_type->tp_name);
    74                 *pres = NULL;
    75                 return 1;
    76         }
    77         return 0;
     62    if (obj == NULL) {
     63        Py_INCREF(descr);
     64        *pres = (PyObject *)descr;
     65        return 1;
     66    }
     67    if (!PyObject_TypeCheck(obj, descr->d_type)) {
     68        PyErr_Format(PyExc_TypeError,
     69                     "descriptor '%s' for '%s' objects "
     70                     "doesn't apply to '%s' object",
     71                     descr_name((PyDescrObject *)descr),
     72                     descr->d_type->tp_name,
     73                     obj->ob_type->tp_name);
     74        *pres = NULL;
     75        return 1;
     76    }
     77    return 0;
    7878}
    7979
     
    8181classmethod_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
    8282{
    83         /* Ensure a valid type.  Class methods ignore obj. */
    84         if (type == NULL) {
    85                 if (obj != NULL)
    86                         type = (PyObject *)obj->ob_type;
    87                 else {
    88                         /* Wot - no type?! */
    89                         PyErr_Format(PyExc_TypeError,
    90                                      "descriptor '%s' for type '%s' "
    91                                      "needs either an object or a type",
    92                                      descr_name((PyDescrObject *)descr),
    93                                      descr->d_type->tp_name);
    94                         return NULL;
    95                 }
    96         }
    97         if (!PyType_Check(type)) {
    98                 PyErr_Format(PyExc_TypeError,
    99                              "descriptor '%s' for type '%s' "
    100                              "needs a type, not a '%s' as arg 2",
    101                              descr_name((PyDescrObject *)descr),
    102                              descr->d_type->tp_name,
    103                              type->ob_type->tp_name);
    104                 return NULL;
    105         }
    106         if (!PyType_IsSubtype((PyTypeObject *)type, descr->d_type)) {
    107                 PyErr_Format(PyExc_TypeError,
    108                              "descriptor '%s' for type '%s' "
    109                              "doesn't apply to type '%s'",
    110                              descr_name((PyDescrObject *)descr),
    111                              descr->d_type->tp_name,
    112                              ((PyTypeObject *)type)->tp_name);
    113                 return NULL;
    114         }
    115         return PyCFunction_New(descr->d_method, type);
     83    /* Ensure a valid type.  Class methods ignore obj. */
     84    if (type == NULL) {
     85        if (obj != NULL)
     86            type = (PyObject *)obj->ob_type;
     87        else {
     88            /* Wot - no type?! */
     89            PyErr_Format(PyExc_TypeError,
     90                         "descriptor '%s' for type '%s' "
     91                         "needs either an object or a type",
     92                         descr_name((PyDescrObject *)descr),
     93                         descr->d_type->tp_name);
     94            return NULL;
     95        }
     96    }
     97    if (!PyType_Check(type)) {
     98        PyErr_Format(PyExc_TypeError,
     99                     "descriptor '%s' for type '%s' "
     100                     "needs a type, not a '%s' as arg 2",
     101                     descr_name((PyDescrObject *)descr),
     102                     descr->d_type->tp_name,
     103                     type->ob_type->tp_name);
     104        return NULL;
     105    }
     106    if (!PyType_IsSubtype((PyTypeObject *)type, descr->d_type)) {
     107        PyErr_Format(PyExc_TypeError,
     108                     "descriptor '%s' for type '%s' "
     109                     "doesn't apply to type '%s'",
     110                     descr_name((PyDescrObject *)descr),
     111                     descr->d_type->tp_name,
     112                     ((PyTypeObject *)type)->tp_name);
     113        return NULL;
     114    }
     115    return PyCFunction_New(descr->d_method, type);
    116116}
    117117
     
    119119method_get(PyMethodDescrObject *descr, PyObject *obj, PyObject *type)
    120120{
    121         PyObject *res;
    122 
    123         if (descr_check((PyDescrObject *)descr, obj, &res))
    124                 return res;
    125         return PyCFunction_New(descr->d_method, obj);
     121    PyObject *res;
     122
     123    if (descr_check((PyDescrObject *)descr, obj, &res))
     124        return res;
     125    return PyCFunction_New(descr->d_method, obj);
    126126}
    127127
     
    129129member_get(PyMemberDescrObject *descr, PyObject *obj, PyObject *type)
    130130{
    131         PyObject *res;
    132 
    133         if (descr_check((PyDescrObject *)descr, obj, &res))
    134                 return res;
    135         return PyMember_GetOne((char *)obj, descr->d_member);
     131    PyObject *res;
     132
     133    if (descr_check((PyDescrObject *)descr, obj, &res))
     134        return res;
     135    return PyMember_GetOne((char *)obj, descr->d_member);
    136136}
    137137
     
    139139getset_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *type)
    140140{
    141         PyObject *res;
    142 
    143         if (descr_check((PyDescrObject *)descr, obj, &res))
    144                 return res;
    145         if (descr->d_getset->get != NULL)
    146                 return descr->d_getset->get(obj, descr->d_getset->closure);
    147         PyErr_Format(PyExc_AttributeError,
    148                      "attribute '%.300s' of '%.100s' objects is not readable",
    149                      descr_name((PyDescrObject *)descr),
    150                      descr->d_type->tp_name);
    151         return NULL;
     141    PyObject *res;
     142
     143    if (descr_check((PyDescrObject *)descr, obj, &res))
     144        return res;
     145    if (descr->d_getset->get != NULL)
     146        return descr->d_getset->get(obj, descr->d_getset->closure);
     147    PyErr_Format(PyExc_AttributeError,
     148                 "attribute '%.300s' of '%.100s' objects is not readable",
     149                 descr_name((PyDescrObject *)descr),
     150                 descr->d_type->tp_name);
     151    return NULL;
    152152}
    153153
     
    155155wrapperdescr_get(PyWrapperDescrObject *descr, PyObject *obj, PyObject *type)
    156156{
    157         PyObject *res;
    158 
    159         if (descr_check((PyDescrObject *)descr, obj, &res))
    160                 return res;
    161         return PyWrapper_New((PyObject *)descr, obj);
     157    PyObject *res;
     158
     159    if (descr_check((PyDescrObject *)descr, obj, &res))
     160        return res;
     161    return PyWrapper_New((PyObject *)descr, obj);
    162162}
    163163
    164164static int
    165165descr_setcheck(PyDescrObject *descr, PyObject *obj, PyObject *value,
    166                int *pres)
    167 {
    168         assert(obj != NULL);
    169         if (!PyObject_TypeCheck(obj, descr->d_type)) {
    170                 PyErr_Format(PyExc_TypeError,
    171                              "descriptor '%.200s' for '%.100s' objects "
    172                              "doesn't apply to '%.100s' object",
    173                              descr_name(descr),
    174                              descr->d_type->tp_name,
    175                              obj->ob_type->tp_name);
    176                 *pres = -1;
    177                 return 1;
    178         }
    179         return 0;
     166               int *pres)
     167{
     168    assert(obj != NULL);
     169    if (!PyObject_TypeCheck(obj, descr->d_type)) {
     170        PyErr_Format(PyExc_TypeError,
     171                     "descriptor '%.200s' for '%.100s' objects "
     172                     "doesn't apply to '%.100s' object",
     173                     descr_name(descr),
     174                     descr->d_type->tp_name,
     175                     obj->ob_type->tp_name);
     176        *pres = -1;
     177        return 1;
     178    }
     179    return 0;
    180180}
    181181
     
    183183member_set(PyMemberDescrObject *descr, PyObject *obj, PyObject *value)
    184184{
    185         int res;
    186 
    187         if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
    188                 return res;
    189         return PyMember_SetOne((char *)obj, descr->d_member, value);
     185    int res;
     186
     187    if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
     188        return res;
     189    return PyMember_SetOne((char *)obj, descr->d_member, value);
    190190}
    191191
     
    193193getset_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value)
    194194{
    195         int res;
    196 
    197         if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
    198                 return res;
    199         if (descr->d_getset->set != NULL)
    200                 return descr->d_getset->set(obj, value,
    201                                             descr->d_getset->closure);
    202         PyErr_Format(PyExc_AttributeError,
    203                      "attribute '%.300s' of '%.100s' objects is not writable",
    204                      descr_name((PyDescrObject *)descr),
    205                      descr->d_type->tp_name);
    206         return -1;
     195    int res;
     196
     197    if (descr_setcheck((PyDescrObject *)descr, obj, value, &res))
     198        return res;
     199    if (descr->d_getset->set != NULL)
     200        return descr->d_getset->set(obj, value,
     201                                    descr->d_getset->closure);
     202    PyErr_Format(PyExc_AttributeError,
     203                 "attribute '%.300s' of '%.100s' objects is not writable",
     204                 descr_name((PyDescrObject *)descr),
     205                 descr->d_type->tp_name);
     206    return -1;
    207207}
    208208
     
    210210methoddescr_call(PyMethodDescrObject *descr, PyObject *args, PyObject *kwds)
    211211{
    212         Py_ssize_t argc;
    213         PyObject *self, *func, *result;
    214 
    215         /* Make sure that the first argument is acceptable as 'self' */
    216         assert(PyTuple_Check(args));
    217         argc = PyTuple_GET_SIZE(args);
    218         if (argc < 1) {
    219                 PyErr_Format(PyExc_TypeError,
    220                              "descriptor '%.300s' of '%.100s' "
    221                              "object needs an argument",
    222                              descr_name((PyDescrObject *)descr),
    223                              descr->d_type->tp_name);
    224                 return NULL;
    225         }
    226         self = PyTuple_GET_ITEM(args, 0);
    227         if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
    228                 PyErr_Format(PyExc_TypeError,
    229                              "descriptor '%.200s' "
    230                              "requires a '%.100s' object "
    231                              "but received a '%.100s'",
    232                              descr_name((PyDescrObject *)descr),
    233                              descr->d_type->tp_name,
    234                              self->ob_type->tp_name);
    235                 return NULL;
    236         }
    237 
    238         func = PyCFunction_New(descr->d_method, self);
    239         if (func == NULL)
    240                 return NULL;
    241         args = PyTuple_GetSlice(args, 1, argc);
    242         if (args == NULL) {
    243                 Py_DECREF(func);
    244                 return NULL;
    245         }
    246         result = PyEval_CallObjectWithKeywords(func, args, kwds);
    247         Py_DECREF(args);
    248         Py_DECREF(func);
    249         return result;
     212    Py_ssize_t argc;
     213    PyObject *self, *func, *result;
     214
     215    /* Make sure that the first argument is acceptable as 'self' */
     216    assert(PyTuple_Check(args));
     217    argc = PyTuple_GET_SIZE(args);
     218    if (argc < 1) {
     219        PyErr_Format(PyExc_TypeError,
     220                     "descriptor '%.300s' of '%.100s' "
     221                     "object needs an argument",
     222                     descr_name((PyDescrObject *)descr),
     223                     descr->d_type->tp_name);
     224        return NULL;
     225    }
     226    self = PyTuple_GET_ITEM(args, 0);
     227    if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
     228                                  (PyObject *)(descr->d_type))) {
     229        PyErr_Format(PyExc_TypeError,
     230                     "descriptor '%.200s' "
     231                     "requires a '%.100s' object "
     232                     "but received a '%.100s'",
     233                     descr_name((PyDescrObject *)descr),
     234                     descr->d_type->tp_name,
     235                     self->ob_type->tp_name);
     236        return NULL;
     237    }
     238
     239    func = PyCFunction_New(descr->d_method, self);
     240    if (func == NULL)
     241        return NULL;
     242    args = PyTuple_GetSlice(args, 1, argc);
     243    if (args == NULL) {
     244        Py_DECREF(func);
     245        return NULL;
     246    }
     247    result = PyEval_CallObjectWithKeywords(func, args, kwds);
     248    Py_DECREF(args);
     249    Py_DECREF(func);
     250    return result;
    250251}
    251252
    252253static PyObject *
    253254classmethoddescr_call(PyMethodDescrObject *descr, PyObject *args,
    254                       PyObject *kwds)
    255 {
    256         PyObject *func, *result;
    257 
    258         func = PyCFunction_New(descr->d_method, (PyObject *)descr->d_type);
    259         if (func == NULL)
    260                 return NULL;
    261 
    262         result = PyEval_CallObjectWithKeywords(func, args, kwds);
    263         Py_DECREF(func);
    264         return result;
     255                      PyObject *kwds)
     256{
     257    Py_ssize_t argc;
     258    PyObject *self, *func, *result;
     259
     260    /* Make sure that the first argument is acceptable as 'self' */
     261    assert(PyTuple_Check(args));
     262    argc = PyTuple_GET_SIZE(args);
     263    if (argc < 1) {
     264        PyErr_Format(PyExc_TypeError,
     265                     "descriptor '%s' of '%.100s' "
     266                     "object needs an argument",
     267                     descr_name((PyDescrObject *)descr),
     268                     descr->d_type->tp_name);
     269        return NULL;
     270    }
     271    self = PyTuple_GET_ITEM(args, 0);
     272    if (!PyType_Check(self)) {
     273        PyErr_Format(PyExc_TypeError,
     274                     "descriptor '%s' requires a type "
     275                     "but received a '%.100s'",
     276                     descr_name((PyDescrObject *)descr),
     277                     self->ob_type->tp_name);
     278        return NULL;
     279    }
     280    if (!PyType_IsSubtype((PyTypeObject *)self, descr->d_type)) {
     281        PyErr_Format(PyExc_TypeError,
     282                     "descriptor '%s' "
     283                     "requires a subtype of '%.100s' "
     284                     "but received '%.100s",
     285                     descr_name((PyDescrObject *)descr),
     286                     descr->d_type->tp_name,
     287                     self->ob_type->tp_name);
     288        return NULL;
     289    }
     290
     291    func = PyCFunction_New(descr->d_method, self);
     292    if (func == NULL)
     293        return NULL;
     294    args = PyTuple_GetSlice(args, 1, argc);
     295    if (args == NULL) {
     296        Py_DECREF(func);
     297        return NULL;
     298    }
     299    result = PyEval_CallObjectWithKeywords(func, args, kwds);
     300    Py_DECREF(func);
     301    Py_DECREF(args);
     302    return result;
    265303}
    266304
     
    268306wrapperdescr_call(PyWrapperDescrObject *descr, PyObject *args, PyObject *kwds)
    269307{
    270         Py_ssize_t argc;
    271         PyObject *self, *func, *result;
    272 
    273         /* Make sure that the first argument is acceptable as 'self' */
    274         assert(PyTuple_Check(args));
    275         argc = PyTuple_GET_SIZE(args);
    276         if (argc < 1) {
    277                 PyErr_Format(PyExc_TypeError,
    278                              "descriptor '%.300s' of '%.100s' "
    279                              "object needs an argument",
    280                              descr_name((PyDescrObject *)descr),
    281                              descr->d_type->tp_name);
    282                 return NULL;
    283         }
    284         self = PyTuple_GET_ITEM(args, 0);
    285         if (!PyObject_IsInstance(self, (PyObject *)(descr->d_type))) {
    286                 PyErr_Format(PyExc_TypeError,
    287                              "descriptor '%.200s' "
    288                              "requires a '%.100s' object "
    289                              "but received a '%.100s'",
    290                              descr_name((PyDescrObject *)descr),
    291                              descr->d_type->tp_name,
    292                              self->ob_type->tp_name);
    293                 return NULL;
    294         }
    295 
    296         func = PyWrapper_New((PyObject *)descr, self);
    297         if (func == NULL)
    298                 return NULL;
    299         args = PyTuple_GetSlice(args, 1, argc);
    300         if (args == NULL) {
    301                 Py_DECREF(func);
    302                 return NULL;
    303         }
    304         result = PyEval_CallObjectWithKeywords(func, args, kwds);
    305         Py_DECREF(args);
    306         Py_DECREF(func);
    307         return result;
     308    Py_ssize_t argc;
     309    PyObject *self, *func, *result;
     310
     311    /* Make sure that the first argument is acceptable as 'self' */
     312    assert(PyTuple_Check(args));
     313    argc = PyTuple_GET_SIZE(args);
     314    if (argc < 1) {
     315        PyErr_Format(PyExc_TypeError,
     316                     "descriptor '%.300s' of '%.100s' "
     317                     "object needs an argument",
     318                     descr_name((PyDescrObject *)descr),
     319                     descr->d_type->tp_name);
     320        return NULL;
     321    }
     322    self = PyTuple_GET_ITEM(args, 0);
     323    if (!_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
     324                                  (PyObject *)(descr->d_type))) {
     325        PyErr_Format(PyExc_TypeError,
     326                     "descriptor '%.200s' "
     327                     "requires a '%.100s' object "
     328                     "but received a '%.100s'",
     329                     descr_name((PyDescrObject *)descr),
     330                     descr->d_type->tp_name,
     331                     self->ob_type->tp_name);
     332        return NULL;
     333    }
     334
     335    func = PyWrapper_New((PyObject *)descr, self);
     336    if (func == NULL)
     337        return NULL;
     338    args = PyTuple_GetSlice(args, 1, argc);
     339    if (args == NULL) {
     340        Py_DECREF(func);
     341        return NULL;
     342    }
     343    result = PyEval_CallObjectWithKeywords(func, args, kwds);
     344    Py_DECREF(args);
     345    Py_DECREF(func);
     346    return result;
    308347}
    309348
     
    311350method_get_doc(PyMethodDescrObject *descr, void *closure)
    312351{
    313         if (descr->d_method->ml_doc == NULL) {
    314                 Py_INCREF(Py_None);
    315                 return Py_None;
    316         }
    317         return PyString_FromString(descr->d_method->ml_doc);
     352    if (descr->d_method->ml_doc == NULL) {
     353        Py_INCREF(Py_None);
     354        return Py_None;
     355    }
     356    return PyString_FromString(descr->d_method->ml_doc);
    318357}
    319358
    320359static PyMemberDef descr_members[] = {
    321         {"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
    322         {"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
    323         {0}
     360    {"__objclass__", T_OBJECT, offsetof(PyDescrObject, d_type), READONLY},
     361    {"__name__", T_OBJECT, offsetof(PyDescrObject, d_name), READONLY},
     362    {0}
    324363};
    325364
    326365static PyGetSetDef method_getset[] = {
    327         {"__doc__", (getter)method_get_doc},
    328         {0}
     366    {"__doc__", (getter)method_get_doc},
     367    {0}
    329368};
    330369
     
    332371member_get_doc(PyMemberDescrObject *descr, void *closure)
    333372{
    334         if (descr->d_member->doc == NULL) {
    335                 Py_INCREF(Py_None);
    336                 return Py_None;
    337         }
    338         return PyString_FromString(descr->d_member->doc);
     373    if (descr->d_member->doc == NULL) {
     374        Py_INCREF(Py_None);
     375        return Py_None;
     376    }
     377    return PyString_FromString(descr->d_member->doc);
    339378}
    340379
    341380static PyGetSetDef member_getset[] = {
    342         {"__doc__", (getter)member_get_doc},
    343         {0}
     381    {"__doc__", (getter)member_get_doc},
     382    {0}
    344383};
    345384
     
    347386getset_get_doc(PyGetSetDescrObject *descr, void *closure)
    348387{
    349         if (descr->d_getset->doc == NULL) {
    350                 Py_INCREF(Py_None);
    351                 return Py_None;
    352         }
    353         return PyString_FromString(descr->d_getset->doc);
     388    if (descr->d_getset->doc == NULL) {
     389        Py_INCREF(Py_None);
     390        return Py_None;
     391    }
     392    return PyString_FromString(descr->d_getset->doc);
    354393}
    355394
    356395static PyGetSetDef getset_getset[] = {
    357         {"__doc__", (getter)getset_get_doc},
    358         {0}
     396    {"__doc__", (getter)getset_get_doc},
     397    {0}
    359398};
    360399
     
    362401wrapperdescr_get_doc(PyWrapperDescrObject *descr, void *closure)
    363402{
    364         if (descr->d_base->doc == NULL) {
    365                 Py_INCREF(Py_None);
    366                 return Py_None;
    367         }
    368         return PyString_FromString(descr->d_base->doc);
     403    if (descr->d_base->doc == NULL) {
     404        Py_INCREF(Py_None);
     405        return Py_None;
     406    }
     407    return PyString_FromString(descr->d_base->doc);
    369408}
    370409
    371410static PyGetSetDef wrapperdescr_getset[] = {
    372         {"__doc__", (getter)wrapperdescr_get_doc},
    373         {0}
     411    {"__doc__", (getter)wrapperdescr_get_doc},
     412    {0}
    374413};
    375414
     
    377416descr_traverse(PyObject *self, visitproc visit, void *arg)
    378417{
    379         PyDescrObject *descr = (PyDescrObject *)self;
    380         Py_VISIT(descr->d_type);
    381         return 0;
     418    PyDescrObject *descr = (PyDescrObject *)self;
     419    Py_VISIT(descr->d_type);
     420    return 0;
    382421}
    383422
    384423static PyTypeObject PyMethodDescr_Type = {
    385         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    386         "method_descriptor",
    387         sizeof(PyMethodDescrObject),
    388         0,
    389         (destructor)descr_dealloc,              /* tp_dealloc */
    390         0,                                      /* tp_print */
    391         0,                                      /* tp_getattr */
    392         0,                                      /* tp_setattr */
    393         0,                                      /* tp_compare */
    394         (reprfunc)method_repr,                  /* tp_repr */
    395         0,                                      /* tp_as_number */
    396         0,                                      /* tp_as_sequence */
    397         0,                                      /* tp_as_mapping */
    398         0,                                      /* tp_hash */
    399         (ternaryfunc)methoddescr_call,          /* tp_call */
    400         0,                                      /* tp_str */
    401         PyObject_GenericGetAttr,                /* tp_getattro */
    402         0,                                      /* tp_setattro */
    403         0,                                      /* tp_as_buffer */
    404         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    405         0,                                      /* tp_doc */
    406         descr_traverse,                         /* tp_traverse */
    407         0,                                      /* tp_clear */
    408         0,                                      /* tp_richcompare */
    409         0,                                      /* tp_weaklistoffset */
    410         0,                                      /* tp_iter */
    411         0,                                      /* tp_iternext */
    412         0,                                      /* tp_methods */
    413         descr_members,                          /* tp_members */
    414         method_getset,                          /* tp_getset */
    415         0,                                      /* tp_base */
    416         0,                                      /* tp_dict */
    417         (descrgetfunc)method_get,               /* tp_descr_get */
    418         0,                                      /* tp_descr_set */
     424    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     425    "method_descriptor",
     426    sizeof(PyMethodDescrObject),
     427    0,
     428    (destructor)descr_dealloc,                  /* tp_dealloc */
     429    0,                                          /* tp_print */
     430    0,                                          /* tp_getattr */
     431    0,                                          /* tp_setattr */
     432    0,                                          /* tp_compare */
     433    (reprfunc)method_repr,                      /* tp_repr */
     434    0,                                          /* tp_as_number */
     435    0,                                          /* tp_as_sequence */
     436    0,                                          /* tp_as_mapping */
     437    0,                                          /* tp_hash */
     438    (ternaryfunc)methoddescr_call,              /* tp_call */
     439    0,                                          /* tp_str */
     440    PyObject_GenericGetAttr,                    /* tp_getattro */
     441    0,                                          /* tp_setattro */
     442    0,                                          /* tp_as_buffer */
     443    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     444    0,                                          /* tp_doc */
     445    descr_traverse,                             /* tp_traverse */
     446    0,                                          /* tp_clear */
     447    0,                                          /* tp_richcompare */
     448    0,                                          /* tp_weaklistoffset */
     449    0,                                          /* tp_iter */
     450    0,                                          /* tp_iternext */
     451    0,                                          /* tp_methods */
     452    descr_members,                              /* tp_members */
     453    method_getset,                              /* tp_getset */
     454    0,                                          /* tp_base */
     455    0,                                          /* tp_dict */
     456    (descrgetfunc)method_get,                   /* tp_descr_get */
     457    0,                                          /* tp_descr_set */
    419458};
    420459
    421460/* This is for METH_CLASS in C, not for "f = classmethod(f)" in Python! */
    422461static PyTypeObject PyClassMethodDescr_Type = {
    423         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    424         "classmethod_descriptor",
    425         sizeof(PyMethodDescrObject),
    426         0,
    427         (destructor)descr_dealloc,              /* tp_dealloc */
    428         0,                                      /* tp_print */
    429         0,                                      /* tp_getattr */
    430         0,                                      /* tp_setattr */
    431         0,                                      /* tp_compare */
    432         (reprfunc)method_repr,                  /* tp_repr */
    433         0,                                      /* tp_as_number */
    434         0,                                      /* tp_as_sequence */
    435         0,                                      /* tp_as_mapping */
    436         0,                                      /* tp_hash */
    437         (ternaryfunc)classmethoddescr_call,     /* tp_call */
    438         0,                                      /* tp_str */
    439         PyObject_GenericGetAttr,                /* tp_getattro */
    440         0,                                      /* tp_setattro */
    441         0,                                      /* tp_as_buffer */
    442         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    443         0,                                      /* tp_doc */
    444         descr_traverse,                         /* tp_traverse */
    445         0,                                      /* tp_clear */
    446         0,                                      /* tp_richcompare */
    447         0,                                      /* tp_weaklistoffset */
    448         0,                                      /* tp_iter */
    449         0,                                      /* tp_iternext */
    450         0,                                      /* tp_methods */
    451         descr_members,                          /* tp_members */
    452         method_getset,                          /* tp_getset */
    453         0,                                      /* tp_base */
    454         0,                                      /* tp_dict */
    455         (descrgetfunc)classmethod_get,          /* tp_descr_get */
    456         0,                                      /* tp_descr_set */
     462    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     463    "classmethod_descriptor",
     464    sizeof(PyMethodDescrObject),
     465    0,
     466    (destructor)descr_dealloc,                  /* tp_dealloc */
     467    0,                                          /* tp_print */
     468    0,                                          /* tp_getattr */
     469    0,                                          /* tp_setattr */
     470    0,                                          /* tp_compare */
     471    (reprfunc)method_repr,                      /* tp_repr */
     472    0,                                          /* tp_as_number */
     473    0,                                          /* tp_as_sequence */
     474    0,                                          /* tp_as_mapping */
     475    0,                                          /* tp_hash */
     476    (ternaryfunc)classmethoddescr_call,         /* tp_call */
     477    0,                                          /* tp_str */
     478    PyObject_GenericGetAttr,                    /* tp_getattro */
     479    0,                                          /* tp_setattro */
     480    0,                                          /* tp_as_buffer */
     481    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     482    0,                                          /* tp_doc */
     483    descr_traverse,                             /* tp_traverse */
     484    0,                                          /* tp_clear */
     485    0,                                          /* tp_richcompare */
     486    0,                                          /* tp_weaklistoffset */
     487    0,                                          /* tp_iter */
     488    0,                                          /* tp_iternext */
     489    0,                                          /* tp_methods */
     490    descr_members,                              /* tp_members */
     491    method_getset,                              /* tp_getset */
     492    0,                                          /* tp_base */
     493    0,                                          /* tp_dict */
     494    (descrgetfunc)classmethod_get,              /* tp_descr_get */
     495    0,                                          /* tp_descr_set */
    457496};
    458497
    459498PyTypeObject PyMemberDescr_Type = {
    460         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    461         "member_descriptor",
    462         sizeof(PyMemberDescrObject),
    463         0,
    464         (destructor)descr_dealloc,              /* tp_dealloc */
    465         0,                                      /* tp_print */
    466         0,                                      /* tp_getattr */
    467         0,                                      /* tp_setattr */
    468         0,                                      /* tp_compare */
    469         (reprfunc)member_repr,                  /* tp_repr */
    470         0,                                      /* tp_as_number */
    471         0,                                      /* tp_as_sequence */
    472         0,                                      /* tp_as_mapping */
    473         0,                                      /* tp_hash */
    474         0,                                      /* tp_call */
    475         0,                                      /* tp_str */
    476         PyObject_GenericGetAttr,                /* tp_getattro */
    477         0,                                      /* tp_setattro */
    478         0,                                      /* tp_as_buffer */
    479         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    480         0,                                      /* tp_doc */
    481         descr_traverse,                         /* tp_traverse */
    482         0,                                      /* tp_clear */
    483         0,                                      /* tp_richcompare */
    484         0,                                      /* tp_weaklistoffset */
    485         0,                                      /* tp_iter */
    486         0,                                      /* tp_iternext */
    487         0,                                      /* tp_methods */
    488         descr_members,                          /* tp_members */
    489         member_getset,                          /* tp_getset */
    490         0,                                      /* tp_base */
    491         0,                                      /* tp_dict */
    492         (descrgetfunc)member_get,               /* tp_descr_get */
    493         (descrsetfunc)member_set,               /* tp_descr_set */
     499    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     500    "member_descriptor",
     501    sizeof(PyMemberDescrObject),
     502    0,
     503    (destructor)descr_dealloc,                  /* tp_dealloc */
     504    0,                                          /* tp_print */
     505    0,                                          /* tp_getattr */
     506    0,                                          /* tp_setattr */
     507    0,                                          /* tp_compare */
     508    (reprfunc)member_repr,                      /* tp_repr */
     509    0,                                          /* tp_as_number */
     510    0,                                          /* tp_as_sequence */
     511    0,                                          /* tp_as_mapping */
     512    0,                                          /* tp_hash */
     513    0,                                          /* tp_call */
     514    0,                                          /* tp_str */
     515    PyObject_GenericGetAttr,                    /* tp_getattro */
     516    0,                                          /* tp_setattro */
     517    0,                                          /* tp_as_buffer */
     518    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     519    0,                                          /* tp_doc */
     520    descr_traverse,                             /* tp_traverse */
     521    0,                                          /* tp_clear */
     522    0,                                          /* tp_richcompare */
     523    0,                                          /* tp_weaklistoffset */
     524    0,                                          /* tp_iter */
     525    0,                                          /* tp_iternext */
     526    0,                                          /* tp_methods */
     527    descr_members,                              /* tp_members */
     528    member_getset,                              /* tp_getset */
     529    0,                                          /* tp_base */
     530    0,                                          /* tp_dict */
     531    (descrgetfunc)member_get,                   /* tp_descr_get */
     532    (descrsetfunc)member_set,                   /* tp_descr_set */
    494533};
    495534
    496535PyTypeObject PyGetSetDescr_Type = {
    497         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    498         "getset_descriptor",
    499         sizeof(PyGetSetDescrObject),
    500         0,
    501         (destructor)descr_dealloc,              /* tp_dealloc */
    502         0,                                      /* tp_print */
    503         0,                                      /* tp_getattr */
    504         0,                                      /* tp_setattr */
    505         0,                                      /* tp_compare */
    506         (reprfunc)getset_repr,                  /* tp_repr */
    507         0,                                      /* tp_as_number */
    508         0,                                      /* tp_as_sequence */
    509         0,                                      /* tp_as_mapping */
    510         0,                                      /* tp_hash */
    511         0,                                      /* tp_call */
    512         0,                                      /* tp_str */
    513         PyObject_GenericGetAttr,                /* tp_getattro */
    514         0,                                      /* tp_setattro */
    515         0,                                      /* tp_as_buffer */
    516         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    517         0,                                      /* tp_doc */
    518         descr_traverse,                         /* tp_traverse */
    519         0,                                      /* tp_clear */
    520         0,                                      /* tp_richcompare */
    521         0,                                      /* tp_weaklistoffset */
    522         0,                                      /* tp_iter */
    523         0,                                      /* tp_iternext */
    524         0,                                      /* tp_methods */
    525         descr_members,                          /* tp_members */
    526         getset_getset,                          /* tp_getset */
    527         0,                                      /* tp_base */
    528         0,                                      /* tp_dict */
    529         (descrgetfunc)getset_get,               /* tp_descr_get */
    530         (descrsetfunc)getset_set,               /* tp_descr_set */
     536    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     537    "getset_descriptor",
     538    sizeof(PyGetSetDescrObject),
     539    0,
     540    (destructor)descr_dealloc,                  /* tp_dealloc */
     541    0,                                          /* tp_print */
     542    0,                                          /* tp_getattr */
     543    0,                                          /* tp_setattr */
     544    0,                                          /* tp_compare */
     545    (reprfunc)getset_repr,                      /* tp_repr */
     546    0,                                          /* tp_as_number */
     547    0,                                          /* tp_as_sequence */
     548    0,                                          /* tp_as_mapping */
     549    0,                                          /* tp_hash */
     550    0,                                          /* tp_call */
     551    0,                                          /* tp_str */
     552    PyObject_GenericGetAttr,                    /* tp_getattro */
     553    0,                                          /* tp_setattro */
     554    0,                                          /* tp_as_buffer */
     555    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     556    0,                                          /* tp_doc */
     557    descr_traverse,                             /* tp_traverse */
     558    0,                                          /* tp_clear */
     559    0,                                          /* tp_richcompare */
     560    0,                                          /* tp_weaklistoffset */
     561    0,                                          /* tp_iter */
     562    0,                                          /* tp_iternext */
     563    0,                                          /* tp_methods */
     564    descr_members,                              /* tp_members */
     565    getset_getset,                              /* tp_getset */
     566    0,                                          /* tp_base */
     567    0,                                          /* tp_dict */
     568    (descrgetfunc)getset_get,                   /* tp_descr_get */
     569    (descrsetfunc)getset_set,                   /* tp_descr_set */
    531570};
    532571
    533572PyTypeObject PyWrapperDescr_Type = {
    534         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    535         "wrapper_descriptor",
    536         sizeof(PyWrapperDescrObject),
    537         0,
    538         (destructor)descr_dealloc,              /* tp_dealloc */
    539         0,                                      /* tp_print */
    540         0,                                      /* tp_getattr */
    541         0,                                      /* tp_setattr */
    542         0,                                      /* tp_compare */
    543         (reprfunc)wrapperdescr_repr,            /* tp_repr */
    544         0,                                      /* tp_as_number */
    545         0,                                      /* tp_as_sequence */
    546         0,                                      /* tp_as_mapping */
    547         0,                                      /* tp_hash */
    548         (ternaryfunc)wrapperdescr_call,         /* tp_call */
    549         0,                                      /* tp_str */
    550         PyObject_GenericGetAttr,                /* tp_getattro */
    551         0,                                      /* tp_setattro */
    552         0,                                      /* tp_as_buffer */
    553         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    554         0,                                      /* tp_doc */
    555         descr_traverse,                         /* tp_traverse */
    556         0,                                      /* tp_clear */
    557         0,                                      /* tp_richcompare */
    558         0,                                      /* tp_weaklistoffset */
    559         0,                                      /* tp_iter */
    560         0,                                      /* tp_iternext */
    561         0,                                      /* tp_methods */
    562         descr_members,                          /* tp_members */
    563         wrapperdescr_getset,                    /* tp_getset */
    564         0,                                      /* tp_base */
    565         0,                                      /* tp_dict */
    566         (descrgetfunc)wrapperdescr_get,         /* tp_descr_get */
    567         0,                                      /* tp_descr_set */
     573    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     574    "wrapper_descriptor",
     575    sizeof(PyWrapperDescrObject),
     576    0,
     577    (destructor)descr_dealloc,                  /* tp_dealloc */
     578    0,                                          /* tp_print */
     579    0,                                          /* tp_getattr */
     580    0,                                          /* tp_setattr */
     581    0,                                          /* tp_compare */
     582    (reprfunc)wrapperdescr_repr,                /* tp_repr */
     583    0,                                          /* tp_as_number */
     584    0,                                          /* tp_as_sequence */
     585    0,                                          /* tp_as_mapping */
     586    0,                                          /* tp_hash */
     587    (ternaryfunc)wrapperdescr_call,             /* tp_call */
     588    0,                                          /* tp_str */
     589    PyObject_GenericGetAttr,                    /* tp_getattro */
     590    0,                                          /* tp_setattro */
     591    0,                                          /* tp_as_buffer */
     592    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     593    0,                                          /* tp_doc */
     594    descr_traverse,                             /* tp_traverse */
     595    0,                                          /* tp_clear */
     596    0,                                          /* tp_richcompare */
     597    0,                                          /* tp_weaklistoffset */
     598    0,                                          /* tp_iter */
     599    0,                                          /* tp_iternext */
     600    0,                                          /* tp_methods */
     601    descr_members,                              /* tp_members */
     602    wrapperdescr_getset,                        /* tp_getset */
     603    0,                                          /* tp_base */
     604    0,                                          /* tp_dict */
     605    (descrgetfunc)wrapperdescr_get,             /* tp_descr_get */
     606    0,                                          /* tp_descr_set */
    568607};
    569608
     
    571610descr_new(PyTypeObject *descrtype, PyTypeObject *type, const char *name)
    572611{
    573         PyDescrObject *descr;
    574 
    575         descr = (PyDescrObject *)PyType_GenericAlloc(descrtype, 0);
    576         if (descr != NULL) {
    577                 Py_XINCREF(type);
    578                 descr->d_type = type;
    579                 descr->d_name = PyString_InternFromString(name);
    580                 if (descr->d_name == NULL) {
    581                         Py_DECREF(descr);
    582                         descr = NULL;
    583                 }
    584         }
    585         return descr;
     612    PyDescrObject *descr;
     613
     614    descr = (PyDescrObject *)PyType_GenericAlloc(descrtype, 0);
     615    if (descr != NULL) {
     616        Py_XINCREF(type);
     617        descr->d_type = type;
     618        descr->d_name = PyString_InternFromString(name);
     619        if (descr->d_name == NULL) {
     620            Py_DECREF(descr);
     621            descr = NULL;
     622        }
     623    }
     624    return descr;
    586625}
    587626
     
    589628PyDescr_NewMethod(PyTypeObject *type, PyMethodDef *method)
    590629{
    591         PyMethodDescrObject *descr;
    592 
    593         descr = (PyMethodDescrObject *)descr_new(&PyMethodDescr_Type,
    594                                                 type, method->ml_name);
    595         if (descr != NULL)
    596                 descr->d_method = method;
    597         return (PyObject *)descr;
     630    PyMethodDescrObject *descr;
     631
     632    descr = (PyMethodDescrObject *)descr_new(&PyMethodDescr_Type,
     633                                            type, method->ml_name);
     634    if (descr != NULL)
     635        descr->d_method = method;
     636    return (PyObject *)descr;
    598637}
    599638
     
    601640PyDescr_NewClassMethod(PyTypeObject *type, PyMethodDef *method)
    602641{
    603         PyMethodDescrObject *descr;
    604 
    605         descr = (PyMethodDescrObject *)descr_new(&PyClassMethodDescr_Type,
    606                                                 type, method->ml_name);
    607         if (descr != NULL)
    608                 descr->d_method = method;
    609         return (PyObject *)descr;
     642    PyMethodDescrObject *descr;
     643
     644    descr = (PyMethodDescrObject *)descr_new(&PyClassMethodDescr_Type,
     645                                            type, method->ml_name);
     646    if (descr != NULL)
     647        descr->d_method = method;
     648    return (PyObject *)descr;
    610649}
    611650
     
    613652PyDescr_NewMember(PyTypeObject *type, PyMemberDef *member)
    614653{
    615         PyMemberDescrObject *descr;
    616 
    617         descr = (PyMemberDescrObject *)descr_new(&PyMemberDescr_Type,
    618                                                 type, member->name);
    619         if (descr != NULL)
    620                 descr->d_member = member;
    621         return (PyObject *)descr;
     654    PyMemberDescrObject *descr;
     655
     656    descr = (PyMemberDescrObject *)descr_new(&PyMemberDescr_Type,
     657                                            type, member->name);
     658    if (descr != NULL)
     659        descr->d_member = member;
     660    return (PyObject *)descr;
    622661}
    623662
     
    625664PyDescr_NewGetSet(PyTypeObject *type, PyGetSetDef *getset)
    626665{
    627         PyGetSetDescrObject *descr;
    628 
    629         descr = (PyGetSetDescrObject *)descr_new(&PyGetSetDescr_Type,
    630                                                 type, getset->name);
    631         if (descr != NULL)
    632                 descr->d_getset = getset;
    633         return (PyObject *)descr;
     666    PyGetSetDescrObject *descr;
     667
     668    descr = (PyGetSetDescrObject *)descr_new(&PyGetSetDescr_Type,
     669                                            type, getset->name);
     670    if (descr != NULL)
     671        descr->d_getset = getset;
     672    return (PyObject *)descr;
    634673}
    635674
     
    637676PyDescr_NewWrapper(PyTypeObject *type, struct wrapperbase *base, void *wrapped)
    638677{
    639         PyWrapperDescrObject *descr;
    640 
    641         descr = (PyWrapperDescrObject *)descr_new(&PyWrapperDescr_Type,
    642                                                 type, base->name);
    643         if (descr != NULL) {
    644                 descr->d_base = base;
    645                 descr->d_wrapped = wrapped;
    646         }
    647         return (PyObject *)descr;
     678    PyWrapperDescrObject *descr;
     679
     680    descr = (PyWrapperDescrObject *)descr_new(&PyWrapperDescr_Type,
     681                                            type, base->name);
     682    if (descr != NULL) {
     683        descr->d_base = base;
     684        descr->d_wrapped = wrapped;
     685    }
     686    return (PyObject *)descr;
    648687}
    649688
     
    655694
    656695typedef struct {
    657         PyObject_HEAD
    658         PyObject *dict;
     696    PyObject_HEAD
     697    PyObject *dict;
    659698} proxyobject;
    660699
     
    662701proxy_len(proxyobject *pp)
    663702{
    664         return PyObject_Size(pp->dict);
     703    return PyObject_Size(pp->dict);
    665704}
    666705
     
    668707proxy_getitem(proxyobject *pp, PyObject *key)
    669708{
    670         return PyObject_GetItem(pp->dict, key);
     709    return PyObject_GetItem(pp->dict, key);
    671710}
    672711
    673712static PyMappingMethods proxy_as_mapping = {
    674         (lenfunc)proxy_len,                     /* mp_length */
    675         (binaryfunc)proxy_getitem,              /* mp_subscript */
    676         0,                                      /* mp_ass_subscript */
     713    (lenfunc)proxy_len,                         /* mp_length */
     714    (binaryfunc)proxy_getitem,                  /* mp_subscript */
     715    0,                                          /* mp_ass_subscript */
    677716};
    678717
     
    680719proxy_contains(proxyobject *pp, PyObject *key)
    681720{
    682         return PyDict_Contains(pp->dict, key);
     721    return PyDict_Contains(pp->dict, key);
    683722}
    684723
    685724static PySequenceMethods proxy_as_sequence = {
    686         0,                                      /* sq_length */
    687         0,                                      /* sq_concat */
    688         0,                                      /* sq_repeat */
    689         0,                                      /* sq_item */
    690         0,                                      /* sq_slice */
    691         0,                                      /* sq_ass_item */
    692         0,                                      /* sq_ass_slice */
    693         (objobjproc)proxy_contains,             /* sq_contains */
    694         0,                                      /* sq_inplace_concat */
    695         0,                                      /* sq_inplace_repeat */
     725    0,                                          /* sq_length */
     726    0,                                          /* sq_concat */
     727    0,                                          /* sq_repeat */
     728    0,                                          /* sq_item */
     729    0,                                          /* sq_slice */
     730    0,                                          /* sq_ass_item */
     731    0,                                          /* sq_ass_slice */
     732    (objobjproc)proxy_contains,                 /* sq_contains */
     733    0,                                          /* sq_inplace_concat */
     734    0,                                          /* sq_inplace_repeat */
    696735};
    697736
     
    699738proxy_has_key(proxyobject *pp, PyObject *key)
    700739{
    701         int res = PyDict_Contains(pp->dict, key);
    702         if (res < 0)
    703                 return NULL;
    704         return PyBool_FromLong(res);
     740    int res = PyDict_Contains(pp->dict, key);
     741    if (res < 0)
     742        return NULL;
     743    return PyBool_FromLong(res);
    705744}
    706745
     
    708747proxy_get(proxyobject *pp, PyObject *args)
    709748{
    710         PyObject *key, *def = Py_None;
    711 
    712         if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def))
    713                 return NULL;
    714         return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def);
     749    PyObject *key, *def = Py_None;
     750
     751    if (!PyArg_UnpackTuple(args, "get", 1, 2, &key, &def))
     752        return NULL;
     753    return PyObject_CallMethod(pp->dict, "get", "(OO)", key, def);
    715754}
    716755
     
    718757proxy_keys(proxyobject *pp)
    719758{
    720         return PyMapping_Keys(pp->dict);
     759    return PyMapping_Keys(pp->dict);
    721760}
    722761
     
    724763proxy_values(proxyobject *pp)
    725764{
    726         return PyMapping_Values(pp->dict);
     765    return PyMapping_Values(pp->dict);
    727766}
    728767
     
    730769proxy_items(proxyobject *pp)
    731770{
    732         return PyMapping_Items(pp->dict);
     771    return PyMapping_Items(pp->dict);
    733772}
    734773
     
    736775proxy_iterkeys(proxyobject *pp)
    737776{
    738         return PyObject_CallMethod(pp->dict, "iterkeys", NULL);
     777    return PyObject_CallMethod(pp->dict, "iterkeys", NULL);
    739778}
    740779
     
    742781proxy_itervalues(proxyobject *pp)
    743782{
    744         return PyObject_CallMethod(pp->dict, "itervalues", NULL);
     783    return PyObject_CallMethod(pp->dict, "itervalues", NULL);
    745784}
    746785
     
    748787proxy_iteritems(proxyobject *pp)
    749788{
    750         return PyObject_CallMethod(pp->dict, "iteritems", NULL);
     789    return PyObject_CallMethod(pp->dict, "iteritems", NULL);
    751790}
    752791static PyObject *
    753792proxy_copy(proxyobject *pp)
    754793{
    755         return PyObject_CallMethod(pp->dict, "copy", NULL);
     794    return PyObject_CallMethod(pp->dict, "copy", NULL);
    756795}
    757796
    758797static PyMethodDef proxy_methods[] = {
    759         {"has_key",   (PyCFunction)proxy_has_key,    METH_O,
    760         PyDoc_STR("D.has_key(k) -> True if D has a key k, else False")},
    761         {"get",       (PyCFunction)proxy_get,        METH_VARARGS,
    762         PyDoc_STR("D.get(k[,d]) -> D[k] if D.has_key(k), else d."
    763                                         "  d defaults to None.")},
    764         {"keys",      (PyCFunction)proxy_keys,       METH_NOARGS,
    765         PyDoc_STR("D.keys() -> list of D's keys")},
    766         {"values",    (PyCFunction)proxy_values,     METH_NOARGS,
    767         PyDoc_STR("D.values() -> list of D's values")},
    768         {"items",     (PyCFunction)proxy_items,      METH_NOARGS,
    769         PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")},
    770         {"iterkeys",  (PyCFunction)proxy_iterkeys,   METH_NOARGS,
    771         PyDoc_STR("D.iterkeys() -> an iterator over the keys of D")},
    772         {"itervalues",(PyCFunction)proxy_itervalues, METH_NOARGS,
    773         PyDoc_STR("D.itervalues() -> an iterator over the values of D")},
    774         {"iteritems", (PyCFunction)proxy_iteritems,  METH_NOARGS,
    775         PyDoc_STR("D.iteritems() ->"
    776                    " an iterator over the (key, value) items of D")},
    777         {"copy",      (PyCFunction)proxy_copy,       METH_NOARGS,
    778         PyDoc_STR("D.copy() -> a shallow copy of D")},
    779         {0}
     798    {"has_key",   (PyCFunction)proxy_has_key,    METH_O,
     799    PyDoc_STR("D.has_key(k) -> True if D has a key k, else False")},
     800    {"get",       (PyCFunction)proxy_get,        METH_VARARGS,
     801    PyDoc_STR("D.get(k[,d]) -> D[k] if D.has_key(k), else d."
     802                                    "  d defaults to None.")},
     803    {"keys",      (PyCFunction)proxy_keys,       METH_NOARGS,
     804    PyDoc_STR("D.keys() -> list of D's keys")},
     805    {"values",    (PyCFunction)proxy_values,     METH_NOARGS,
     806    PyDoc_STR("D.values() -> list of D's values")},
     807    {"items",     (PyCFunction)proxy_items,      METH_NOARGS,
     808    PyDoc_STR("D.items() -> list of D's (key, value) pairs, as 2-tuples")},
     809    {"iterkeys",  (PyCFunction)proxy_iterkeys,   METH_NOARGS,
     810    PyDoc_STR("D.iterkeys() -> an iterator over the keys of D")},
     811    {"itervalues",(PyCFunction)proxy_itervalues, METH_NOARGS,
     812    PyDoc_STR("D.itervalues() -> an iterator over the values of D")},
     813    {"iteritems", (PyCFunction)proxy_iteritems,  METH_NOARGS,
     814    PyDoc_STR("D.iteritems() ->"
     815               " an iterator over the (key, value) items of D")},
     816    {"copy",      (PyCFunction)proxy_copy,       METH_NOARGS,
     817    PyDoc_STR("D.copy() -> a shallow copy of D")},
     818    {0}
    780819};
    781820
     
    783822proxy_dealloc(proxyobject *pp)
    784823{
    785         _PyObject_GC_UNTRACK(pp);
    786         Py_DECREF(pp->dict);
    787         PyObject_GC_Del(pp);
     824    _PyObject_GC_UNTRACK(pp);
     825    Py_DECREF(pp->dict);
     826    PyObject_GC_Del(pp);
    788827}
    789828
     
    791830proxy_getiter(proxyobject *pp)
    792831{
    793         return PyObject_GetIter(pp->dict);
     832    return PyObject_GetIter(pp->dict);
    794833}
    795834
     
    797836proxy_str(proxyobject *pp)
    798837{
    799         return PyObject_Str(pp->dict);
     838    return PyObject_Str(pp->dict);
     839}
     840
     841static PyObject *
     842proxy_repr(proxyobject *pp)
     843{
     844    PyObject *dictrepr;
     845    PyObject *result;
     846
     847    dictrepr = PyObject_Repr(pp->dict);
     848    if (dictrepr == NULL)
     849        return NULL;
     850    result = PyString_FromFormat("dict_proxy(%s)", PyString_AS_STRING(dictrepr));
     851    Py_DECREF(dictrepr);
     852    return result;
    800853}
    801854
     
    803856proxy_traverse(PyObject *self, visitproc visit, void *arg)
    804857{
    805         proxyobject *pp = (proxyobject *)self;
    806         Py_VISIT(pp->dict);
    807         return 0;
     858    proxyobject *pp = (proxyobject *)self;
     859    Py_VISIT(pp->dict);
     860    return 0;
    808861}
    809862
     
    811864proxy_compare(proxyobject *v, PyObject *w)
    812865{
    813         return PyObject_Compare(v->dict, w);
     866    return PyObject_Compare(v->dict, w);
    814867}
    815868
     
    817870proxy_richcompare(proxyobject *v, PyObject *w, int op)
    818871{
    819         return PyObject_RichCompare(v->dict, w, op);
     872    return PyObject_RichCompare(v->dict, w, op);
    820873}
    821874
    822875PyTypeObject PyDictProxy_Type = {
    823         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    824         "dictproxy",                            /* tp_name */
    825         sizeof(proxyobject),                    /* tp_basicsize */
    826         0,                                      /* tp_itemsize */
    827         /* methods */
    828         (destructor)proxy_dealloc,              /* tp_dealloc */
    829         0,                                      /* tp_print */
    830         0,                                      /* tp_getattr */
    831         0,                                      /* tp_setattr */
    832         (cmpfunc)proxy_compare,                 /* tp_compare */
    833         0,                                      /* tp_repr */
    834         0,                                      /* tp_as_number */
    835         &proxy_as_sequence,                     /* tp_as_sequence */
    836         &proxy_as_mapping,                      /* tp_as_mapping */
    837         0,                                      /* tp_hash */
    838         0,                                      /* tp_call */
    839         (reprfunc)proxy_str,                    /* tp_str */
    840         PyObject_GenericGetAttr,                /* tp_getattro */
    841         0,                                      /* tp_setattro */
    842         0,                                      /* tp_as_buffer */
    843         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    844         0,                                      /* tp_doc */
    845         proxy_traverse,                         /* tp_traverse */
    846         0,                                      /* tp_clear */
    847         (richcmpfunc)proxy_richcompare,         /* tp_richcompare */
    848         0,                                      /* tp_weaklistoffset */
    849         (getiterfunc)proxy_getiter,             /* tp_iter */
    850         0,                                      /* tp_iternext */
    851         proxy_methods,                          /* tp_methods */
    852         0,                                      /* tp_members */
    853         0,                                      /* tp_getset */
    854         0,                                      /* tp_base */
    855         0,                                      /* tp_dict */
    856         0,                                      /* tp_descr_get */
    857         0,                                      /* tp_descr_set */
     876    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     877    "dictproxy",                                /* tp_name */
     878    sizeof(proxyobject),                        /* tp_basicsize */
     879    0,                                          /* tp_itemsize */
     880    /* methods */
     881    (destructor)proxy_dealloc,                  /* tp_dealloc */
     882    0,                                          /* tp_print */
     883    0,                                          /* tp_getattr */
     884    0,                                          /* tp_setattr */
     885    (cmpfunc)proxy_compare,                     /* tp_compare */
     886    (reprfunc)proxy_repr,                       /* tp_repr */
     887    0,                                          /* tp_as_number */
     888    &proxy_as_sequence,                         /* tp_as_sequence */
     889    &proxy_as_mapping,                          /* tp_as_mapping */
     890    0,                                          /* tp_hash */
     891    0,                                          /* tp_call */
     892    (reprfunc)proxy_str,                        /* tp_str */
     893    PyObject_GenericGetAttr,                    /* tp_getattro */
     894    0,                                          /* tp_setattro */
     895    0,                                          /* tp_as_buffer */
     896    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     897    0,                                          /* tp_doc */
     898    proxy_traverse,                             /* tp_traverse */
     899    0,                                          /* tp_clear */
     900    (richcmpfunc)proxy_richcompare,             /* tp_richcompare */
     901    0,                                          /* tp_weaklistoffset */
     902    (getiterfunc)proxy_getiter,                 /* tp_iter */
     903    0,                                          /* tp_iternext */
     904    proxy_methods,                              /* tp_methods */
     905    0,                                          /* tp_members */
     906    0,                                          /* tp_getset */
     907    0,                                          /* tp_base */
     908    0,                                          /* tp_dict */
     909    0,                                          /* tp_descr_get */
     910    0,                                          /* tp_descr_set */
    858911};
    859912
     
    861914PyDictProxy_New(PyObject *dict)
    862915{
    863         proxyobject *pp;
    864 
    865         pp = PyObject_GC_New(proxyobject, &PyDictProxy_Type);
    866         if (pp != NULL) {
    867                 Py_INCREF(dict);
    868                 pp->dict = dict;
    869                 _PyObject_GC_TRACK(pp);
    870         }
    871         return (PyObject *)pp;
     916    proxyobject *pp;
     917
     918    pp = PyObject_GC_New(proxyobject, &PyDictProxy_Type);
     919    if (pp != NULL) {
     920        Py_INCREF(dict);
     921        pp->dict = dict;
     922        _PyObject_GC_TRACK(pp);
     923    }
     924    return (PyObject *)pp;
    872925}
    873926
     
    879932
    880933typedef struct {
    881         PyObject_HEAD
    882         PyWrapperDescrObject *descr;
    883         PyObject *self;
     934    PyObject_HEAD
     935    PyWrapperDescrObject *descr;
     936    PyObject *self;
    884937} wrapperobject;
    885938
     
    887940wrapper_dealloc(wrapperobject *wp)
    888941{
    889         PyObject_GC_UnTrack(wp);
    890         Py_TRASHCAN_SAFE_BEGIN(wp)
    891         Py_XDECREF(wp->descr);
    892         Py_XDECREF(wp->self);
    893         PyObject_GC_Del(wp);
    894         Py_TRASHCAN_SAFE_END(wp)
     942    PyObject_GC_UnTrack(wp);
     943    Py_TRASHCAN_SAFE_BEGIN(wp)
     944    Py_XDECREF(wp->descr);
     945    Py_XDECREF(wp->self);
     946    PyObject_GC_Del(wp);
     947    Py_TRASHCAN_SAFE_END(wp)
    895948}
    896949
     
    898951wrapper_compare(wrapperobject *a, wrapperobject *b)
    899952{
    900         if (a->descr == b->descr)
    901                 return PyObject_Compare(a->self, b->self);
    902         else
    903                 return (a->descr < b->descr) ? -1 : 1;
     953    if (a->descr == b->descr)
     954        return PyObject_Compare(a->self, b->self);
     955    else
     956        return (a->descr < b->descr) ? -1 : 1;
    904957}
    905958
     
    907960wrapper_hash(wrapperobject *wp)
    908961{
    909         int x, y;
    910         x = _Py_HashPointer(wp->descr);
    911         if (x == -1)
    912                 return -1;
    913         y = PyObject_Hash(wp->self);
    914         if (y == -1)
    915                 return -1;
    916         x = x ^ y;
    917         if (x == -1)
    918                 x = -2;
    919         return x;
     962    int x, y;
     963    x = _Py_HashPointer(wp->descr);
     964    if (x == -1)
     965        return -1;
     966    y = PyObject_Hash(wp->self);
     967    if (y == -1)
     968        return -1;
     969    x = x ^ y;
     970    if (x == -1)
     971        x = -2;
     972    return x;
    920973}
    921974
     
    923976wrapper_repr(wrapperobject *wp)
    924977{
    925         return PyString_FromFormat("<method-wrapper '%s' of %s object at %p>",
    926                                    wp->descr->d_base->name,
    927                                    wp->self->ob_type->tp_name,
    928                                    wp->self);
     978    return PyString_FromFormat("<method-wrapper '%s' of %s object at %p>",
     979                               wp->descr->d_base->name,
     980                               wp->self->ob_type->tp_name,
     981                               wp->self);
    929982}
    930983
    931984static PyMemberDef wrapper_members[] = {
    932         {"__self__", T_OBJECT, offsetof(wrapperobject, self), READONLY},
    933         {0}
     985    {"__self__", T_OBJECT, offsetof(wrapperobject, self), READONLY},
     986    {0}
    934987};
    935988
     
    937990wrapper_objclass(wrapperobject *wp)
    938991{
    939         PyObject *c = (PyObject *)wp->descr->d_type;
    940 
    941         Py_INCREF(c);
    942         return c;
     992    PyObject *c = (PyObject *)wp->descr->d_type;
     993
     994    Py_INCREF(c);
     995    return c;
    943996}
    944997
     
    946999wrapper_name(wrapperobject *wp)
    9471000{
    948         char *s = wp->descr->d_base->name;
    949 
    950         return PyString_FromString(s);
     1001    char *s = wp->descr->d_base->name;
     1002
     1003    return PyString_FromString(s);
    9511004}
    9521005
     
    9541007wrapper_doc(wrapperobject *wp)
    9551008{
    956         char *s = wp->descr->d_base->doc;
    957 
    958         if (s == NULL) {
    959                 Py_INCREF(Py_None);
    960                 return Py_None;
    961         }
    962         else {
    963                 return PyString_FromString(s);
    964         }
     1009    char *s = wp->descr->d_base->doc;
     1010
     1011    if (s == NULL) {
     1012        Py_INCREF(Py_None);
     1013        return Py_None;
     1014    }
     1015    else {
     1016        return PyString_FromString(s);
     1017    }
    9651018}
    9661019
    9671020static PyGetSetDef wrapper_getsets[] = {
    968         {"__objclass__", (getter)wrapper_objclass},
    969         {"__name__", (getter)wrapper_name},
    970         {"__doc__", (getter)wrapper_doc},
    971         {0}
     1021    {"__objclass__", (getter)wrapper_objclass},
     1022    {"__name__", (getter)wrapper_name},
     1023    {"__doc__", (getter)wrapper_doc},
     1024    {0}
    9721025};
    9731026
     
    9751028wrapper_call(wrapperobject *wp, PyObject *args, PyObject *kwds)
    9761029{
    977         wrapperfunc wrapper = wp->descr->d_base->wrapper;
    978         PyObject *self = wp->self;
    979 
    980         if (wp->descr->d_base->flags & PyWrapperFlag_KEYWORDS) {
    981                 wrapperfunc_kwds wk = (wrapperfunc_kwds)wrapper;
    982                 return (*wk)(self, args, wp->descr->d_wrapped, kwds);
    983         }
    984 
    985         if (kwds != NULL && (!PyDict_Check(kwds) || PyDict_Size(kwds) != 0)) {
    986                 PyErr_Format(PyExc_TypeError,
    987                              "wrapper %s doesn't take keyword arguments",
    988                              wp->descr->d_base->name);
    989                 return NULL;
    990         }
    991         return (*wrapper)(self, args, wp->descr->d_wrapped);
     1030    wrapperfunc wrapper = wp->descr->d_base->wrapper;
     1031    PyObject *self = wp->self;
     1032
     1033    if (wp->descr->d_base->flags & PyWrapperFlag_KEYWORDS) {
     1034        wrapperfunc_kwds wk = (wrapperfunc_kwds)wrapper;
     1035        return (*wk)(self, args, wp->descr->d_wrapped, kwds);
     1036    }
     1037
     1038    if (kwds != NULL && (!PyDict_Check(kwds) || PyDict_Size(kwds) != 0)) {
     1039        PyErr_Format(PyExc_TypeError,
     1040                     "wrapper %s doesn't take keyword arguments",
     1041                     wp->descr->d_base->name);
     1042        return NULL;
     1043    }
     1044    return (*wrapper)(self, args, wp->descr->d_wrapped);
    9921045}
    9931046
     
    9951048wrapper_traverse(PyObject *self, visitproc visit, void *arg)
    9961049{
    997         wrapperobject *wp = (wrapperobject *)self;
    998         Py_VISIT(wp->descr);
    999         Py_VISIT(wp->self);
    1000         return 0;
     1050    wrapperobject *wp = (wrapperobject *)self;
     1051    Py_VISIT(wp->descr);
     1052    Py_VISIT(wp->self);
     1053    return 0;
    10011054}
    10021055
    10031056static PyTypeObject wrappertype = {
    1004         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    1005         "method-wrapper",                       /* tp_name */
    1006         sizeof(wrapperobject),                  /* tp_basicsize */
    1007         0,                                      /* tp_itemsize */
    1008         /* methods */
    1009         (destructor)wrapper_dealloc,            /* tp_dealloc */
    1010         0,                                      /* tp_print */
    1011         0,                                      /* tp_getattr */
    1012         0,                                      /* tp_setattr */
    1013         (cmpfunc)wrapper_compare,               /* tp_compare */
    1014         (reprfunc)wrapper_repr,                 /* tp_repr */
    1015         0,                                      /* tp_as_number */
    1016         0,                                      /* tp_as_sequence */
    1017         0,                                      /* tp_as_mapping */
    1018         (hashfunc)wrapper_hash,                 /* tp_hash */
    1019         (ternaryfunc)wrapper_call,              /* tp_call */
    1020         0,                                      /* tp_str */
    1021         PyObject_GenericGetAttr,                /* tp_getattro */
    1022         0,                                      /* tp_setattro */
    1023         0,                                      /* tp_as_buffer */
    1024         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
    1025         0,                                      /* tp_doc */
    1026         wrapper_traverse,                       /* tp_traverse */
    1027         0,                                      /* tp_clear */
    1028         0,                                      /* tp_richcompare */
    1029         0,                                      /* tp_weaklistoffset */
    1030         0,                                      /* tp_iter */
    1031         0,                                      /* tp_iternext */
    1032         0,                                      /* tp_methods */
    1033         wrapper_members,                        /* tp_members */
    1034         wrapper_getsets,                        /* tp_getset */
    1035         0,                                      /* tp_base */
    1036         0,                                      /* tp_dict */
    1037         0,                                      /* tp_descr_get */
    1038         0,                                      /* tp_descr_set */
     1057    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     1058    "method-wrapper",                           /* tp_name */
     1059    sizeof(wrapperobject),                      /* tp_basicsize */
     1060    0,                                          /* tp_itemsize */
     1061    /* methods */
     1062    (destructor)wrapper_dealloc,                /* tp_dealloc */
     1063    0,                                          /* tp_print */
     1064    0,                                          /* tp_getattr */
     1065    0,                                          /* tp_setattr */
     1066    (cmpfunc)wrapper_compare,                   /* tp_compare */
     1067    (reprfunc)wrapper_repr,                     /* tp_repr */
     1068    0,                                          /* tp_as_number */
     1069    0,                                          /* tp_as_sequence */
     1070    0,                                          /* tp_as_mapping */
     1071    (hashfunc)wrapper_hash,                     /* tp_hash */
     1072    (ternaryfunc)wrapper_call,                  /* tp_call */
     1073    0,                                          /* tp_str */
     1074    PyObject_GenericGetAttr,                    /* tp_getattro */
     1075    0,                                          /* tp_setattro */
     1076    0,                                          /* tp_as_buffer */
     1077    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */
     1078    0,                                          /* tp_doc */
     1079    wrapper_traverse,                           /* tp_traverse */
     1080    0,                                          /* tp_clear */
     1081    0,                                          /* tp_richcompare */
     1082    0,                                          /* tp_weaklistoffset */
     1083    0,                                          /* tp_iter */
     1084    0,                                          /* tp_iternext */
     1085    0,                                          /* tp_methods */
     1086    wrapper_members,                            /* tp_members */
     1087    wrapper_getsets,                            /* tp_getset */
     1088    0,                                          /* tp_base */
     1089    0,                                          /* tp_dict */
     1090    0,                                          /* tp_descr_get */
     1091    0,                                          /* tp_descr_set */
    10391092};
    10401093
     
    10421095PyWrapper_New(PyObject *d, PyObject *self)
    10431096{
    1044         wrapperobject *wp;
    1045         PyWrapperDescrObject *descr;
    1046 
    1047         assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type));
    1048         descr = (PyWrapperDescrObject *)d;
    1049         assert(PyObject_IsInstance(self, (PyObject *)(descr->d_type)));
    1050 
    1051         wp = PyObject_GC_New(wrapperobject, &wrappertype);
    1052         if (wp != NULL) {
    1053                 Py_INCREF(descr);
    1054                 wp->descr = descr;
    1055                 Py_INCREF(self);
    1056                 wp->self = self;
    1057                 _PyObject_GC_TRACK(wp);
    1058         }
    1059         return (PyObject *)wp;
     1097    wrapperobject *wp;
     1098    PyWrapperDescrObject *descr;
     1099
     1100    assert(PyObject_TypeCheck(d, &PyWrapperDescr_Type));
     1101    descr = (PyWrapperDescrObject *)d;
     1102    assert(_PyObject_RealIsSubclass((PyObject *)Py_TYPE(self),
     1103                                    (PyObject *)(descr->d_type)));
     1104
     1105    wp = PyObject_GC_New(wrapperobject, &wrappertype);
     1106    if (wp != NULL) {
     1107        Py_INCREF(descr);
     1108        wp->descr = descr;
     1109        Py_INCREF(self);
     1110        wp->self = self;
     1111        _PyObject_GC_TRACK(wp);
     1112    }
     1113    return (PyObject *)wp;
    10601114}
    10611115
     
    10661120    class property(object):
    10671121
    1068         def __init__(self, fget=None, fset=None, fdel=None, doc=None):
    1069             if doc is None and fget is not None and hasattr(fget, "__doc__"):
    1070                 doc = fget.__doc__
    1071             self.__get = fget
    1072             self.__set = fset
    1073             self.__del = fdel
    1074             self.__doc__ = doc
    1075 
    1076         def __get__(self, inst, type=None):
    1077             if inst is None:
    1078                 return self
    1079             if self.__get is None:
    1080                 raise AttributeError, "unreadable attribute"
    1081             return self.__get(inst)
    1082 
    1083         def __set__(self, inst, value):
    1084             if self.__set is None:
    1085                 raise AttributeError, "can't set attribute"
    1086             return self.__set(inst, value)
    1087 
    1088         def __delete__(self, inst):
    1089             if self.__del is None:
    1090                 raise AttributeError, "can't delete attribute"
    1091             return self.__del(inst)
     1122    def __init__(self, fget=None, fset=None, fdel=None, doc=None):
     1123        if doc is None and fget is not None and hasattr(fget, "__doc__"):
     1124        doc = fget.__doc__
     1125        self.__get = fget
     1126        self.__set = fset
     1127        self.__del = fdel
     1128        self.__doc__ = doc
     1129
     1130    def __get__(self, inst, type=None):
     1131        if inst is None:
     1132        return self
     1133        if self.__get is None:
     1134        raise AttributeError, "unreadable attribute"
     1135        return self.__get(inst)
     1136
     1137    def __set__(self, inst, value):
     1138        if self.__set is None:
     1139        raise AttributeError, "can't set attribute"
     1140        return self.__set(inst, value)
     1141
     1142    def __delete__(self, inst):
     1143        if self.__del is None:
     1144        raise AttributeError, "can't delete attribute"
     1145        return self.__del(inst)
    10921146
    10931147*/
    10941148
    10951149typedef struct {
    1096         PyObject_HEAD
    1097         PyObject *prop_get;
    1098         PyObject *prop_set;
    1099         PyObject *prop_del;
    1100         PyObject *prop_doc;
    1101         int getter_doc;
     1150    PyObject_HEAD
     1151    PyObject *prop_get;
     1152    PyObject *prop_set;
     1153    PyObject *prop_del;
     1154    PyObject *prop_doc;
     1155    int getter_doc;
    11021156} propertyobject;
    11031157
    11041158static PyObject * property_copy(PyObject *, PyObject *, PyObject *,
    1105                                   PyObject *, PyObject *);
     1159                                  PyObject *);
    11061160
    11071161static PyMemberDef property_members[] = {
    1108         {"fget", T_OBJECT, offsetof(propertyobject, prop_get), READONLY},
    1109         {"fset", T_OBJECT, offsetof(propertyobject, prop_set), READONLY},
    1110         {"fdel", T_OBJECT, offsetof(propertyobject, prop_del), READONLY},
    1111         {"__doc__",  T_OBJECT, offsetof(propertyobject, prop_doc), READONLY},
    1112         {0}
     1162    {"fget", T_OBJECT, offsetof(propertyobject, prop_get), READONLY},
     1163    {"fset", T_OBJECT, offsetof(propertyobject, prop_set), READONLY},
     1164    {"fdel", T_OBJECT, offsetof(propertyobject, prop_del), READONLY},
     1165    {"__doc__",  T_OBJECT, offsetof(propertyobject, prop_doc), READONLY},
     1166    {0}
    11131167};
    11141168
    11151169
    11161170PyDoc_STRVAR(getter_doc,
    1117              "Descriptor to change the getter on a property.");
     1171             "Descriptor to change the getter on a property.");
    11181172
    11191173static PyObject *
    11201174property_getter(PyObject *self, PyObject *getter)
    11211175{
    1122         return property_copy(self, getter, NULL, NULL, NULL);
     1176    return property_copy(self, getter, NULL, NULL);
    11231177}
    11241178
    11251179
    11261180PyDoc_STRVAR(setter_doc,
    1127              "Descriptor to change the setter on a property.");
     1181             "Descriptor to change the setter on a property.");
    11281182
    11291183static PyObject *
    11301184property_setter(PyObject *self, PyObject *setter)
    11311185{
    1132         return property_copy(self, NULL, setter, NULL, NULL);
     1186    return property_copy(self, NULL, setter, NULL);
    11331187}
    11341188
    11351189
    11361190PyDoc_STRVAR(deleter_doc,
    1137              "Descriptor to change the deleter on a property.");
     1191             "Descriptor to change the deleter on a property.");
    11381192
    11391193static PyObject *
    11401194property_deleter(PyObject *self, PyObject *deleter)
    11411195{
    1142         return property_copy(self, NULL, NULL, deleter, NULL);
     1196    return property_copy(self, NULL, NULL, deleter);
    11431197}
    11441198
    11451199
    11461200static PyMethodDef property_methods[] = {
    1147         {"getter", property_getter, METH_O, getter_doc},
    1148         {"setter", property_setter, METH_O, setter_doc},
    1149         {"deleter", property_deleter, METH_O, deleter_doc},
    1150         {0}
     1201    {"getter", property_getter, METH_O, getter_doc},
     1202    {"setter", property_setter, METH_O, setter_doc},
     1203    {"deleter", property_deleter, METH_O, deleter_doc},
     1204    {0}
    11511205};
    11521206
     
    11551209property_dealloc(PyObject *self)
    11561210{
    1157         propertyobject *gs = (propertyobject *)self;
    1158 
    1159         _PyObject_GC_UNTRACK(self);
    1160         Py_XDECREF(gs->prop_get);
    1161         Py_XDECREF(gs->prop_set);
    1162         Py_XDECREF(gs->prop_del);
    1163         Py_XDECREF(gs->prop_doc);
    1164         self->ob_type->tp_free(self);
     1211    propertyobject *gs = (propertyobject *)self;
     1212
     1213    _PyObject_GC_UNTRACK(self);
     1214    Py_XDECREF(gs->prop_get);
     1215    Py_XDECREF(gs->prop_set);
     1216    Py_XDECREF(gs->prop_del);
     1217    Py_XDECREF(gs->prop_doc);
     1218    self->ob_type->tp_free(self);
    11651219}
    11661220
     
    11681222property_descr_get(PyObject *self, PyObject *obj, PyObject *type)
    11691223{
    1170         propertyobject *gs = (propertyobject *)self;
    1171 
    1172         if (obj == NULL || obj == Py_None) {
    1173                 Py_INCREF(self);
    1174                 return self;
    1175         }
    1176         if (gs->prop_get == NULL) {
    1177                 PyErr_SetString(PyExc_AttributeError, "unreadable attribute");
    1178                 return NULL;
    1179         }
    1180         return PyObject_CallFunction(gs->prop_get, "(O)", obj);
     1224    propertyobject *gs = (propertyobject *)self;
     1225
     1226    if (obj == NULL || obj == Py_None) {
     1227        Py_INCREF(self);
     1228        return self;
     1229    }
     1230    if (gs->prop_get == NULL) {
     1231        PyErr_SetString(PyExc_AttributeError, "unreadable attribute");
     1232        return NULL;
     1233    }
     1234    return PyObject_CallFunction(gs->prop_get, "(O)", obj);
    11811235}
    11821236
     
    11841238property_descr_set(PyObject *self, PyObject *obj, PyObject *value)
    11851239{
    1186         propertyobject *gs = (propertyobject *)self;
    1187         PyObject *func, *res;
    1188 
    1189         if (value == NULL)
    1190                 func = gs->prop_del;
    1191         else
    1192                 func = gs->prop_set;
    1193         if (func == NULL) {
    1194                 PyErr_SetString(PyExc_AttributeError,
    1195                                 value == NULL ?
    1196                                 "can't delete attribute" :
    1197                                 "can't set attribute");
    1198                 return -1;
    1199         }
    1200         if (value == NULL)
    1201                 res = PyObject_CallFunction(func, "(O)", obj);
    1202         else
    1203                 res = PyObject_CallFunction(func, "(OO)", obj, value);
    1204         if (res == NULL)
    1205                 return -1;
    1206         Py_DECREF(res);
    1207         return 0;
    1208 }
    1209 
    1210 static PyObject *
    1211 property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del,
    1212                 PyObject *doc)
    1213 {
    1214         propertyobject *pold = (propertyobject *)old;
    1215         PyObject *new, *type;
    1216 
    1217         type = PyObject_Type(old);
    1218         if (type == NULL)
    1219                 return NULL;
    1220 
    1221         if (get == NULL || get == Py_None) {
    1222                 Py_XDECREF(get);
    1223                 get = pold->prop_get ? pold->prop_get : Py_None;
    1224         }
    1225         if (set == NULL || set == Py_None) {
    1226                 Py_XDECREF(set);
    1227                 set = pold->prop_set ? pold->prop_set : Py_None;
    1228         }
    1229         if (del == NULL || del == Py_None) {
    1230                 Py_XDECREF(del);
    1231                 del = pold->prop_del ? pold->prop_del : Py_None;
    1232         }
    1233         if (doc == NULL || doc == Py_None) {
    1234                 Py_XDECREF(doc);
    1235                 if (pold->getter_doc && get != Py_None) {
    1236                         /* make _init use __doc__ from getter */
    1237                         doc = Py_None;
    1238                 }
    1239                 else {
    1240                         doc = pold->prop_doc ? pold->prop_doc : Py_None;
    1241                 }
    1242         }
    1243 
    1244         new =  PyObject_CallFunction(type, "OOOO", get, set, del, doc);
    1245         Py_DECREF(type);
    1246         if (new == NULL)
    1247                 return NULL;
    1248         return new;
     1240    propertyobject *gs = (propertyobject *)self;
     1241    PyObject *func, *res;
     1242
     1243    if (value == NULL)
     1244        func = gs->prop_del;
     1245    else
     1246        func = gs->prop_set;
     1247    if (func == NULL) {
     1248        PyErr_SetString(PyExc_AttributeError,
     1249                        value == NULL ?
     1250                        "can't delete attribute" :
     1251                "can't set attribute");
     1252        return -1;
     1253    }
     1254    if (value == NULL)
     1255        res = PyObject_CallFunction(func, "(O)", obj);
     1256    else
     1257        res = PyObject_CallFunction(func, "(OO)", obj, value);
     1258    if (res == NULL)
     1259        return -1;
     1260    Py_DECREF(res);
     1261    return 0;
     1262}
     1263
     1264static PyObject *
     1265property_copy(PyObject *old, PyObject *get, PyObject *set, PyObject *del)
     1266{
     1267    propertyobject *pold = (propertyobject *)old;
     1268    PyObject *new, *type, *doc;
     1269
     1270    type = PyObject_Type(old);
     1271    if (type == NULL)
     1272        return NULL;
     1273
     1274    if (get == NULL || get == Py_None) {
     1275        Py_XDECREF(get);
     1276        get = pold->prop_get ? pold->prop_get : Py_None;
     1277    }
     1278    if (set == NULL || set == Py_None) {
     1279        Py_XDECREF(set);
     1280        set = pold->prop_set ? pold->prop_set : Py_None;
     1281    }
     1282    if (del == NULL || del == Py_None) {
     1283        Py_XDECREF(del);
     1284        del = pold->prop_del ? pold->prop_del : Py_None;
     1285    }
     1286    if (pold->getter_doc && get != Py_None) {
     1287        /* make _init use __doc__ from getter */
     1288        doc = Py_None;
     1289    }
     1290    else {
     1291        doc = pold->prop_doc ? pold->prop_doc : Py_None;
     1292    }
     1293
     1294    new =  PyObject_CallFunction(type, "OOOO", get, set, del, doc);
     1295    Py_DECREF(type);
     1296    if (new == NULL)
     1297        return NULL;
     1298    return new;
    12491299}
    12501300
     
    12521302property_init(PyObject *self, PyObject *args, PyObject *kwds)
    12531303{
    1254         PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL;
    1255         static char *kwlist[] = {"fget", "fset", "fdel", "doc", 0};
    1256         propertyobject *prop = (propertyobject *)self;
    1257        
    1258         if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:property",
    1259                                          kwlist, &get, &set, &del, &doc))
    1260                 return -1;
    1261 
    1262         if (get == Py_None)
    1263                 get = NULL;
    1264         if (set == Py_None)
    1265                 set = NULL;
    1266         if (del == Py_None)
    1267                 del = NULL;
    1268 
    1269         Py_XINCREF(get);
    1270         Py_XINCREF(set);
    1271         Py_XINCREF(del);
    1272         Py_XINCREF(doc);
    1273 
    1274         prop->prop_get = get;
    1275         prop->prop_set = set;
    1276         prop->prop_del = del;
    1277         prop->prop_doc = doc;
    1278         prop->getter_doc = 0;
    1279 
    1280         /* if no docstring given and the getter has one, use that one */
    1281         if ((doc == NULL || doc == Py_None) && get != NULL) {
    1282                 PyObject *get_doc = PyObject_GetAttrString(get, "__doc__");
    1283                 if (get_doc != NULL) {
    1284                         /* get_doc already INCREF'd by GetAttr */
    1285                         if (Py_TYPE(self)==&PyProperty_Type) {
    1286                                 Py_XDECREF(prop->prop_doc);
    1287                                 prop->prop_doc = get_doc;
    1288                         } else {
    1289                                 /* Put __doc__ in dict of the subclass instance instead,
    1290                                 otherwise it gets shadowed by class's __doc__. */
    1291                                 if (PyObject_SetAttrString(self, "__doc__", get_doc) != 0)
    1292                                 {
    1293                                         /* DECREF for props handled by _dealloc */
    1294                                         Py_DECREF(get_doc);
    1295                                         return -1;
    1296                                 }
    1297                                 Py_DECREF(get_doc);
    1298                         }
    1299                         prop->getter_doc = 1;
    1300                 } else {
    1301                         PyErr_Clear();
    1302                 }
    1303         }
    1304 
    1305         return 0;
     1304    PyObject *get = NULL, *set = NULL, *del = NULL, *doc = NULL;
     1305    static char *kwlist[] = {"fget", "fset", "fdel", "doc", 0};
     1306    propertyobject *prop = (propertyobject *)self;
     1307
     1308    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOO:property",
     1309                                     kwlist, &get, &set, &del, &doc))
     1310        return -1;
     1311
     1312    if (get == Py_None)
     1313        get = NULL;
     1314    if (set == Py_None)
     1315        set = NULL;
     1316    if (del == Py_None)
     1317        del = NULL;
     1318
     1319    Py_XINCREF(get);
     1320    Py_XINCREF(set);
     1321    Py_XINCREF(del);
     1322    Py_XINCREF(doc);
     1323
     1324    prop->prop_get = get;
     1325    prop->prop_set = set;
     1326    prop->prop_del = del;
     1327    prop->prop_doc = doc;
     1328    prop->getter_doc = 0;
     1329
     1330    /* if no docstring given and the getter has one, use that one */
     1331    if ((doc == NULL || doc == Py_None) && get != NULL) {
     1332        PyObject *get_doc = PyObject_GetAttrString(get, "__doc__");
     1333        if (get_doc) {
     1334            if (Py_TYPE(self) == &PyProperty_Type) {
     1335                Py_XDECREF(prop->prop_doc);
     1336                prop->prop_doc = get_doc;
     1337            }
     1338            else {
     1339                /* If this is a property subclass, put __doc__
     1340                in dict of the subclass instance instead,
     1341                otherwise it gets shadowed by __doc__ in the
     1342                class's dict. */
     1343                int err = PyObject_SetAttrString(self, "__doc__", get_doc);
     1344                Py_DECREF(get_doc);
     1345                if (err < 0)
     1346                    return -1;
     1347            }
     1348            prop->getter_doc = 1;
     1349        }
     1350        else if (PyErr_ExceptionMatches(PyExc_Exception)) {
     1351            PyErr_Clear();
     1352        }
     1353        else {
     1354            return -1;
     1355        }
     1356    }
     1357
     1358    return 0;
    13061359}
    13071360
     
    13311384property_traverse(PyObject *self, visitproc visit, void *arg)
    13321385{
    1333         propertyobject *pp = (propertyobject *)self;
    1334         Py_VISIT(pp->prop_get);
    1335         Py_VISIT(pp->prop_set);
    1336         Py_VISIT(pp->prop_del);
    1337         Py_VISIT(pp->prop_doc);
    1338         return 0;
     1386    propertyobject *pp = (propertyobject *)self;
     1387    Py_VISIT(pp->prop_get);
     1388    Py_VISIT(pp->prop_set);
     1389    Py_VISIT(pp->prop_del);
     1390    Py_VISIT(pp->prop_doc);
     1391    return 0;
    13391392}
    13401393
    13411394PyTypeObject PyProperty_Type = {
    1342         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    1343         "property",                             /* tp_name */
    1344         sizeof(propertyobject),                 /* tp_basicsize */
    1345         0,                                      /* tp_itemsize */
    1346         /* methods */
    1347         property_dealloc,                       /* tp_dealloc */
    1348         0,                                      /* tp_print */
    1349         0,                                      /* tp_getattr */
    1350         0,                                      /* tp_setattr */
    1351         0,                                      /* tp_compare */
    1352         0,                                      /* tp_repr */
    1353         0,                                      /* tp_as_number */
    1354         0,                                      /* tp_as_sequence */
    1355         0,                                      /* tp_as_mapping */
    1356         0,                                      /* tp_hash */
    1357         0,                                      /* tp_call */
    1358         0,                                      /* tp_str */
    1359         PyObject_GenericGetAttr,                /* tp_getattro */
    1360         0,                                      /* tp_setattro */
    1361         0,                                      /* tp_as_buffer */
    1362         Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
    1363                 Py_TPFLAGS_BASETYPE,            /* tp_flags */
    1364         property_doc,                           /* tp_doc */
    1365         property_traverse,                      /* tp_traverse */
    1366         0,                                      /* tp_clear */
    1367         0,                                      /* tp_richcompare */
    1368         0,                                      /* tp_weaklistoffset */
    1369         0,                                      /* tp_iter */
    1370         0,                                      /* tp_iternext */
    1371         property_methods,                       /* tp_methods */
    1372         property_members,                       /* tp_members */
    1373         0,                                      /* tp_getset */
    1374         0,                                      /* tp_base */
    1375         0,                                      /* tp_dict */
    1376         property_descr_get,                     /* tp_descr_get */
    1377         property_descr_set,                     /* tp_descr_set */
    1378         0,                                      /* tp_dictoffset */
    1379         property_init,                          /* tp_init */
    1380         PyType_GenericAlloc,                    /* tp_alloc */
    1381         PyType_GenericNew,                      /* tp_new */
    1382         PyObject_GC_Del,                        /* tp_free */
    1383 };
     1395    PyVarObject_HEAD_INIT(&PyType_Type, 0)
     1396    "property",                                 /* tp_name */
     1397    sizeof(propertyobject),                     /* tp_basicsize */
     1398    0,                                          /* tp_itemsize */
     1399    /* methods */
     1400    property_dealloc,                           /* tp_dealloc */
     1401    0,                                          /* tp_print */
     1402    0,                                          /* tp_getattr */
     1403    0,                                          /* tp_setattr */
     1404    0,                                          /* tp_compare */
     1405    0,                                          /* tp_repr */
     1406    0,                                          /* tp_as_number */
     1407    0,                                          /* tp_as_sequence */
     1408    0,                                          /* tp_as_mapping */
     1409    0,                                          /* tp_hash */
     1410    0,                                          /* tp_call */
     1411    0,                                          /* tp_str */
     1412    PyObject_GenericGetAttr,                    /* tp_getattro */
     1413    0,                                          /* tp_setattro */
     1414    0,                                          /* tp_as_buffer */
     1415    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
     1416        Py_TPFLAGS_BASETYPE,                    /* tp_flags */
     1417    property_doc,                               /* tp_doc */
     1418    property_traverse,                          /* tp_traverse */
     1419    0,                                          /* tp_clear */
     1420    0,                                          /* tp_richcompare */
     1421    0,                                          /* tp_weaklistoffset */
     1422    0,                                          /* tp_iter */
     1423    0,                                          /* tp_iternext */
     1424    property_methods,                           /* tp_methods */
     1425    property_members,                           /* tp_members */
     1426    0,                                          /* tp_getset */
     1427    0,                                          /* tp_base */
     1428    0,                                          /* tp_dict */
     1429    property_descr_get,                         /* tp_descr_get */
     1430    property_descr_set,                         /* tp_descr_set */
     1431    0,                                          /* tp_dictoffset */
     1432    property_init,                              /* tp_init */
     1433    PyType_GenericAlloc,                        /* tp_alloc */
     1434    PyType_GenericNew,                          /* tp_new */
     1435    PyObject_GC_Del,                            /* tp_free */
     1436};
Note: See TracChangeset for help on using the changeset viewer.