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