1 
2 /* Class object implementation */
3 
4 #include "Python.h"
5 #include "structmember.h"
6 
7 /* Free list for method objects to safe malloc/free overhead
8  * The im_self element is used to chain the elements.
9  */
10 static PyMethodObject *free_list;
11 static int numfree = 0;
12 #ifndef PyMethod_MAXFREELIST
13 #define PyMethod_MAXFREELIST 256
14 #endif
15 
16 #define TP_DESCR_GET(t) \
17     (PyType_HasFeature(t, Py_TPFLAGS_HAVE_CLASS) ? (t)->tp_descr_get : NULL)
18 
19 /* Forward */
20 static PyObject *class_lookup(PyClassObject *, PyObject *,
21                               PyClassObject **);
22 static PyObject *instance_getattr1(PyInstanceObject *, PyObject *);
23 static PyObject *instance_getattr2(PyInstanceObject *, PyObject *);
24 
25 static PyObject *getattrstr, *setattrstr, *delattrstr;
26 
27 
28 PyObject *
PyClass_New(PyObject * bases,PyObject * dict,PyObject * name)29 PyClass_New(PyObject *bases, PyObject *dict, PyObject *name)
30      /* bases is NULL or tuple of classobjects! */
31 {
32     PyClassObject *op, *dummy;
33     static PyObject *docstr, *modstr, *namestr;
34     if (docstr == NULL) {
35         docstr= PyString_InternFromString("__doc__");
36         if (docstr == NULL)
37             return NULL;
38     }
39     if (modstr == NULL) {
40         modstr= PyString_InternFromString("__module__");
41         if (modstr == NULL)
42             return NULL;
43     }
44     if (namestr == NULL) {
45         namestr= PyString_InternFromString("__name__");
46         if (namestr == NULL)
47             return NULL;
48     }
49     if (name == NULL || !PyString_Check(name)) {
50         PyErr_SetString(PyExc_TypeError,
51                         "PyClass_New: name must be a string");
52         return NULL;
53     }
54     if (dict == NULL || !PyDict_Check(dict)) {
55         PyErr_SetString(PyExc_TypeError,
56                         "PyClass_New: dict must be a dictionary");
57         return NULL;
58     }
59     if (PyDict_GetItem(dict, docstr) == NULL) {
60         if (PyDict_SetItem(dict, docstr, Py_None) < 0)
61             return NULL;
62     }
63     if (PyDict_GetItem(dict, modstr) == NULL) {
64         PyObject *globals = PyEval_GetGlobals();
65         if (globals != NULL) {
66             PyObject *modname = PyDict_GetItem(globals, namestr);
67             if (modname != NULL) {
68                 if (PyDict_SetItem(dict, modstr, modname) < 0)
69                     return NULL;
70             }
71         }
72     }
73     if (bases == NULL) {
74         bases = PyTuple_New(0);
75         if (bases == NULL)
76             return NULL;
77     }
78     else {
79         Py_ssize_t i, n;
80         PyObject *base;
81         if (!PyTuple_Check(bases)) {
82             PyErr_SetString(PyExc_TypeError,
83                             "PyClass_New: bases must be a tuple");
84             return NULL;
85         }
86         n = PyTuple_Size(bases);
87         for (i = 0; i < n; i++) {
88             base = PyTuple_GET_ITEM(bases, i);
89             if (!PyClass_Check(base)) {
90                 if (PyCallable_Check(
91                     (PyObject *) base->ob_type))
92                     return PyObject_CallFunctionObjArgs(
93                         (PyObject *) base->ob_type,
94                         name, bases, dict, NULL);
95                 PyErr_SetString(PyExc_TypeError,
96                     "PyClass_New: base must be a class");
97                 return NULL;
98             }
99         }
100         Py_INCREF(bases);
101     }
102 
103     if (getattrstr == NULL) {
104         getattrstr = PyString_InternFromString("__getattr__");
105         if (getattrstr == NULL)
106             goto alloc_error;
107         setattrstr = PyString_InternFromString("__setattr__");
108         if (setattrstr == NULL)
109             goto alloc_error;
110         delattrstr = PyString_InternFromString("__delattr__");
111         if (delattrstr == NULL)
112             goto alloc_error;
113     }
114 
115     op = PyObject_GC_New(PyClassObject, &PyClass_Type);
116     if (op == NULL) {
117 alloc_error:
118         Py_DECREF(bases);
119         return NULL;
120     }
121     op->cl_bases = bases;
122     Py_INCREF(dict);
123     op->cl_dict = dict;
124     Py_XINCREF(name);
125     op->cl_name = name;
126     op->cl_weakreflist = NULL;
127 
128     op->cl_getattr = class_lookup(op, getattrstr, &dummy);
129     op->cl_setattr = class_lookup(op, setattrstr, &dummy);
130     op->cl_delattr = class_lookup(op, delattrstr, &dummy);
131     Py_XINCREF(op->cl_getattr);
132     Py_XINCREF(op->cl_setattr);
133     Py_XINCREF(op->cl_delattr);
134     _PyObject_GC_TRACK(op);
135     return (PyObject *) op;
136 }
137 
138 PyObject *
PyMethod_Function(PyObject * im)139 PyMethod_Function(PyObject *im)
140 {
141     if (!PyMethod_Check(im)) {
142         PyErr_BadInternalCall();
143         return NULL;
144     }
145     return ((PyMethodObject *)im)->im_func;
146 }
147 
148 PyObject *
PyMethod_Self(PyObject * im)149 PyMethod_Self(PyObject *im)
150 {
151     if (!PyMethod_Check(im)) {
152         PyErr_BadInternalCall();
153         return NULL;
154     }
155     return ((PyMethodObject *)im)->im_self;
156 }
157 
158 PyObject *
PyMethod_Class(PyObject * im)159 PyMethod_Class(PyObject *im)
160 {
161     if (!PyMethod_Check(im)) {
162         PyErr_BadInternalCall();
163         return NULL;
164     }
165     return ((PyMethodObject *)im)->im_class;
166 }
167 
168 PyDoc_STRVAR(class_doc,
169 "classobj(name, bases, dict)\n\
170 \n\
171 Create a class object.  The name must be a string; the second argument\n\
172 a tuple of classes, and the third a dictionary.");
173 
174 static PyObject *
class_new(PyTypeObject * type,PyObject * args,PyObject * kwds)175 class_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
176 {
177     PyObject *name, *bases, *dict;
178     static char *kwlist[] = {"name", "bases", "dict", 0};
179 
180     if (!PyArg_ParseTupleAndKeywords(args, kwds, "SOO", kwlist,
181                                      &name, &bases, &dict))
182         return NULL;
183     return PyClass_New(bases, dict, name);
184 }
185 
186 /* Class methods */
187 
188 static void
class_dealloc(PyClassObject * op)189 class_dealloc(PyClassObject *op)
190 {
191     _PyObject_GC_UNTRACK(op);
192     if (op->cl_weakreflist != NULL)
193         PyObject_ClearWeakRefs((PyObject *) op);
194     Py_DECREF(op->cl_bases);
195     Py_DECREF(op->cl_dict);
196     Py_XDECREF(op->cl_name);
197     Py_XDECREF(op->cl_getattr);
198     Py_XDECREF(op->cl_setattr);
199     Py_XDECREF(op->cl_delattr);
200     PyObject_GC_Del(op);
201 }
202 
203 static PyObject *
class_lookup(PyClassObject * cp,PyObject * name,PyClassObject ** pclass)204 class_lookup(PyClassObject *cp, PyObject *name, PyClassObject **pclass)
205 {
206     Py_ssize_t i, n;
207     PyObject *value = PyDict_GetItem(cp->cl_dict, name);
208     if (value != NULL) {
209         *pclass = cp;
210         return value;
211     }
212     n = PyTuple_Size(cp->cl_bases);
213     for (i = 0; i < n; i++) {
214         /* XXX What if one of the bases is not a class? */
215         PyObject *v = class_lookup(
216             (PyClassObject *)
217             PyTuple_GetItem(cp->cl_bases, i), name, pclass);
218         if (v != NULL)
219             return v;
220     }
221     return NULL;
222 }
223 
224 static PyObject *
class_getattr(register PyClassObject * op,PyObject * name)225 class_getattr(register PyClassObject *op, PyObject *name)
226 {
227     register PyObject *v;
228     register char *sname = PyString_AsString(name);
229     PyClassObject *klass;
230     descrgetfunc f;
231 
232     if (sname[0] == '_' && sname[1] == '_') {
233         if (strcmp(sname, "__dict__") == 0) {
234             if (PyEval_GetRestricted()) {
235                 PyErr_SetString(PyExc_RuntimeError,
236                "class.__dict__ not accessible in restricted mode");
237                 return NULL;
238             }
239             Py_INCREF(op->cl_dict);
240             return op->cl_dict;
241         }
242         if (strcmp(sname, "__bases__") == 0) {
243             Py_INCREF(op->cl_bases);
244             return op->cl_bases;
245         }
246         if (strcmp(sname, "__name__") == 0) {
247             if (op->cl_name == NULL)
248                 v = Py_None;
249             else
250                 v = op->cl_name;
251             Py_INCREF(v);
252             return v;
253         }
254     }
255     v = class_lookup(op, name, &klass);
256     if (v == NULL) {
257         PyErr_Format(PyExc_AttributeError,
258                      "class %.50s has no attribute '%.400s'",
259                      PyString_AS_STRING(op->cl_name), sname);
260         return NULL;
261     }
262     f = TP_DESCR_GET(v->ob_type);
263     if (f == NULL)
264         Py_INCREF(v);
265     else
266         v = f(v, (PyObject *)NULL, (PyObject *)op);
267     return v;
268 }
269 
270 static void
set_slot(PyObject ** slot,PyObject * v)271 set_slot(PyObject **slot, PyObject *v)
272 {
273     PyObject *temp = *slot;
274     Py_XINCREF(v);
275     *slot = v;
276     Py_XDECREF(temp);
277 }
278 
279 static void
set_attr_slots(PyClassObject * c)280 set_attr_slots(PyClassObject *c)
281 {
282     PyClassObject *dummy;
283 
284     set_slot(&c->cl_getattr, class_lookup(c, getattrstr, &dummy));
285     set_slot(&c->cl_setattr, class_lookup(c, setattrstr, &dummy));
286     set_slot(&c->cl_delattr, class_lookup(c, delattrstr, &dummy));
287 }
288 
289 static char *
set_dict(PyClassObject * c,PyObject * v)290 set_dict(PyClassObject *c, PyObject *v)
291 {
292     if (v == NULL || !PyDict_Check(v))
293         return "__dict__ must be a dictionary object";
294     set_slot(&c->cl_dict, v);
295     set_attr_slots(c);
296     return "";
297 }
298 
299 static char *
set_bases(PyClassObject * c,PyObject * v)300 set_bases(PyClassObject *c, PyObject *v)
301 {
302     Py_ssize_t i, n;
303 
304     if (v == NULL || !PyTuple_Check(v))
305         return "__bases__ must be a tuple object";
306     n = PyTuple_Size(v);
307     for (i = 0; i < n; i++) {
308         PyObject *x = PyTuple_GET_ITEM(v, i);
309         if (!PyClass_Check(x))
310             return "__bases__ items must be classes";
311         if (PyClass_IsSubclass(x, (PyObject *)c))
312             return "a __bases__ item causes an inheritance cycle";
313     }
314     set_slot(&c->cl_bases, v);
315     set_attr_slots(c);
316     return "";
317 }
318 
319 static char *
set_name(PyClassObject * c,PyObject * v)320 set_name(PyClassObject *c, PyObject *v)
321 {
322     if (v == NULL || !PyString_Check(v))
323         return "__name__ must be a string object";
324     if (strlen(PyString_AS_STRING(v)) != (size_t)PyString_GET_SIZE(v))
325         return "__name__ must not contain null bytes";
326     set_slot(&c->cl_name, v);
327     return "";
328 }
329 
330 static int
class_setattr(PyClassObject * op,PyObject * name,PyObject * v)331 class_setattr(PyClassObject *op, PyObject *name, PyObject *v)
332 {
333     char *sname;
334     if (PyEval_GetRestricted()) {
335         PyErr_SetString(PyExc_RuntimeError,
336                    "classes are read-only in restricted mode");
337         return -1;
338     }
339     sname = PyString_AsString(name);
340     if (sname[0] == '_' && sname[1] == '_') {
341         Py_ssize_t n = PyString_Size(name);
342         if (sname[n-1] == '_' && sname[n-2] == '_') {
343             char *err = NULL;
344             if (strcmp(sname, "__dict__") == 0)
345                 err = set_dict(op, v);
346             else if (strcmp(sname, "__bases__") == 0)
347                 err = set_bases(op, v);
348             else if (strcmp(sname, "__name__") == 0)
349                 err = set_name(op, v);
350             else if (strcmp(sname, "__getattr__") == 0)
351                 set_slot(&op->cl_getattr, v);
352             else if (strcmp(sname, "__setattr__") == 0)
353                 set_slot(&op->cl_setattr, v);
354             else if (strcmp(sname, "__delattr__") == 0)
355                 set_slot(&op->cl_delattr, v);
356             /* For the last three, we fall through to update the
357                dictionary as well. */
358             if (err != NULL) {
359                 if (*err == '\0')
360                     return 0;
361                 PyErr_SetString(PyExc_TypeError, err);
362                 return -1;
363             }
364         }
365     }
366     if (v == NULL) {
367         int rv = PyDict_DelItem(op->cl_dict, name);
368         if (rv < 0)
369             PyErr_Format(PyExc_AttributeError,
370                          "class %.50s has no attribute '%.400s'",
371                          PyString_AS_STRING(op->cl_name), sname);
372         return rv;
373     }
374     else
375         return PyDict_SetItem(op->cl_dict, name, v);
376 }
377 
378 static PyObject *
class_repr(PyClassObject * op)379 class_repr(PyClassObject *op)
380 {
381     PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
382     char *name;
383     if (op->cl_name == NULL || !PyString_Check(op->cl_name))
384         name = "?";
385     else
386         name = PyString_AsString(op->cl_name);
387     if (mod == NULL || !PyString_Check(mod))
388         return PyString_FromFormat("<class ?.%s at %p>", name, op);
389     else
390         return PyString_FromFormat("<class %s.%s at %p>",
391                                    PyString_AsString(mod),
392                                    name, op);
393 }
394 
395 static PyObject *
class_str(PyClassObject * op)396 class_str(PyClassObject *op)
397 {
398     PyObject *mod = PyDict_GetItemString(op->cl_dict, "__module__");
399     PyObject *name = op->cl_name;
400     PyObject *res;
401     Py_ssize_t m, n;
402 
403     if (name == NULL || !PyString_Check(name))
404         return class_repr(op);
405     if (mod == NULL || !PyString_Check(mod)) {
406         Py_INCREF(name);
407         return name;
408     }
409     m = PyString_GET_SIZE(mod);
410     n = PyString_GET_SIZE(name);
411     res = PyString_FromStringAndSize((char *)NULL, m+1+n);
412     if (res != NULL) {
413         char *s = PyString_AS_STRING(res);
414         memcpy(s, PyString_AS_STRING(mod), m);
415         s += m;
416         *s++ = '.';
417         memcpy(s, PyString_AS_STRING(name), n);
418     }
419     return res;
420 }
421 
422 static int
class_traverse(PyClassObject * o,visitproc visit,void * arg)423 class_traverse(PyClassObject *o, visitproc visit, void *arg)
424 {
425     Py_VISIT(o->cl_bases);
426     Py_VISIT(o->cl_dict);
427     Py_VISIT(o->cl_name);
428     Py_VISIT(o->cl_getattr);
429     Py_VISIT(o->cl_setattr);
430     Py_VISIT(o->cl_delattr);
431     return 0;
432 }
433 
434 PyTypeObject PyClass_Type = {
435     PyObject_HEAD_INIT(&PyType_Type)
436     0,
437     "classobj",
438     sizeof(PyClassObject),
439     0,
440     (destructor)class_dealloc,                  /* tp_dealloc */
441     0,                                          /* tp_print */
442     0,                                          /* tp_getattr */
443     0,                                          /* tp_setattr */
444     0,                                          /* tp_compare */
445     (reprfunc)class_repr,                       /* tp_repr */
446     0,                                          /* tp_as_number */
447     0,                                          /* tp_as_sequence */
448     0,                                          /* tp_as_mapping */
449     0,                                          /* tp_hash */
450     PyInstance_New,                             /* tp_call */
451     (reprfunc)class_str,                        /* tp_str */
452     (getattrofunc)class_getattr,                /* tp_getattro */
453     (setattrofunc)class_setattr,                /* tp_setattro */
454     0,                                          /* tp_as_buffer */
455     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
456     class_doc,                                  /* tp_doc */
457     (traverseproc)class_traverse,               /* tp_traverse */
458     0,                                          /* tp_clear */
459     0,                                          /* tp_richcompare */
460     offsetof(PyClassObject, cl_weakreflist), /* tp_weaklistoffset */
461     0,                                          /* tp_iter */
462     0,                                          /* tp_iternext */
463     0,                                          /* tp_methods */
464     0,                                          /* tp_members */
465     0,                                          /* tp_getset */
466     0,                                          /* tp_base */
467     0,                                          /* tp_dict */
468     0,                                          /* tp_descr_get */
469     0,                                          /* tp_descr_set */
470     0,                                          /* tp_dictoffset */
471     0,                                          /* tp_init */
472     0,                                          /* tp_alloc */
473     class_new,                                  /* tp_new */
474 };
475 
476 int
PyClass_IsSubclass(PyObject * klass,PyObject * base)477 PyClass_IsSubclass(PyObject *klass, PyObject *base)
478 {
479     Py_ssize_t i, n;
480     PyClassObject *cp;
481     if (klass == base)
482         return 1;
483     if (PyTuple_Check(base)) {
484         n = PyTuple_GET_SIZE(base);
485         for (i = 0; i < n; i++) {
486             if (PyClass_IsSubclass(klass, PyTuple_GET_ITEM(base, i)))
487                 return 1;
488         }
489         return 0;
490     }
491     if (klass == NULL || !PyClass_Check(klass))
492         return 0;
493     cp = (PyClassObject *)klass;
494     n = PyTuple_Size(cp->cl_bases);
495     for (i = 0; i < n; i++) {
496         if (PyClass_IsSubclass(PyTuple_GetItem(cp->cl_bases, i), base))
497             return 1;
498     }
499     return 0;
500 }
501 
502 
503 /* Instance objects */
504 
505 PyObject *
PyInstance_NewRaw(PyObject * klass,PyObject * dict)506 PyInstance_NewRaw(PyObject *klass, PyObject *dict)
507 {
508     PyInstanceObject *inst;
509 
510     if (!PyClass_Check(klass)) {
511         PyErr_BadInternalCall();
512         return NULL;
513     }
514     if (dict == NULL) {
515         dict = PyDict_New();
516         if (dict == NULL)
517             return NULL;
518     }
519     else {
520         if (!PyDict_Check(dict)) {
521             PyErr_BadInternalCall();
522             return NULL;
523         }
524         Py_INCREF(dict);
525     }
526     inst = PyObject_GC_New(PyInstanceObject, &PyInstance_Type);
527     if (inst == NULL) {
528         Py_DECREF(dict);
529         return NULL;
530     }
531     inst->in_weakreflist = NULL;
532     Py_INCREF(klass);
533     inst->in_class = (PyClassObject *)klass;
534     inst->in_dict = dict;
535     _PyObject_GC_TRACK(inst);
536     return (PyObject *)inst;
537 }
538 
539 PyObject *
PyInstance_New(PyObject * klass,PyObject * arg,PyObject * kw)540 PyInstance_New(PyObject *klass, PyObject *arg, PyObject *kw)
541 {
542     register PyInstanceObject *inst;
543     PyObject *init;
544     static PyObject *initstr;
545 
546     if (initstr == NULL) {
547         initstr = PyString_InternFromString("__init__");
548         if (initstr == NULL)
549             return NULL;
550     }
551     inst = (PyInstanceObject *) PyInstance_NewRaw(klass, NULL);
552     if (inst == NULL)
553         return NULL;
554     init = instance_getattr2(inst, initstr);
555     if (init == NULL) {
556         if (PyErr_Occurred()) {
557             Py_DECREF(inst);
558             return NULL;
559         }
560         if ((arg != NULL && (!PyTuple_Check(arg) ||
561                              PyTuple_Size(arg) != 0))
562             || (kw != NULL && (!PyDict_Check(kw) ||
563                               PyDict_Size(kw) != 0))) {
564             PyErr_SetString(PyExc_TypeError,
565                        "this constructor takes no arguments");
566             Py_DECREF(inst);
567             inst = NULL;
568         }
569     }
570     else {
571         PyObject *res = PyEval_CallObjectWithKeywords(init, arg, kw);
572         Py_DECREF(init);
573         if (res == NULL) {
574             Py_DECREF(inst);
575             inst = NULL;
576         }
577         else {
578             if (res != Py_None) {
579                 PyErr_SetString(PyExc_TypeError,
580                            "__init__() should return None");
581                 Py_DECREF(inst);
582                 inst = NULL;
583             }
584             Py_DECREF(res);
585         }
586     }
587     return (PyObject *)inst;
588 }
589 
590 /* Instance methods */
591 
592 PyDoc_STRVAR(instance_doc,
593 "instance(class[, dict])\n\
594 \n\
595 Create an instance without calling its __init__() method.\n\
596 The class must be a classic class.\n\
597 If present, dict must be a dictionary or None.");
598 
599 static PyObject *
instance_new(PyTypeObject * type,PyObject * args,PyObject * kw)600 instance_new(PyTypeObject* type, PyObject* args, PyObject *kw)
601 {
602     PyObject *klass;
603     PyObject *dict = Py_None;
604 
605     if (!PyArg_ParseTuple(args, "O!|O:instance",
606                           &PyClass_Type, &klass, &dict))
607         return NULL;
608 
609     if (dict == Py_None)
610         dict = NULL;
611     else if (!PyDict_Check(dict)) {
612         PyErr_SetString(PyExc_TypeError,
613               "instance() second arg must be dictionary or None");
614         return NULL;
615     }
616     return PyInstance_NewRaw(klass, dict);
617 }
618 
619 
620 static void
instance_dealloc(register PyInstanceObject * inst)621 instance_dealloc(register PyInstanceObject *inst)
622 {
623     PyObject *error_type, *error_value, *error_traceback;
624     PyObject *del;
625     static PyObject *delstr;
626 
627     _PyObject_GC_UNTRACK(inst);
628     if (inst->in_weakreflist != NULL)
629         PyObject_ClearWeakRefs((PyObject *) inst);
630 
631     /* Temporarily resurrect the object. */
632     assert(inst->ob_type == &PyInstance_Type);
633     assert(inst->ob_refcnt == 0);
634     inst->ob_refcnt = 1;
635 
636     /* Save the current exception, if any. */
637     PyErr_Fetch(&error_type, &error_value, &error_traceback);
638     /* Execute __del__ method, if any. */
639     if (delstr == NULL) {
640         delstr = PyString_InternFromString("__del__");
641         if (delstr == NULL)
642             PyErr_WriteUnraisable((PyObject*)inst);
643     }
644     if (delstr && (del = instance_getattr2(inst, delstr)) != NULL) {
645         PyObject *res = PyEval_CallObject(del, (PyObject *)NULL);
646         if (res == NULL)
647             PyErr_WriteUnraisable(del);
648         else
649             Py_DECREF(res);
650         Py_DECREF(del);
651     }
652     /* Restore the saved exception. */
653     PyErr_Restore(error_type, error_value, error_traceback);
654 
655     /* Undo the temporary resurrection; can't use DECREF here, it would
656      * cause a recursive call.
657      */
658     assert(inst->ob_refcnt > 0);
659     if (--inst->ob_refcnt == 0) {
660 
661         /* New weakrefs could be created during the finalizer call.
662             If this occurs, clear them out without calling their
663             finalizers since they might rely on part of the object
664             being finalized that has already been destroyed. */
665         while (inst->in_weakreflist != NULL) {
666             _PyWeakref_ClearRef((PyWeakReference *)
667                                 (inst->in_weakreflist));
668         }
669 
670         Py_DECREF(inst->in_class);
671         Py_XDECREF(inst->in_dict);
672         PyObject_GC_Del(inst);
673     }
674     else {
675         Py_ssize_t refcnt = inst->ob_refcnt;
676         /* __del__ resurrected it!  Make it look like the original
677          * Py_DECREF never happened.
678          */
679         _Py_NewReference((PyObject *)inst);
680         inst->ob_refcnt = refcnt;
681         _PyObject_GC_TRACK(inst);
682         /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
683          * we need to undo that. */
684         _Py_DEC_REFTOTAL;
685         /* If Py_TRACE_REFS, _Py_NewReference re-added self to the
686          * object chain, so no more to do there.
687          * If COUNT_ALLOCS, the original decref bumped tp_frees, and
688          * _Py_NewReference bumped tp_allocs: both of those need to be
689          * undone.
690          */
691 #ifdef COUNT_ALLOCS
692         --inst->ob_type->tp_frees;
693         --inst->ob_type->tp_allocs;
694 #endif
695     }
696 }
697 
698 static PyObject *
instance_getattr1(register PyInstanceObject * inst,PyObject * name)699 instance_getattr1(register PyInstanceObject *inst, PyObject *name)
700 {
701     register PyObject *v;
702     register char *sname = PyString_AsString(name);
703     if (sname[0] == '_' && sname[1] == '_') {
704         if (strcmp(sname, "__dict__") == 0) {
705             if (PyEval_GetRestricted()) {
706                 PyErr_SetString(PyExc_RuntimeError,
707             "instance.__dict__ not accessible in restricted mode");
708                 return NULL;
709             }
710             Py_INCREF(inst->in_dict);
711             return inst->in_dict;
712         }
713         if (strcmp(sname, "__class__") == 0) {
714             Py_INCREF(inst->in_class);
715             return (PyObject *)inst->in_class;
716         }
717     }
718     v = instance_getattr2(inst, name);
719     if (v == NULL && !PyErr_Occurred()) {
720         PyErr_Format(PyExc_AttributeError,
721                      "%.50s instance has no attribute '%.400s'",
722                      PyString_AS_STRING(inst->in_class->cl_name), sname);
723     }
724     return v;
725 }
726 
727 static PyObject *
instance_getattr2(register PyInstanceObject * inst,PyObject * name)728 instance_getattr2(register PyInstanceObject *inst, PyObject *name)
729 {
730     register PyObject *v;
731     PyClassObject *klass;
732     descrgetfunc f;
733 
734     v = PyDict_GetItem(inst->in_dict, name);
735     if (v != NULL) {
736         Py_INCREF(v);
737         return v;
738     }
739     v = class_lookup(inst->in_class, name, &klass);
740     if (v != NULL) {
741         Py_INCREF(v);
742         f = TP_DESCR_GET(v->ob_type);
743         if (f != NULL) {
744             PyObject *w = f(v, (PyObject *)inst,
745                             (PyObject *)(inst->in_class));
746             Py_DECREF(v);
747             v = w;
748         }
749     }
750     return v;
751 }
752 
753 static PyObject *
instance_getattr(register PyInstanceObject * inst,PyObject * name)754 instance_getattr(register PyInstanceObject *inst, PyObject *name)
755 {
756     register PyObject *func, *res;
757     res = instance_getattr1(inst, name);
758     if (res == NULL && (func = inst->in_class->cl_getattr) != NULL) {
759         PyObject *args;
760         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
761             return NULL;
762         PyErr_Clear();
763         args = PyTuple_Pack(2, inst, name);
764         if (args == NULL)
765             return NULL;
766         res = PyEval_CallObject(func, args);
767         Py_DECREF(args);
768     }
769     return res;
770 }
771 
772 /* See classobject.h comments:  this only does dict lookups, and is always
773  * safe to call.
774  */
775 PyObject *
_PyInstance_Lookup(PyObject * pinst,PyObject * name)776 _PyInstance_Lookup(PyObject *pinst, PyObject *name)
777 {
778     PyObject *v;
779     PyClassObject *klass;
780     PyInstanceObject *inst;     /* pinst cast to the right type */
781 
782     assert(PyInstance_Check(pinst));
783     inst = (PyInstanceObject *)pinst;
784 
785     assert(PyString_Check(name));
786 
787     v = PyDict_GetItem(inst->in_dict, name);
788     if (v == NULL)
789         v = class_lookup(inst->in_class, name, &klass);
790     return v;
791 }
792 
793 static int
instance_setattr1(PyInstanceObject * inst,PyObject * name,PyObject * v)794 instance_setattr1(PyInstanceObject *inst, PyObject *name, PyObject *v)
795 {
796     if (v == NULL) {
797         int rv = PyDict_DelItem(inst->in_dict, name);
798         if (rv < 0)
799             PyErr_Format(PyExc_AttributeError,
800                          "%.50s instance has no attribute '%.400s'",
801                          PyString_AS_STRING(inst->in_class->cl_name),
802                          PyString_AS_STRING(name));
803         return rv;
804     }
805     else
806         return PyDict_SetItem(inst->in_dict, name, v);
807 }
808 
809 static int
instance_setattr(PyInstanceObject * inst,PyObject * name,PyObject * v)810 instance_setattr(PyInstanceObject *inst, PyObject *name, PyObject *v)
811 {
812     PyObject *func, *args, *res, *tmp;
813     char *sname = PyString_AsString(name);
814     if (sname[0] == '_' && sname[1] == '_') {
815         Py_ssize_t n = PyString_Size(name);
816         if (sname[n-1] == '_' && sname[n-2] == '_') {
817             if (strcmp(sname, "__dict__") == 0) {
818                 if (PyEval_GetRestricted()) {
819                     PyErr_SetString(PyExc_RuntimeError,
820                  "__dict__ not accessible in restricted mode");
821                     return -1;
822                 }
823                 if (v == NULL || !PyDict_Check(v)) {
824                     PyErr_SetString(PyExc_TypeError,
825                        "__dict__ must be set to a dictionary");
826                     return -1;
827                 }
828                 tmp = inst->in_dict;
829                 Py_INCREF(v);
830                 inst->in_dict = v;
831                 Py_DECREF(tmp);
832                 return 0;
833             }
834             if (strcmp(sname, "__class__") == 0) {
835                 if (PyEval_GetRestricted()) {
836                     PyErr_SetString(PyExc_RuntimeError,
837                 "__class__ not accessible in restricted mode");
838                     return -1;
839                 }
840                 if (v == NULL || !PyClass_Check(v)) {
841                     PyErr_SetString(PyExc_TypeError,
842                        "__class__ must be set to a class");
843                     return -1;
844                 }
845                 tmp = (PyObject *)(inst->in_class);
846                 Py_INCREF(v);
847                 inst->in_class = (PyClassObject *)v;
848                 Py_DECREF(tmp);
849                 return 0;
850             }
851         }
852     }
853     if (v == NULL)
854         func = inst->in_class->cl_delattr;
855     else
856         func = inst->in_class->cl_setattr;
857     if (func == NULL)
858         return instance_setattr1(inst, name, v);
859     if (v == NULL)
860         args = PyTuple_Pack(2, inst, name);
861     else
862         args = PyTuple_Pack(3, inst, name, v);
863     if (args == NULL)
864         return -1;
865     res = PyEval_CallObject(func, args);
866     Py_DECREF(args);
867     if (res == NULL)
868         return -1;
869     Py_DECREF(res);
870     return 0;
871 }
872 
873 static PyObject *
instance_repr(PyInstanceObject * inst)874 instance_repr(PyInstanceObject *inst)
875 {
876     PyObject *func;
877     PyObject *res;
878     static PyObject *reprstr;
879 
880     if (reprstr == NULL) {
881         reprstr = PyString_InternFromString("__repr__");
882         if (reprstr == NULL)
883             return NULL;
884     }
885     func = instance_getattr(inst, reprstr);
886     if (func == NULL) {
887         PyObject *classname, *mod;
888         char *cname;
889         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
890             return NULL;
891         PyErr_Clear();
892         classname = inst->in_class->cl_name;
893         mod = PyDict_GetItemString(inst->in_class->cl_dict,
894                                    "__module__");
895         if (classname != NULL && PyString_Check(classname))
896             cname = PyString_AsString(classname);
897         else
898             cname = "?";
899         if (mod == NULL || !PyString_Check(mod))
900             return PyString_FromFormat("<?.%s instance at %p>",
901                                        cname, inst);
902         else
903             return PyString_FromFormat("<%s.%s instance at %p>",
904                                        PyString_AsString(mod),
905                                        cname, inst);
906     }
907     res = PyEval_CallObject(func, (PyObject *)NULL);
908     Py_DECREF(func);
909     return res;
910 }
911 
912 static PyObject *
instance_str(PyInstanceObject * inst)913 instance_str(PyInstanceObject *inst)
914 {
915     PyObject *func;
916     PyObject *res;
917     static PyObject *strstr;
918 
919     if (strstr == NULL) {
920         strstr = PyString_InternFromString("__str__");
921         if (strstr == NULL)
922             return NULL;
923     }
924     func = instance_getattr(inst, strstr);
925     if (func == NULL) {
926         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
927             return NULL;
928         PyErr_Clear();
929         return instance_repr(inst);
930     }
931     res = PyEval_CallObject(func, (PyObject *)NULL);
932     Py_DECREF(func);
933     return res;
934 }
935 
936 static long
instance_hash(PyInstanceObject * inst)937 instance_hash(PyInstanceObject *inst)
938 {
939     PyObject *func;
940     PyObject *res;
941     long outcome;
942     static PyObject *hashstr, *eqstr, *cmpstr;
943 
944     if (hashstr == NULL) {
945         hashstr = PyString_InternFromString("__hash__");
946         if (hashstr == NULL)
947             return -1;
948     }
949     func = instance_getattr(inst, hashstr);
950     if (func == NULL) {
951         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
952             return -1;
953         PyErr_Clear();
954         /* If there is no __eq__ and no __cmp__ method, we hash on the
955            address.  If an __eq__ or __cmp__ method exists, there must
956            be a __hash__. */
957         if (eqstr == NULL) {
958             eqstr = PyString_InternFromString("__eq__");
959             if (eqstr == NULL)
960                 return -1;
961         }
962         func = instance_getattr(inst, eqstr);
963         if (func == NULL) {
964             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
965                 return -1;
966             PyErr_Clear();
967             if (cmpstr == NULL) {
968                 cmpstr = PyString_InternFromString("__cmp__");
969                 if (cmpstr == NULL)
970                     return -1;
971             }
972             func = instance_getattr(inst, cmpstr);
973             if (func == NULL) {
974                 if (!PyErr_ExceptionMatches(
975                     PyExc_AttributeError))
976                     return -1;
977                 PyErr_Clear();
978                 return _Py_HashPointer(inst);
979             }
980         }
981         Py_XDECREF(func);
982         PyErr_SetString(PyExc_TypeError, "unhashable instance");
983         return -1;
984     }
985     res = PyEval_CallObject(func, (PyObject *)NULL);
986     Py_DECREF(func);
987     if (res == NULL)
988         return -1;
989     if (PyInt_Check(res) || PyLong_Check(res))
990         /* This already converts a -1 result to -2. */
991         outcome = res->ob_type->tp_hash(res);
992     else {
993         PyErr_SetString(PyExc_TypeError,
994                         "__hash__() should return an int");
995         outcome = -1;
996     }
997     Py_DECREF(res);
998     return outcome;
999 }
1000 
1001 static int
instance_traverse(PyInstanceObject * o,visitproc visit,void * arg)1002 instance_traverse(PyInstanceObject *o, visitproc visit, void *arg)
1003 {
1004     Py_VISIT(o->in_class);
1005     Py_VISIT(o->in_dict);
1006     return 0;
1007 }
1008 
1009 static PyObject *getitemstr, *setitemstr, *delitemstr, *lenstr;
1010 static PyObject *iterstr, *nextstr;
1011 
1012 static Py_ssize_t
instance_length(PyInstanceObject * inst)1013 instance_length(PyInstanceObject *inst)
1014 {
1015     PyObject *func;
1016     PyObject *res;
1017     Py_ssize_t outcome;
1018 
1019     if (lenstr == NULL) {
1020         lenstr = PyString_InternFromString("__len__");
1021         if (lenstr == NULL)
1022             return -1;
1023     }
1024     func = instance_getattr(inst, lenstr);
1025     if (func == NULL)
1026         return -1;
1027     res = PyEval_CallObject(func, (PyObject *)NULL);
1028     Py_DECREF(func);
1029     if (res == NULL)
1030         return -1;
1031     if (PyInt_Check(res)) {
1032         outcome = PyInt_AsSsize_t(res);
1033         if (outcome == -1 && PyErr_Occurred()) {
1034             Py_DECREF(res);
1035             return -1;
1036         }
1037 #if SIZEOF_SIZE_T < SIZEOF_INT
1038         /* Overflow check -- range of PyInt is more than C int */
1039         if (outcome != (int)outcome) {
1040             PyErr_SetString(PyExc_OverflowError,
1041              "__len__() should return 0 <= outcome < 2**31");
1042             outcome = -1;
1043         }
1044         else
1045 #endif
1046         if (outcome < 0) {
1047             PyErr_SetString(PyExc_ValueError,
1048                             "__len__() should return >= 0");
1049             outcome = -1;
1050         }
1051     }
1052     else {
1053         PyErr_SetString(PyExc_TypeError,
1054                         "__len__() should return an int");
1055         outcome = -1;
1056     }
1057     Py_DECREF(res);
1058     return outcome;
1059 }
1060 
1061 static PyObject *
instance_subscript(PyInstanceObject * inst,PyObject * key)1062 instance_subscript(PyInstanceObject *inst, PyObject *key)
1063 {
1064     PyObject *func;
1065     PyObject *arg;
1066     PyObject *res;
1067 
1068     if (getitemstr == NULL) {
1069         getitemstr = PyString_InternFromString("__getitem__");
1070         if (getitemstr == NULL)
1071             return NULL;
1072     }
1073     func = instance_getattr(inst, getitemstr);
1074     if (func == NULL)
1075         return NULL;
1076     arg = PyTuple_Pack(1, key);
1077     if (arg == NULL) {
1078         Py_DECREF(func);
1079         return NULL;
1080     }
1081     res = PyEval_CallObject(func, arg);
1082     Py_DECREF(func);
1083     Py_DECREF(arg);
1084     return res;
1085 }
1086 
1087 static int
instance_ass_subscript(PyInstanceObject * inst,PyObject * key,PyObject * value)1088 instance_ass_subscript(PyInstanceObject *inst, PyObject *key, PyObject *value)
1089 {
1090     PyObject *func;
1091     PyObject *arg;
1092     PyObject *res;
1093 
1094     if (value == NULL) {
1095         if (delitemstr == NULL) {
1096             delitemstr = PyString_InternFromString("__delitem__");
1097             if (delitemstr == NULL)
1098                 return -1;
1099         }
1100         func = instance_getattr(inst, delitemstr);
1101     }
1102     else {
1103         if (setitemstr == NULL) {
1104             setitemstr = PyString_InternFromString("__setitem__");
1105             if (setitemstr == NULL)
1106                 return -1;
1107         }
1108         func = instance_getattr(inst, setitemstr);
1109     }
1110     if (func == NULL)
1111         return -1;
1112     if (value == NULL)
1113         arg = PyTuple_Pack(1, key);
1114     else
1115         arg = PyTuple_Pack(2, key, value);
1116     if (arg == NULL) {
1117         Py_DECREF(func);
1118         return -1;
1119     }
1120     res = PyEval_CallObject(func, arg);
1121     Py_DECREF(func);
1122     Py_DECREF(arg);
1123     if (res == NULL)
1124         return -1;
1125     Py_DECREF(res);
1126     return 0;
1127 }
1128 
1129 static PyMappingMethods instance_as_mapping = {
1130     (lenfunc)instance_length,                   /* mp_length */
1131     (binaryfunc)instance_subscript,             /* mp_subscript */
1132     (objobjargproc)instance_ass_subscript,      /* mp_ass_subscript */
1133 };
1134 
1135 static PyObject *
instance_item(PyInstanceObject * inst,Py_ssize_t i)1136 instance_item(PyInstanceObject *inst, Py_ssize_t i)
1137 {
1138     PyObject *func, *res;
1139 
1140     if (getitemstr == NULL) {
1141         getitemstr = PyString_InternFromString("__getitem__");
1142         if (getitemstr == NULL)
1143             return NULL;
1144     }
1145     func = instance_getattr(inst, getitemstr);
1146     if (func == NULL)
1147         return NULL;
1148     res = PyObject_CallFunction(func, "n", i);
1149     Py_DECREF(func);
1150     return res;
1151 }
1152 
1153 static PyObject *
instance_slice(PyInstanceObject * inst,Py_ssize_t i,Py_ssize_t j)1154 instance_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j)
1155 {
1156     PyObject *func, *arg, *res;
1157     static PyObject *getslicestr;
1158 
1159     if (getslicestr == NULL) {
1160         getslicestr = PyString_InternFromString("__getslice__");
1161         if (getslicestr == NULL)
1162             return NULL;
1163     }
1164     func = instance_getattr(inst, getslicestr);
1165 
1166     if (func == NULL) {
1167         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1168             return NULL;
1169         PyErr_Clear();
1170 
1171         if (getitemstr == NULL) {
1172             getitemstr = PyString_InternFromString("__getitem__");
1173             if (getitemstr == NULL)
1174                 return NULL;
1175         }
1176         func = instance_getattr(inst, getitemstr);
1177         if (func == NULL)
1178             return NULL;
1179         arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j));
1180     }
1181     else {
1182         if (PyErr_WarnPy3k("in 3.x, __getslice__ has been removed; "
1183                            "use __getitem__", 1) < 0) {
1184             Py_DECREF(func);
1185             return NULL;
1186         }
1187         arg = Py_BuildValue("(nn)", i, j);
1188     }
1189 
1190     if (arg == NULL) {
1191         Py_DECREF(func);
1192         return NULL;
1193     }
1194     res = PyEval_CallObject(func, arg);
1195     Py_DECREF(func);
1196     Py_DECREF(arg);
1197     return res;
1198 }
1199 
1200 static int
instance_ass_item(PyInstanceObject * inst,Py_ssize_t i,PyObject * item)1201 instance_ass_item(PyInstanceObject *inst, Py_ssize_t i, PyObject *item)
1202 {
1203     PyObject *func, *arg, *res;
1204 
1205     if (item == NULL) {
1206         if (delitemstr == NULL) {
1207             delitemstr = PyString_InternFromString("__delitem__");
1208             if (delitemstr == NULL)
1209                 return -1;
1210         }
1211         func = instance_getattr(inst, delitemstr);
1212     }
1213     else {
1214         if (setitemstr == NULL) {
1215             setitemstr = PyString_InternFromString("__setitem__");
1216             if (setitemstr == NULL)
1217                 return -1;
1218         }
1219         func = instance_getattr(inst, setitemstr);
1220     }
1221     if (func == NULL)
1222         return -1;
1223     if (item == NULL)
1224         arg = PyInt_FromSsize_t(i);
1225     else
1226         arg = Py_BuildValue("(nO)", i, item);
1227     if (arg == NULL) {
1228         Py_DECREF(func);
1229         return -1;
1230     }
1231     res = PyEval_CallObject(func, arg);
1232     Py_DECREF(func);
1233     Py_DECREF(arg);
1234     if (res == NULL)
1235         return -1;
1236     Py_DECREF(res);
1237     return 0;
1238 }
1239 
1240 static int
instance_ass_slice(PyInstanceObject * inst,Py_ssize_t i,Py_ssize_t j,PyObject * value)1241 instance_ass_slice(PyInstanceObject *inst, Py_ssize_t i, Py_ssize_t j, PyObject *value)
1242 {
1243     PyObject *func, *arg, *res;
1244     static PyObject *setslicestr, *delslicestr;
1245 
1246     if (value == NULL) {
1247         if (delslicestr == NULL) {
1248             delslicestr =
1249                 PyString_InternFromString("__delslice__");
1250             if (delslicestr == NULL)
1251                 return -1;
1252         }
1253         func = instance_getattr(inst, delslicestr);
1254         if (func == NULL) {
1255             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1256                 return -1;
1257             PyErr_Clear();
1258             if (delitemstr == NULL) {
1259                 delitemstr =
1260                     PyString_InternFromString("__delitem__");
1261                 if (delitemstr == NULL)
1262                     return -1;
1263             }
1264             func = instance_getattr(inst, delitemstr);
1265             if (func == NULL)
1266                 return -1;
1267 
1268             arg = Py_BuildValue("(N)",
1269                                 _PySlice_FromIndices(i, j));
1270         }
1271         else {
1272             if (PyErr_WarnPy3k("in 3.x, __delslice__ has been "
1273                                 "removed; use __delitem__", 1) < 0) {
1274                 Py_DECREF(func);
1275                 return -1;
1276             }
1277             arg = Py_BuildValue("(nn)", i, j);
1278         }
1279     }
1280     else {
1281         if (setslicestr == NULL) {
1282             setslicestr =
1283                 PyString_InternFromString("__setslice__");
1284             if (setslicestr == NULL)
1285                 return -1;
1286         }
1287         func = instance_getattr(inst, setslicestr);
1288         if (func == NULL) {
1289             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1290                 return -1;
1291             PyErr_Clear();
1292             if (setitemstr == NULL) {
1293                 setitemstr =
1294                     PyString_InternFromString("__setitem__");
1295                 if (setitemstr == NULL)
1296                     return -1;
1297             }
1298             func = instance_getattr(inst, setitemstr);
1299             if (func == NULL)
1300                 return -1;
1301 
1302             arg = Py_BuildValue("(NO)",
1303                                 _PySlice_FromIndices(i, j), value);
1304         }
1305         else {
1306             if (PyErr_WarnPy3k("in 3.x, __setslice__ has been "
1307                                "removed; use __setitem__", 1) < 0) {
1308                 Py_DECREF(func);
1309                 return -1;
1310             }
1311             arg = Py_BuildValue("(nnO)", i, j, value);
1312         }
1313     }
1314     if (arg == NULL) {
1315         Py_DECREF(func);
1316         return -1;
1317     }
1318     res = PyEval_CallObject(func, arg);
1319     Py_DECREF(func);
1320     Py_DECREF(arg);
1321     if (res == NULL)
1322         return -1;
1323     Py_DECREF(res);
1324     return 0;
1325 }
1326 
1327 static int
instance_contains(PyInstanceObject * inst,PyObject * member)1328 instance_contains(PyInstanceObject *inst, PyObject *member)
1329 {
1330     static PyObject *__contains__;
1331     PyObject *func;
1332 
1333     /* Try __contains__ first.
1334      * If that can't be done, try iterator-based searching.
1335      */
1336 
1337     if(__contains__ == NULL) {
1338         __contains__ = PyString_InternFromString("__contains__");
1339         if(__contains__ == NULL)
1340             return -1;
1341     }
1342     func = instance_getattr(inst, __contains__);
1343     if (func) {
1344         PyObject *res;
1345         int ret;
1346         PyObject *arg = PyTuple_Pack(1, member);
1347         if(arg == NULL) {
1348             Py_DECREF(func);
1349             return -1;
1350         }
1351         res = PyEval_CallObject(func, arg);
1352         Py_DECREF(func);
1353         Py_DECREF(arg);
1354         if(res == NULL)
1355             return -1;
1356         ret = PyObject_IsTrue(res);
1357         Py_DECREF(res);
1358         return ret;
1359     }
1360 
1361     /* Couldn't find __contains__. */
1362     if (PyErr_ExceptionMatches(PyExc_AttributeError)) {
1363         Py_ssize_t rc;
1364         /* Assume the failure was simply due to that there is no
1365          * __contains__ attribute, and try iterating instead.
1366          */
1367         PyErr_Clear();
1368         rc = _PySequence_IterSearch((PyObject *)inst, member,
1369                                     PY_ITERSEARCH_CONTAINS);
1370         if (rc >= 0)
1371             return rc > 0;
1372     }
1373     return -1;
1374 }
1375 
1376 static PySequenceMethods
1377 instance_as_sequence = {
1378     (lenfunc)instance_length,                   /* sq_length */
1379     0,                                          /* sq_concat */
1380     0,                                          /* sq_repeat */
1381     (ssizeargfunc)instance_item,                /* sq_item */
1382     (ssizessizeargfunc)instance_slice,          /* sq_slice */
1383     (ssizeobjargproc)instance_ass_item,         /* sq_ass_item */
1384     (ssizessizeobjargproc)instance_ass_slice,/* sq_ass_slice */
1385     (objobjproc)instance_contains,              /* sq_contains */
1386 };
1387 
1388 static PyObject *
generic_unary_op(PyInstanceObject * self,PyObject * methodname)1389 generic_unary_op(PyInstanceObject *self, PyObject *methodname)
1390 {
1391     PyObject *func, *res;
1392 
1393     if ((func = instance_getattr(self, methodname)) == NULL)
1394         return NULL;
1395     res = PyEval_CallObject(func, (PyObject *)NULL);
1396     Py_DECREF(func);
1397     return res;
1398 }
1399 
1400 static PyObject *
generic_binary_op(PyObject * v,PyObject * w,char * opname)1401 generic_binary_op(PyObject *v, PyObject *w, char *opname)
1402 {
1403     PyObject *result;
1404     PyObject *args;
1405     PyObject *func = PyObject_GetAttrString(v, opname);
1406     if (func == NULL) {
1407         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1408             return NULL;
1409         PyErr_Clear();
1410         Py_INCREF(Py_NotImplemented);
1411         return Py_NotImplemented;
1412     }
1413     args = PyTuple_Pack(1, w);
1414     if (args == NULL) {
1415         Py_DECREF(func);
1416         return NULL;
1417     }
1418     result = PyEval_CallObject(func, args);
1419     Py_DECREF(args);
1420     Py_DECREF(func);
1421     return result;
1422 }
1423 
1424 
1425 static PyObject *coerce_obj;
1426 
1427 /* Try one half of a binary operator involving a class instance. */
1428 static PyObject *
half_binop(PyObject * v,PyObject * w,char * opname,binaryfunc thisfunc,int swapped)1429 half_binop(PyObject *v, PyObject *w, char *opname, binaryfunc thisfunc,
1430                 int swapped)
1431 {
1432     PyObject *args;
1433     PyObject *coercefunc;
1434     PyObject *coerced = NULL;
1435     PyObject *v1;
1436     PyObject *result;
1437 
1438     if (!PyInstance_Check(v)) {
1439         Py_INCREF(Py_NotImplemented);
1440         return Py_NotImplemented;
1441     }
1442 
1443     if (coerce_obj == NULL) {
1444         coerce_obj = PyString_InternFromString("__coerce__");
1445         if (coerce_obj == NULL)
1446             return NULL;
1447     }
1448     coercefunc = PyObject_GetAttr(v, coerce_obj);
1449     if (coercefunc == NULL) {
1450         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1451             return NULL;
1452         PyErr_Clear();
1453         return generic_binary_op(v, w, opname);
1454     }
1455 
1456     args = PyTuple_Pack(1, w);
1457     if (args == NULL) {
1458         Py_DECREF(coercefunc);
1459         return NULL;
1460     }
1461     coerced = PyEval_CallObject(coercefunc, args);
1462     Py_DECREF(args);
1463     Py_DECREF(coercefunc);
1464     if (coerced == NULL) {
1465         return NULL;
1466     }
1467     if (coerced == Py_None || coerced == Py_NotImplemented) {
1468         Py_DECREF(coerced);
1469         return generic_binary_op(v, w, opname);
1470     }
1471     if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1472         Py_DECREF(coerced);
1473         PyErr_SetString(PyExc_TypeError,
1474                         "coercion should return None or 2-tuple");
1475         return NULL;
1476     }
1477     v1 = PyTuple_GetItem(coerced, 0);
1478     w = PyTuple_GetItem(coerced, 1);
1479     if (v1->ob_type == v->ob_type && PyInstance_Check(v)) {
1480         /* prevent recursion if __coerce__ returns self as the first
1481          * argument */
1482         result = generic_binary_op(v1, w, opname);
1483     } else {
1484         if (Py_EnterRecursiveCall(" after coercion"))
1485             return NULL;
1486         if (swapped)
1487             result = (thisfunc)(w, v1);
1488         else
1489             result = (thisfunc)(v1, w);
1490         Py_LeaveRecursiveCall();
1491     }
1492     Py_DECREF(coerced);
1493     return result;
1494 }
1495 
1496 /* Implement a binary operator involving at least one class instance. */
1497 static PyObject *
do_binop(PyObject * v,PyObject * w,char * opname,char * ropname,binaryfunc thisfunc)1498 do_binop(PyObject *v, PyObject *w, char *opname, char *ropname,
1499                    binaryfunc thisfunc)
1500 {
1501     PyObject *result = half_binop(v, w, opname, thisfunc, 0);
1502     if (result == Py_NotImplemented) {
1503         Py_DECREF(result);
1504         result = half_binop(w, v, ropname, thisfunc, 1);
1505     }
1506     return result;
1507 }
1508 
1509 static PyObject *
do_binop_inplace(PyObject * v,PyObject * w,char * iopname,char * opname,char * ropname,binaryfunc thisfunc)1510 do_binop_inplace(PyObject *v, PyObject *w, char *iopname, char *opname,
1511                         char *ropname, binaryfunc thisfunc)
1512 {
1513     PyObject *result = half_binop(v, w, iopname, thisfunc, 0);
1514     if (result == Py_NotImplemented) {
1515         Py_DECREF(result);
1516         result = do_binop(v, w, opname, ropname, thisfunc);
1517     }
1518     return result;
1519 }
1520 
1521 static int
instance_coerce(PyObject ** pv,PyObject ** pw)1522 instance_coerce(PyObject **pv, PyObject **pw)
1523 {
1524     PyObject *v = *pv;
1525     PyObject *w = *pw;
1526     PyObject *coercefunc;
1527     PyObject *args;
1528     PyObject *coerced;
1529 
1530     if (coerce_obj == NULL) {
1531         coerce_obj = PyString_InternFromString("__coerce__");
1532         if (coerce_obj == NULL)
1533             return -1;
1534     }
1535     coercefunc = PyObject_GetAttr(v, coerce_obj);
1536     if (coercefunc == NULL) {
1537         /* No __coerce__ method */
1538         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1539             return -1;
1540         PyErr_Clear();
1541         return 1;
1542     }
1543     /* Has __coerce__ method: call it */
1544     args = PyTuple_Pack(1, w);
1545     if (args == NULL) {
1546         return -1;
1547     }
1548     coerced = PyEval_CallObject(coercefunc, args);
1549     Py_DECREF(args);
1550     Py_DECREF(coercefunc);
1551     if (coerced == NULL) {
1552         /* __coerce__ call raised an exception */
1553         return -1;
1554     }
1555     if (coerced == Py_None || coerced == Py_NotImplemented) {
1556         /* __coerce__ says "I can't do it" */
1557         Py_DECREF(coerced);
1558         return 1;
1559     }
1560     if (!PyTuple_Check(coerced) || PyTuple_Size(coerced) != 2) {
1561         /* __coerce__ return value is malformed */
1562         Py_DECREF(coerced);
1563         PyErr_SetString(PyExc_TypeError,
1564                    "coercion should return None or 2-tuple");
1565         return -1;
1566     }
1567     /* __coerce__ returned two new values */
1568     *pv = PyTuple_GetItem(coerced, 0);
1569     *pw = PyTuple_GetItem(coerced, 1);
1570     Py_INCREF(*pv);
1571     Py_INCREF(*pw);
1572     Py_DECREF(coerced);
1573     return 0;
1574 }
1575 
1576 #define UNARY(funcname, methodname) \
1577 static PyObject *funcname(PyInstanceObject *self) { \
1578     static PyObject *o; \
1579     if (o == NULL) { o = PyString_InternFromString(methodname); \
1580                      if (o == NULL) return NULL; } \
1581     return generic_unary_op(self, o); \
1582 }
1583 
1584 /* unary function with a fallback */
1585 #define UNARY_FB(funcname, methodname, funcname_fb) \
1586 static PyObject *funcname(PyInstanceObject *self) { \
1587     static PyObject *o; \
1588     if (o == NULL) { o = PyString_InternFromString(methodname); \
1589                      if (o == NULL) return NULL; } \
1590     if (PyObject_HasAttr((PyObject*)self, o)) \
1591         return generic_unary_op(self, o); \
1592     else \
1593         return funcname_fb(self); \
1594 }
1595 
1596 #define BINARY(f, m, n) \
1597 static PyObject *f(PyObject *v, PyObject *w) { \
1598     return do_binop(v, w, "__" m "__", "__r" m "__", n); \
1599 }
1600 
1601 #define BINARY_INPLACE(f, m, n) \
1602 static PyObject *f(PyObject *v, PyObject *w) { \
1603     return do_binop_inplace(v, w, "__i" m "__", "__" m "__", \
1604                     "__r" m "__", n); \
1605 }
1606 
1607 UNARY(instance_neg, "__neg__")
1608 UNARY(instance_pos, "__pos__")
1609 UNARY(instance_abs, "__abs__")
1610 
1611 BINARY(instance_or, "or", PyNumber_Or)
1612 BINARY(instance_and, "and", PyNumber_And)
1613 BINARY(instance_xor, "xor", PyNumber_Xor)
1614 BINARY(instance_lshift, "lshift", PyNumber_Lshift)
1615 BINARY(instance_rshift, "rshift", PyNumber_Rshift)
1616 BINARY(instance_add, "add", PyNumber_Add)
1617 BINARY(instance_sub, "sub", PyNumber_Subtract)
1618 BINARY(instance_mul, "mul", PyNumber_Multiply)
1619 BINARY(instance_div, "div", PyNumber_Divide)
1620 BINARY(instance_mod, "mod", PyNumber_Remainder)
1621 BINARY(instance_divmod, "divmod", PyNumber_Divmod)
1622 BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide)
1623 BINARY(instance_truediv, "truediv", PyNumber_TrueDivide)
1624 
1625 BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr)
1626 BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor)
1627 BINARY_INPLACE(instance_iand, "and", PyNumber_InPlaceAnd)
1628 BINARY_INPLACE(instance_ilshift, "lshift", PyNumber_InPlaceLshift)
1629 BINARY_INPLACE(instance_irshift, "rshift", PyNumber_InPlaceRshift)
1630 BINARY_INPLACE(instance_iadd, "add", PyNumber_InPlaceAdd)
1631 BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract)
1632 BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply)
1633 BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide)
1634 BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder)
1635 BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide)
1636 BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide)
1637 
1638 /* Try a 3-way comparison, returning an int; v is an instance.  Return:
1639    -2 for an exception;
1640    -1 if v < w;
1641    0 if v == w;
1642    1 if v > w;
1643    2 if this particular 3-way comparison is not implemented or undefined.
1644 */
1645 static int
half_cmp(PyObject * v,PyObject * w)1646 half_cmp(PyObject *v, PyObject *w)
1647 {
1648     static PyObject *cmp_obj;
1649     PyObject *args;
1650     PyObject *cmp_func;
1651     PyObject *result;
1652     long l;
1653 
1654     assert(PyInstance_Check(v));
1655 
1656     if (cmp_obj == NULL) {
1657         cmp_obj = PyString_InternFromString("__cmp__");
1658         if (cmp_obj == NULL)
1659             return -2;
1660     }
1661 
1662     cmp_func = PyObject_GetAttr(v, cmp_obj);
1663     if (cmp_func == NULL) {
1664         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1665             return -2;
1666         PyErr_Clear();
1667         return 2;
1668     }
1669 
1670     args = PyTuple_Pack(1, w);
1671     if (args == NULL) {
1672         Py_DECREF(cmp_func);
1673         return -2;
1674     }
1675 
1676     result = PyEval_CallObject(cmp_func, args);
1677     Py_DECREF(args);
1678     Py_DECREF(cmp_func);
1679 
1680     if (result == NULL)
1681         return -2;
1682 
1683     if (result == Py_NotImplemented) {
1684         Py_DECREF(result);
1685         return 2;
1686     }
1687 
1688     l = PyInt_AsLong(result);
1689     Py_DECREF(result);
1690     if (l == -1 && PyErr_Occurred()) {
1691         PyErr_SetString(PyExc_TypeError,
1692                      "comparison did not return an int");
1693         return -2;
1694     }
1695 
1696     return l < 0 ? -1 : l > 0 ? 1 : 0;
1697 }
1698 
1699 /* Try a 3-way comparison, returning an int; either v or w is an instance.
1700    We first try a coercion.  Return:
1701    -2 for an exception;
1702    -1 if v < w;
1703    0 if v == w;
1704    1 if v > w;
1705    2 if this particular 3-way comparison is not implemented or undefined.
1706    THIS IS ONLY CALLED FROM object.c!
1707 */
1708 static int
instance_compare(PyObject * v,PyObject * w)1709 instance_compare(PyObject *v, PyObject *w)
1710 {
1711     int c;
1712 
1713     c = PyNumber_CoerceEx(&v, &w);
1714     if (c < 0)
1715         return -2;
1716     if (c == 0) {
1717         /* If neither is now an instance, use regular comparison */
1718         if (!PyInstance_Check(v) && !PyInstance_Check(w)) {
1719             c = PyObject_Compare(v, w);
1720             Py_DECREF(v);
1721             Py_DECREF(w);
1722             if (PyErr_Occurred())
1723                 return -2;
1724             return c < 0 ? -1 : c > 0 ? 1 : 0;
1725         }
1726     }
1727     else {
1728         /* The coercion didn't do anything.
1729            Treat this the same as returning v and w unchanged. */
1730         Py_INCREF(v);
1731         Py_INCREF(w);
1732     }
1733 
1734     if (PyInstance_Check(v)) {
1735         c = half_cmp(v, w);
1736         if (c <= 1) {
1737             Py_DECREF(v);
1738             Py_DECREF(w);
1739             return c;
1740         }
1741     }
1742     if (PyInstance_Check(w)) {
1743         c = half_cmp(w, v);
1744         if (c <= 1) {
1745             Py_DECREF(v);
1746             Py_DECREF(w);
1747             if (c >= -1)
1748                 c = -c;
1749             return c;
1750         }
1751     }
1752     Py_DECREF(v);
1753     Py_DECREF(w);
1754     return 2;
1755 }
1756 
1757 static int
instance_nonzero(PyInstanceObject * self)1758 instance_nonzero(PyInstanceObject *self)
1759 {
1760     PyObject *func, *res;
1761     long outcome;
1762     static PyObject *nonzerostr;
1763 
1764     if (nonzerostr == NULL) {
1765         nonzerostr = PyString_InternFromString("__nonzero__");
1766         if (nonzerostr == NULL)
1767             return -1;
1768     }
1769     if ((func = instance_getattr(self, nonzerostr)) == NULL) {
1770         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1771             return -1;
1772         PyErr_Clear();
1773         if (lenstr == NULL) {
1774             lenstr = PyString_InternFromString("__len__");
1775             if (lenstr == NULL)
1776                 return -1;
1777         }
1778         if ((func = instance_getattr(self, lenstr)) == NULL) {
1779             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1780                 return -1;
1781             PyErr_Clear();
1782             /* Fall back to the default behavior:
1783                all instances are nonzero */
1784             return 1;
1785         }
1786     }
1787     res = PyEval_CallObject(func, (PyObject *)NULL);
1788     Py_DECREF(func);
1789     if (res == NULL)
1790         return -1;
1791     if (!PyInt_Check(res)) {
1792         Py_DECREF(res);
1793         PyErr_SetString(PyExc_TypeError,
1794                         "__nonzero__ should return an int");
1795         return -1;
1796     }
1797     outcome = PyInt_AsLong(res);
1798     Py_DECREF(res);
1799     if (outcome < 0) {
1800         PyErr_SetString(PyExc_ValueError,
1801                         "__nonzero__ should return >= 0");
1802         return -1;
1803     }
1804     return outcome > 0;
1805 }
1806 
1807 static PyObject *
instance_index(PyInstanceObject * self)1808 instance_index(PyInstanceObject *self)
1809 {
1810     PyObject *func, *res;
1811     static PyObject *indexstr = NULL;
1812 
1813     if (indexstr == NULL) {
1814         indexstr = PyString_InternFromString("__index__");
1815         if (indexstr == NULL)
1816             return NULL;
1817     }
1818     if ((func = instance_getattr(self, indexstr)) == NULL) {
1819         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1820             return NULL;
1821         PyErr_Clear();
1822         PyErr_SetString(PyExc_TypeError,
1823                         "object cannot be interpreted as an index");
1824         return NULL;
1825     }
1826     res = PyEval_CallObject(func, (PyObject *)NULL);
1827     Py_DECREF(func);
1828     return res;
1829 }
1830 
1831 
1832 UNARY(instance_invert, "__invert__")
1833 UNARY(_instance_trunc, "__trunc__")
1834 
1835 static PyObject *
instance_int(PyInstanceObject * self)1836 instance_int(PyInstanceObject *self)
1837 {
1838     PyObject *truncated;
1839     static PyObject *int_name;
1840     if (int_name == NULL) {
1841         int_name = PyString_InternFromString("__int__");
1842         if (int_name == NULL)
1843             return NULL;
1844     }
1845     if (PyObject_HasAttr((PyObject*)self, int_name))
1846         return generic_unary_op(self, int_name);
1847 
1848     truncated = _instance_trunc(self);
1849     /* __trunc__ is specified to return an Integral type, but
1850        int() needs to return an int. */
1851     return _PyNumber_ConvertIntegralToInt(
1852         truncated,
1853         "__trunc__ returned non-Integral (type %.200s)");
1854 }
1855 
1856 UNARY_FB(instance_long, "__long__", instance_int)
1857 UNARY(instance_float, "__float__")
1858 UNARY(instance_oct, "__oct__")
1859 UNARY(instance_hex, "__hex__")
1860 
1861 static PyObject *
bin_power(PyObject * v,PyObject * w)1862 bin_power(PyObject *v, PyObject *w)
1863 {
1864     return PyNumber_Power(v, w, Py_None);
1865 }
1866 
1867 /* This version is for ternary calls only (z != None) */
1868 static PyObject *
instance_pow(PyObject * v,PyObject * w,PyObject * z)1869 instance_pow(PyObject *v, PyObject *w, PyObject *z)
1870 {
1871     if (z == Py_None) {
1872         return do_binop(v, w, "__pow__", "__rpow__", bin_power);
1873     }
1874     else {
1875         PyObject *func;
1876         PyObject *args;
1877         PyObject *result;
1878 
1879         /* XXX Doesn't do coercions... */
1880         func = PyObject_GetAttrString(v, "__pow__");
1881         if (func == NULL)
1882             return NULL;
1883         args = PyTuple_Pack(2, w, z);
1884         if (args == NULL) {
1885             Py_DECREF(func);
1886             return NULL;
1887         }
1888         result = PyEval_CallObject(func, args);
1889         Py_DECREF(func);
1890         Py_DECREF(args);
1891         return result;
1892     }
1893 }
1894 
1895 static PyObject *
bin_inplace_power(PyObject * v,PyObject * w)1896 bin_inplace_power(PyObject *v, PyObject *w)
1897 {
1898     return PyNumber_InPlacePower(v, w, Py_None);
1899 }
1900 
1901 
1902 static PyObject *
instance_ipow(PyObject * v,PyObject * w,PyObject * z)1903 instance_ipow(PyObject *v, PyObject *w, PyObject *z)
1904 {
1905     if (z == Py_None) {
1906         return do_binop_inplace(v, w, "__ipow__", "__pow__",
1907             "__rpow__", bin_inplace_power);
1908     }
1909     else {
1910         /* XXX Doesn't do coercions... */
1911         PyObject *func;
1912         PyObject *args;
1913         PyObject *result;
1914 
1915         func = PyObject_GetAttrString(v, "__ipow__");
1916         if (func == NULL) {
1917             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1918                 return NULL;
1919             PyErr_Clear();
1920             return instance_pow(v, w, z);
1921         }
1922         args = PyTuple_Pack(2, w, z);
1923         if (args == NULL) {
1924             Py_DECREF(func);
1925             return NULL;
1926         }
1927         result = PyEval_CallObject(func, args);
1928         Py_DECREF(func);
1929         Py_DECREF(args);
1930         return result;
1931     }
1932 }
1933 
1934 
1935 /* Map rich comparison operators to their __xx__ namesakes */
1936 #define NAME_OPS 6
1937 static PyObject **name_op = NULL;
1938 
1939 static int
init_name_op(void)1940 init_name_op(void)
1941 {
1942     int i;
1943     char *_name_op[] = {
1944         "__lt__",
1945         "__le__",
1946         "__eq__",
1947         "__ne__",
1948         "__gt__",
1949         "__ge__",
1950     };
1951 
1952     name_op = (PyObject **)malloc(sizeof(PyObject *) * NAME_OPS);
1953     if (name_op == NULL)
1954         return -1;
1955     for (i = 0; i < NAME_OPS; ++i) {
1956         name_op[i] = PyString_InternFromString(_name_op[i]);
1957         if (name_op[i] == NULL)
1958             return -1;
1959     }
1960     return 0;
1961 }
1962 
1963 static PyObject *
half_richcompare(PyObject * v,PyObject * w,int op)1964 half_richcompare(PyObject *v, PyObject *w, int op)
1965 {
1966     PyObject *method;
1967     PyObject *args;
1968     PyObject *res;
1969 
1970     assert(PyInstance_Check(v));
1971 
1972     if (name_op == NULL) {
1973         if (init_name_op() < 0)
1974             return NULL;
1975     }
1976     /* If the instance doesn't define an __getattr__ method, use
1977        instance_getattr2 directly because it will not set an
1978        exception on failure. */
1979     if (((PyInstanceObject *)v)->in_class->cl_getattr == NULL)
1980         method = instance_getattr2((PyInstanceObject *)v,
1981                                    name_op[op]);
1982     else
1983         method = PyObject_GetAttr(v, name_op[op]);
1984     if (method == NULL) {
1985         if (PyErr_Occurred()) {
1986             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
1987                 return NULL;
1988             PyErr_Clear();
1989         }
1990         res = Py_NotImplemented;
1991         Py_INCREF(res);
1992         return res;
1993     }
1994 
1995     args = PyTuple_Pack(1, w);
1996     if (args == NULL) {
1997         Py_DECREF(method);
1998         return NULL;
1999     }
2000 
2001     res = PyEval_CallObject(method, args);
2002     Py_DECREF(args);
2003     Py_DECREF(method);
2004 
2005     return res;
2006 }
2007 
2008 static PyObject *
instance_richcompare(PyObject * v,PyObject * w,int op)2009 instance_richcompare(PyObject *v, PyObject *w, int op)
2010 {
2011     PyObject *res;
2012 
2013     if (PyInstance_Check(v)) {
2014         res = half_richcompare(v, w, op);
2015         if (res != Py_NotImplemented)
2016             return res;
2017         Py_DECREF(res);
2018     }
2019 
2020     if (PyInstance_Check(w)) {
2021         res = half_richcompare(w, v, _Py_SwappedOp[op]);
2022         if (res != Py_NotImplemented)
2023             return res;
2024         Py_DECREF(res);
2025     }
2026 
2027     Py_INCREF(Py_NotImplemented);
2028     return Py_NotImplemented;
2029 }
2030 
2031 
2032 /* Get the iterator */
2033 static PyObject *
instance_getiter(PyInstanceObject * self)2034 instance_getiter(PyInstanceObject *self)
2035 {
2036     PyObject *func;
2037 
2038     if (iterstr == NULL) {
2039         iterstr = PyString_InternFromString("__iter__");
2040         if (iterstr == NULL)
2041             return NULL;
2042     }
2043     if (getitemstr == NULL) {
2044         getitemstr = PyString_InternFromString("__getitem__");
2045         if (getitemstr == NULL)
2046             return NULL;
2047     }
2048 
2049     if ((func = instance_getattr(self, iterstr)) != NULL) {
2050         PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2051         Py_DECREF(func);
2052         if (res != NULL && !PyIter_Check(res)) {
2053             PyErr_Format(PyExc_TypeError,
2054                          "__iter__ returned non-iterator "
2055                          "of type '%.100s'",
2056                          res->ob_type->tp_name);
2057             Py_DECREF(res);
2058             res = NULL;
2059         }
2060         return res;
2061     }
2062     if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2063         return NULL;
2064     PyErr_Clear();
2065     if ((func = instance_getattr(self, getitemstr)) == NULL) {
2066         PyErr_SetString(PyExc_TypeError,
2067                         "iteration over non-sequence");
2068         return NULL;
2069     }
2070     Py_DECREF(func);
2071     return PySeqIter_New((PyObject *)self);
2072 }
2073 
2074 
2075 /* Call the iterator's next */
2076 static PyObject *
instance_iternext(PyInstanceObject * self)2077 instance_iternext(PyInstanceObject *self)
2078 {
2079     PyObject *func;
2080 
2081     if (nextstr == NULL) {
2082         nextstr = PyString_InternFromString("next");
2083         if (nextstr == NULL)
2084             return NULL;
2085     }
2086 
2087     if ((func = instance_getattr(self, nextstr)) != NULL) {
2088         PyObject *res = PyEval_CallObject(func, (PyObject *)NULL);
2089         Py_DECREF(func);
2090         if (res != NULL) {
2091             return res;
2092         }
2093         if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
2094             PyErr_Clear();
2095             return NULL;
2096         }
2097         return NULL;
2098     }
2099     PyErr_SetString(PyExc_TypeError, "instance has no next() method");
2100     return NULL;
2101 }
2102 
2103 static PyObject *
instance_call(PyObject * func,PyObject * arg,PyObject * kw)2104 instance_call(PyObject *func, PyObject *arg, PyObject *kw)
2105 {
2106     PyObject *res, *call = PyObject_GetAttrString(func, "__call__");
2107     if (call == NULL) {
2108         PyInstanceObject *inst = (PyInstanceObject*) func;
2109         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2110             return NULL;
2111         PyErr_Clear();
2112         PyErr_Format(PyExc_AttributeError,
2113                      "%.200s instance has no __call__ method",
2114                      PyString_AsString(inst->in_class->cl_name));
2115         return NULL;
2116     }
2117     /* We must check and increment the recursion depth here. Scenario:
2118            class A:
2119            pass
2120            A.__call__ = A() # that's right
2121            a = A() # ok
2122            a() # infinite recursion
2123        This bounces between instance_call() and PyObject_Call() without
2124        ever hitting eval_frame() (which has the main recursion check). */
2125     if (Py_EnterRecursiveCall(" in __call__")) {
2126         res = NULL;
2127     }
2128     else {
2129         res = PyObject_Call(call, arg, kw);
2130         Py_LeaveRecursiveCall();
2131     }
2132     Py_DECREF(call);
2133     return res;
2134 }
2135 
2136 
2137 static PyNumberMethods instance_as_number = {
2138     instance_add,                       /* nb_add */
2139     instance_sub,                       /* nb_subtract */
2140     instance_mul,                       /* nb_multiply */
2141     instance_div,                       /* nb_divide */
2142     instance_mod,                       /* nb_remainder */
2143     instance_divmod,                    /* nb_divmod */
2144     instance_pow,                       /* nb_power */
2145     (unaryfunc)instance_neg,            /* nb_negative */
2146     (unaryfunc)instance_pos,            /* nb_positive */
2147     (unaryfunc)instance_abs,            /* nb_absolute */
2148     (inquiry)instance_nonzero,          /* nb_nonzero */
2149     (unaryfunc)instance_invert,         /* nb_invert */
2150     instance_lshift,                    /* nb_lshift */
2151     instance_rshift,                    /* nb_rshift */
2152     instance_and,                       /* nb_and */
2153     instance_xor,                       /* nb_xor */
2154     instance_or,                        /* nb_or */
2155     instance_coerce,                    /* nb_coerce */
2156     (unaryfunc)instance_int,            /* nb_int */
2157     (unaryfunc)instance_long,           /* nb_long */
2158     (unaryfunc)instance_float,          /* nb_float */
2159     (unaryfunc)instance_oct,            /* nb_oct */
2160     (unaryfunc)instance_hex,            /* nb_hex */
2161     instance_iadd,                      /* nb_inplace_add */
2162     instance_isub,                      /* nb_inplace_subtract */
2163     instance_imul,                      /* nb_inplace_multiply */
2164     instance_idiv,                      /* nb_inplace_divide */
2165     instance_imod,                      /* nb_inplace_remainder */
2166     instance_ipow,                      /* nb_inplace_power */
2167     instance_ilshift,                   /* nb_inplace_lshift */
2168     instance_irshift,                   /* nb_inplace_rshift */
2169     instance_iand,                      /* nb_inplace_and */
2170     instance_ixor,                      /* nb_inplace_xor */
2171     instance_ior,                       /* nb_inplace_or */
2172     instance_floordiv,                  /* nb_floor_divide */
2173     instance_truediv,                   /* nb_true_divide */
2174     instance_ifloordiv,                 /* nb_inplace_floor_divide */
2175     instance_itruediv,                  /* nb_inplace_true_divide */
2176     (unaryfunc)instance_index,          /* nb_index */
2177 };
2178 
2179 PyTypeObject PyInstance_Type = {
2180     PyObject_HEAD_INIT(&PyType_Type)
2181     0,
2182     "instance",
2183     sizeof(PyInstanceObject),
2184     0,
2185     (destructor)instance_dealloc,               /* tp_dealloc */
2186     0,                                          /* tp_print */
2187     0,                                          /* tp_getattr */
2188     0,                                          /* tp_setattr */
2189     instance_compare,                           /* tp_compare */
2190     (reprfunc)instance_repr,                    /* tp_repr */
2191     &instance_as_number,                        /* tp_as_number */
2192     &instance_as_sequence,                      /* tp_as_sequence */
2193     &instance_as_mapping,                       /* tp_as_mapping */
2194     (hashfunc)instance_hash,                    /* tp_hash */
2195     instance_call,                              /* tp_call */
2196     (reprfunc)instance_str,                     /* tp_str */
2197     (getattrofunc)instance_getattr,             /* tp_getattro */
2198     (setattrofunc)instance_setattr,             /* tp_setattro */
2199     0,                                          /* tp_as_buffer */
2200     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_CHECKTYPES,/*tp_flags*/
2201     instance_doc,                               /* tp_doc */
2202     (traverseproc)instance_traverse,            /* tp_traverse */
2203     0,                                          /* tp_clear */
2204     instance_richcompare,                       /* tp_richcompare */
2205     offsetof(PyInstanceObject, in_weakreflist), /* tp_weaklistoffset */
2206     (getiterfunc)instance_getiter,              /* tp_iter */
2207     (iternextfunc)instance_iternext,            /* tp_iternext */
2208     0,                                          /* tp_methods */
2209     0,                                          /* tp_members */
2210     0,                                          /* tp_getset */
2211     0,                                          /* tp_base */
2212     0,                                          /* tp_dict */
2213     0,                                          /* tp_descr_get */
2214     0,                                          /* tp_descr_set */
2215     0,                                          /* tp_dictoffset */
2216     0,                                          /* tp_init */
2217     0,                                          /* tp_alloc */
2218     instance_new,                               /* tp_new */
2219 };
2220 
2221 
2222 /* Instance method objects are used for two purposes:
2223    (a) as bound instance methods (returned by instancename.methodname)
2224    (b) as unbound methods (returned by ClassName.methodname)
2225    In case (b), im_self is NULL
2226 */
2227 
2228 PyObject *
PyMethod_New(PyObject * func,PyObject * self,PyObject * klass)2229 PyMethod_New(PyObject *func, PyObject *self, PyObject *klass)
2230 {
2231     register PyMethodObject *im;
2232     im = free_list;
2233     if (im != NULL) {
2234         free_list = (PyMethodObject *)(im->im_self);
2235         PyObject_INIT(im, &PyMethod_Type);
2236         numfree--;
2237     }
2238     else {
2239         im = PyObject_GC_New(PyMethodObject, &PyMethod_Type);
2240         if (im == NULL)
2241             return NULL;
2242     }
2243     im->im_weakreflist = NULL;
2244     Py_INCREF(func);
2245     im->im_func = func;
2246     Py_XINCREF(self);
2247     im->im_self = self;
2248     Py_XINCREF(klass);
2249     im->im_class = klass;
2250     _PyObject_GC_TRACK(im);
2251     return (PyObject *)im;
2252 }
2253 
2254 /* Descriptors for PyMethod attributes */
2255 
2256 /* im_class, im_func and im_self are stored in the PyMethod object */
2257 
2258 #define OFF(x) offsetof(PyMethodObject, x)
2259 
2260 static PyMemberDef instancemethod_memberlist[] = {
2261     {"im_class",        T_OBJECT,       OFF(im_class),  READONLY|RESTRICTED,
2262      "the class associated with a method"},
2263     {"im_func",         T_OBJECT,       OFF(im_func),   READONLY|RESTRICTED,
2264      "the function (or other callable) implementing a method"},
2265     {"__func__",        T_OBJECT,       OFF(im_func),   READONLY|RESTRICTED,
2266      "the function (or other callable) implementing a method"},
2267     {"im_self",         T_OBJECT,       OFF(im_self),   READONLY|RESTRICTED,
2268      "the instance to which a method is bound; None for unbound methods"},
2269     {"__self__",        T_OBJECT,       OFF(im_self),   READONLY|RESTRICTED,
2270      "the instance to which a method is bound; None for unbound methods"},
2271     {NULL}      /* Sentinel */
2272 };
2273 
2274 /* Christian Tismer argued convincingly that method attributes should
2275    (nearly) always override function attributes.
2276    The one exception is __doc__; there's a default __doc__ which
2277    should only be used for the class, not for instances */
2278 
2279 static PyObject *
instancemethod_get_doc(PyMethodObject * im,void * context)2280 instancemethod_get_doc(PyMethodObject *im, void *context)
2281 {
2282     static PyObject *docstr;
2283     if (docstr == NULL) {
2284         docstr= PyString_InternFromString("__doc__");
2285         if (docstr == NULL)
2286             return NULL;
2287     }
2288     return PyObject_GetAttr(im->im_func, docstr);
2289 }
2290 
2291 static PyGetSetDef instancemethod_getset[] = {
2292     {"__doc__", (getter)instancemethod_get_doc, NULL, NULL},
2293     {0}
2294 };
2295 
2296 static PyObject *
instancemethod_getattro(PyObject * obj,PyObject * name)2297 instancemethod_getattro(PyObject *obj, PyObject *name)
2298 {
2299     PyMethodObject *im = (PyMethodObject *)obj;
2300     PyTypeObject *tp = obj->ob_type;
2301     PyObject *descr = NULL;
2302 
2303     if (PyType_HasFeature(tp, Py_TPFLAGS_HAVE_CLASS)) {
2304         if (tp->tp_dict == NULL) {
2305             if (PyType_Ready(tp) < 0)
2306                 return NULL;
2307         }
2308         descr = _PyType_Lookup(tp, name);
2309     }
2310 
2311     if (descr != NULL) {
2312         descrgetfunc f = TP_DESCR_GET(descr->ob_type);
2313         if (f != NULL)
2314             return f(descr, obj, (PyObject *)obj->ob_type);
2315         else {
2316             Py_INCREF(descr);
2317             return descr;
2318         }
2319     }
2320 
2321     return PyObject_GetAttr(im->im_func, name);
2322 }
2323 
2324 PyDoc_STRVAR(instancemethod_doc,
2325 "instancemethod(function, instance, class)\n\
2326 \n\
2327 Create an instance method object.");
2328 
2329 static PyObject *
instancemethod_new(PyTypeObject * type,PyObject * args,PyObject * kw)2330 instancemethod_new(PyTypeObject* type, PyObject* args, PyObject *kw)
2331 {
2332     PyObject *func;
2333     PyObject *self;
2334     PyObject *classObj = NULL;
2335 
2336     if (!_PyArg_NoKeywords("instancemethod", kw))
2337         return NULL;
2338     if (!PyArg_UnpackTuple(args, "instancemethod", 2, 3,
2339                           &func, &self, &classObj))
2340         return NULL;
2341     if (!PyCallable_Check(func)) {
2342         PyErr_SetString(PyExc_TypeError,
2343                         "first argument must be callable");
2344         return NULL;
2345     }
2346     if (self == Py_None)
2347         self = NULL;
2348     if (self == NULL && classObj == NULL) {
2349         PyErr_SetString(PyExc_TypeError,
2350             "unbound methods must have non-NULL im_class");
2351         return NULL;
2352     }
2353 
2354     return PyMethod_New(func, self, classObj);
2355 }
2356 
2357 static void
instancemethod_dealloc(register PyMethodObject * im)2358 instancemethod_dealloc(register PyMethodObject *im)
2359 {
2360     _PyObject_GC_UNTRACK(im);
2361     if (im->im_weakreflist != NULL)
2362         PyObject_ClearWeakRefs((PyObject *)im);
2363     Py_DECREF(im->im_func);
2364     Py_XDECREF(im->im_self);
2365     Py_XDECREF(im->im_class);
2366     if (numfree < PyMethod_MAXFREELIST) {
2367         im->im_self = (PyObject *)free_list;
2368         free_list = im;
2369         numfree++;
2370     }
2371     else {
2372         PyObject_GC_Del(im);
2373     }
2374 }
2375 
2376 static int
instancemethod_compare(PyMethodObject * a,PyMethodObject * b)2377 instancemethod_compare(PyMethodObject *a, PyMethodObject *b)
2378 {
2379     int cmp;
2380     cmp = PyObject_Compare(a->im_func, b->im_func);
2381     if (cmp)
2382         return cmp;
2383 
2384     if (a->im_self == b->im_self)
2385         return 0;
2386     if (a->im_self == NULL || b->im_self == NULL)
2387         return (a->im_self < b->im_self) ? -1 : 1;
2388     else
2389         return PyObject_Compare(a->im_self, b->im_self);
2390 }
2391 
2392 static PyObject *
instancemethod_repr(PyMethodObject * a)2393 instancemethod_repr(PyMethodObject *a)
2394 {
2395     PyObject *self = a->im_self;
2396     PyObject *func = a->im_func;
2397     PyObject *klass = a->im_class;
2398     PyObject *funcname = NULL, *klassname = NULL, *result = NULL;
2399     char *sfuncname = "?", *sklassname = "?";
2400 
2401     funcname = PyObject_GetAttrString(func, "__name__");
2402     if (funcname == NULL) {
2403         if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2404             return NULL;
2405         PyErr_Clear();
2406     }
2407     else if (!PyString_Check(funcname)) {
2408         Py_DECREF(funcname);
2409         funcname = NULL;
2410     }
2411     else
2412         sfuncname = PyString_AS_STRING(funcname);
2413     if (klass == NULL)
2414         klassname = NULL;
2415     else {
2416         klassname = PyObject_GetAttrString(klass, "__name__");
2417         if (klassname == NULL) {
2418             if (!PyErr_ExceptionMatches(PyExc_AttributeError))
2419                 return NULL;
2420             PyErr_Clear();
2421         }
2422         else if (!PyString_Check(klassname)) {
2423             Py_DECREF(klassname);
2424             klassname = NULL;
2425         }
2426         else
2427             sklassname = PyString_AS_STRING(klassname);
2428     }
2429     if (self == NULL)
2430         result = PyString_FromFormat("<unbound method %s.%s>",
2431                                      sklassname, sfuncname);
2432     else {
2433         /* XXX Shouldn't use repr() here! */
2434         PyObject *selfrepr = PyObject_Repr(self);
2435         if (selfrepr == NULL)
2436             goto fail;
2437         if (!PyString_Check(selfrepr)) {
2438             Py_DECREF(selfrepr);
2439             goto fail;
2440         }
2441         result = PyString_FromFormat("<bound method %s.%s of %s>",
2442                                      sklassname, sfuncname,
2443                                      PyString_AS_STRING(selfrepr));
2444         Py_DECREF(selfrepr);
2445     }
2446   fail:
2447     Py_XDECREF(funcname);
2448     Py_XDECREF(klassname);
2449     return result;
2450 }
2451 
2452 static long
instancemethod_hash(PyMethodObject * a)2453 instancemethod_hash(PyMethodObject *a)
2454 {
2455     long x, y;
2456     if (a->im_self == NULL)
2457         x = PyObject_Hash(Py_None);
2458     else
2459         x = PyObject_Hash(a->im_self);
2460     if (x == -1)
2461         return -1;
2462     y = PyObject_Hash(a->im_func);
2463     if (y == -1)
2464         return -1;
2465     x = x ^ y;
2466     if (x == -1)
2467         x = -2;
2468     return x;
2469 }
2470 
2471 static int
instancemethod_traverse(PyMethodObject * im,visitproc visit,void * arg)2472 instancemethod_traverse(PyMethodObject *im, visitproc visit, void *arg)
2473 {
2474     Py_VISIT(im->im_func);
2475     Py_VISIT(im->im_self);
2476     Py_VISIT(im->im_class);
2477     return 0;
2478 }
2479 
2480 static void
getclassname(PyObject * klass,char * buf,int bufsize)2481 getclassname(PyObject *klass, char *buf, int bufsize)
2482 {
2483     PyObject *name;
2484 
2485     assert(bufsize > 1);
2486     strcpy(buf, "?"); /* Default outcome */
2487     if (klass == NULL)
2488         return;
2489     name = PyObject_GetAttrString(klass, "__name__");
2490     if (name == NULL) {
2491         /* This function cannot return an exception */
2492         PyErr_Clear();
2493         return;
2494     }
2495     if (PyString_Check(name)) {
2496         strncpy(buf, PyString_AS_STRING(name), bufsize);
2497         buf[bufsize-1] = '\0';
2498     }
2499     Py_DECREF(name);
2500 }
2501 
2502 static void
getinstclassname(PyObject * inst,char * buf,int bufsize)2503 getinstclassname(PyObject *inst, char *buf, int bufsize)
2504 {
2505     PyObject *klass;
2506 
2507     if (inst == NULL) {
2508         assert(bufsize > 0 && (size_t)bufsize > strlen("nothing"));
2509         strcpy(buf, "nothing");
2510         return;
2511     }
2512 
2513     klass = PyObject_GetAttrString(inst, "__class__");
2514     if (klass == NULL) {
2515         /* This function cannot return an exception */
2516         PyErr_Clear();
2517         klass = (PyObject *)(inst->ob_type);
2518         Py_INCREF(klass);
2519     }
2520     getclassname(klass, buf, bufsize);
2521     Py_XDECREF(klass);
2522 }
2523 
2524 static PyObject *
instancemethod_call(PyObject * func,PyObject * arg,PyObject * kw)2525 instancemethod_call(PyObject *func, PyObject *arg, PyObject *kw)
2526 {
2527     PyObject *self = PyMethod_GET_SELF(func);
2528     PyObject *klass = PyMethod_GET_CLASS(func);
2529     PyObject *result;
2530 
2531     func = PyMethod_GET_FUNCTION(func);
2532     if (self == NULL) {
2533         /* Unbound methods must be called with an instance of
2534            the class (or a derived class) as first argument */
2535         int ok;
2536         if (PyTuple_Size(arg) >= 1)
2537             self = PyTuple_GET_ITEM(arg, 0);
2538         if (self == NULL)
2539             ok = 0;
2540         else {
2541             ok = PyObject_IsInstance(self, klass);
2542             if (ok < 0)
2543                 return NULL;
2544         }
2545         if (!ok) {
2546             char clsbuf[256];
2547             char instbuf[256];
2548             getclassname(klass, clsbuf, sizeof(clsbuf));
2549             getinstclassname(self, instbuf, sizeof(instbuf));
2550             PyErr_Format(PyExc_TypeError,
2551                          "unbound method %s%s must be called with "
2552                          "%s instance as first argument "
2553                          "(got %s%s instead)",
2554                          PyEval_GetFuncName(func),
2555                          PyEval_GetFuncDesc(func),
2556                          clsbuf,
2557                          instbuf,
2558                          self == NULL ? "" : " instance");
2559             return NULL;
2560         }
2561         Py_INCREF(arg);
2562     }
2563     else {
2564         Py_ssize_t argcount = PyTuple_Size(arg);
2565         PyObject *newarg = PyTuple_New(argcount + 1);
2566         int i;
2567         if (newarg == NULL)
2568             return NULL;
2569         Py_INCREF(self);
2570         PyTuple_SET_ITEM(newarg, 0, self);
2571         for (i = 0; i < argcount; i++) {
2572             PyObject *v = PyTuple_GET_ITEM(arg, i);
2573             Py_XINCREF(v);
2574             PyTuple_SET_ITEM(newarg, i+1, v);
2575         }
2576         arg = newarg;
2577     }
2578     result = PyObject_Call((PyObject *)func, arg, kw);
2579     Py_DECREF(arg);
2580     return result;
2581 }
2582 
2583 static PyObject *
instancemethod_descr_get(PyObject * meth,PyObject * obj,PyObject * cls)2584 instancemethod_descr_get(PyObject *meth, PyObject *obj, PyObject *cls)
2585 {
2586     /* Don't rebind an already bound method, or an unbound method
2587        of a class that's not a base class of cls. */
2588 
2589     if (PyMethod_GET_SELF(meth) != NULL) {
2590         /* Already bound */
2591         Py_INCREF(meth);
2592         return meth;
2593     }
2594     /* No, it is an unbound method */
2595     if (PyMethod_GET_CLASS(meth) != NULL && cls != NULL) {
2596         /* Do subclass test.  If it fails, return meth unchanged. */
2597         int ok = PyObject_IsSubclass(cls, PyMethod_GET_CLASS(meth));
2598         if (ok < 0)
2599             return NULL;
2600         if (!ok) {
2601             Py_INCREF(meth);
2602             return meth;
2603         }
2604     }
2605     /* Bind it to obj */
2606     return PyMethod_New(PyMethod_GET_FUNCTION(meth), obj, cls);
2607 }
2608 
2609 PyTypeObject PyMethod_Type = {
2610     PyObject_HEAD_INIT(&PyType_Type)
2611     0,
2612     "instancemethod",
2613     sizeof(PyMethodObject),
2614     0,
2615     (destructor)instancemethod_dealloc,         /* tp_dealloc */
2616     0,                                          /* tp_print */
2617     0,                                          /* tp_getattr */
2618     0,                                          /* tp_setattr */
2619     (cmpfunc)instancemethod_compare,            /* tp_compare */
2620     (reprfunc)instancemethod_repr,              /* tp_repr */
2621     0,                                          /* tp_as_number */
2622     0,                                          /* tp_as_sequence */
2623     0,                                          /* tp_as_mapping */
2624     (hashfunc)instancemethod_hash,              /* tp_hash */
2625     instancemethod_call,                        /* tp_call */
2626     0,                                          /* tp_str */
2627     instancemethod_getattro,                    /* tp_getattro */
2628     PyObject_GenericSetAttr,                    /* tp_setattro */
2629     0,                                          /* tp_as_buffer */
2630     Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC  | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
2631     instancemethod_doc,                         /* tp_doc */
2632     (traverseproc)instancemethod_traverse,      /* tp_traverse */
2633     0,                                          /* tp_clear */
2634     0,                                          /* tp_richcompare */
2635     offsetof(PyMethodObject, im_weakreflist), /* tp_weaklistoffset */
2636     0,                                          /* tp_iter */
2637     0,                                          /* tp_iternext */
2638     0,                                          /* tp_methods */
2639     instancemethod_memberlist,                  /* tp_members */
2640     instancemethod_getset,                      /* tp_getset */
2641     0,                                          /* tp_base */
2642     0,                                          /* tp_dict */
2643     instancemethod_descr_get,                   /* tp_descr_get */
2644     0,                                          /* tp_descr_set */
2645     0,                                          /* tp_dictoffset */
2646     0,                                          /* tp_init */
2647     0,                                          /* tp_alloc */
2648     instancemethod_new,                         /* tp_new */
2649 };
2650 
2651 /* Clear out the free list */
2652 
2653 int
PyMethod_ClearFreeList(void)2654 PyMethod_ClearFreeList(void)
2655 {
2656     int freelist_size = numfree;
2657 
2658     while (free_list) {
2659         PyMethodObject *im = free_list;
2660         free_list = (PyMethodObject *)(im->im_self);
2661         PyObject_GC_Del(im);
2662         numfree--;
2663     }
2664     assert(numfree == 0);
2665     return freelist_size;
2666 }
2667 
2668 void
PyMethod_Fini(void)2669 PyMethod_Fini(void)
2670 {
2671     (void)PyMethod_ClearFreeList();
2672 }
2673