blob: 8f48b39c78987762d8c9b367e72bd69559b24bbd [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002/* Type object implementation */
3
Guido van Rossumc0b618a1997-05-02 03:12:38 +00004#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00005#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Tim Peters6d6c1a32001-08-02 04:15:00 +00007static struct memberlist type_members[] = {
8 {"__name__", T_STRING, offsetof(PyTypeObject, tp_name), READONLY},
9 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
10 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
11 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
12 {"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY},
13 {"__weaklistoffset__", T_LONG,
14 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
15 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
16 {"__dictoffset__", T_LONG,
17 offsetof(PyTypeObject, tp_dictoffset), READONLY},
18 {"__bases__", T_OBJECT, offsetof(PyTypeObject, tp_bases), READONLY},
19 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
20 {0}
21};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022
Guido van Rossumc0b618a1997-05-02 03:12:38 +000023static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000024type_module(PyTypeObject *type, void *context)
Guido van Rossum29ca26e1995-01-07 11:58:15 +000025{
Tim Peters6d6c1a32001-08-02 04:15:00 +000026 return PyString_FromString("__builtin__");
27}
28
29static PyObject *
30type_dict(PyTypeObject *type, void *context)
31{
32 if (type->tp_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000033 Py_INCREF(Py_None);
34 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +000035 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000036 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
37 Py_INCREF(type->tp_dict);
38 return type->tp_dict;
39 }
40 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +000041}
42
Tim Peters6d6c1a32001-08-02 04:15:00 +000043static PyObject *
44type_defined(PyTypeObject *type, void *context)
45{
46 if (type->tp_defined == NULL) {
47 Py_INCREF(Py_None);
48 return Py_None;
49 }
50 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
51 Py_INCREF(type->tp_defined);
52 return type->tp_defined;
53 }
54 return PyDictProxy_New(type->tp_defined);
55}
56
57static PyObject *
58type_dynamic(PyTypeObject *type, void *context)
59{
60 PyObject *res;
61
62 res = (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE) ? Py_True : Py_False;
63 Py_INCREF(res);
64 return res;
65}
66
67struct getsetlist type_getsets[] = {
68 {"__module__", (getter)type_module, NULL, NULL},
69 {"__dict__", (getter)type_dict, NULL, NULL},
70 {"__defined__", (getter)type_defined, NULL, NULL},
71 {"__dynamic__", (getter)type_dynamic, NULL, NULL},
72 {0}
73};
74
Martin v. Löwis0163d6d2001-06-09 07:34:05 +000075static int
76type_compare(PyObject *v, PyObject *w)
77{
78 /* This is called with type objects only. So we
79 can just compare the addresses. */
80 Py_uintptr_t vv = (Py_uintptr_t)v;
81 Py_uintptr_t ww = (Py_uintptr_t)w;
82 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
83}
84
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000086type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000087{
88 char buf[100];
Tim Peters6d6c1a32001-08-02 04:15:00 +000089 sprintf(buf, "<type '%.80s'>", type->tp_name);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000090 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091}
92
Tim Peters6d6c1a32001-08-02 04:15:00 +000093static PyObject *
94type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
95{
96 PyObject *obj;
97
98 if (type->tp_new == NULL) {
99 PyErr_Format(PyExc_TypeError,
100 "cannot create '%.100s' instances",
101 type->tp_name);
102 return NULL;
103 }
104
105 obj = type->tp_new(type, args, NULL);
106 if (obj != NULL) {
107 type = obj->ob_type;
108 if (type->tp_init != NULL &&
109 type->tp_init(obj, args, kwds) < 0) {
110 Py_DECREF(obj);
111 obj = NULL;
112 }
113 }
114 return obj;
115}
116
117PyObject *
118PyType_GenericAlloc(PyTypeObject *type, int nitems)
119{
120 int size;
121 void *mem;
122 PyObject *obj;
123
124 /* Inline PyObject_New() so we can zero the memory */
125 size = _PyObject_VAR_SIZE(type, nitems);
126 mem = PyObject_MALLOC(size);
127 if (mem == NULL)
128 return PyErr_NoMemory();
129 memset(mem, '\0', size);
130 if (PyType_IS_GC(type))
131 obj = PyObject_FROM_GC(mem);
132 else
133 obj = (PyObject *)mem;
134 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
135 Py_INCREF(type);
136 if (type->tp_itemsize == 0)
137 PyObject_INIT(obj, type);
138 else
139 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
140 if (PyType_IS_GC(type))
141 PyObject_GC_Init(obj);
142 return obj;
143}
144
145PyObject *
146PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
147{
148 return type->tp_alloc(type, 0);
149}
150
151/* Helper for subtyping */
152
153static void
154subtype_dealloc(PyObject *self)
155{
156 int dictoffset = self->ob_type->tp_dictoffset;
157 PyTypeObject *type, *base;
158 destructor f;
159
160 /* This exists so we can DECREF self->ob_type */
161
162 /* Find the nearest base with a different tp_dealloc */
163 type = self->ob_type;
164 base = type->tp_base;
165 while ((f = base->tp_dealloc) == subtype_dealloc) {
166 base = base->tp_base;
167 assert(base);
168 }
169
170 /* If we added a dict, DECREF it */
171 if (dictoffset && !base->tp_dictoffset) {
172 PyObject **dictptr = (PyObject **) ((char *)self + dictoffset);
173 PyObject *dict = *dictptr;
174 if (dict != NULL) {
175 Py_DECREF(dict);
176 *dictptr = NULL;
177 }
178 }
179
180 /* Finalize GC if the base doesn't do GC and we do */
181 if (PyType_IS_GC(type) && !PyType_IS_GC(base))
182 PyObject_GC_Fini(self);
183
184 /* Call the base tp_dealloc() */
185 assert(f);
186 f(self);
187
188 /* Can't reference self beyond this point */
189 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
190 Py_DECREF(type);
191 }
192}
193
194staticforward void override_slots(PyTypeObject *type, PyObject *dict);
195staticforward PyTypeObject *solid_base(PyTypeObject *type);
196
197typedef struct {
198 PyTypeObject type;
199 PyNumberMethods as_number;
200 PySequenceMethods as_sequence;
201 PyMappingMethods as_mapping;
202 PyBufferProcs as_buffer;
203 PyObject *name, *slots;
204 struct memberlist members[1];
205} etype;
206
207/* type test with subclassing support */
208
209int
210PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
211{
212 PyObject *mro;
213
214 mro = a->tp_mro;
215 if (mro != NULL) {
216 /* Deal with multiple inheritance without recursion
217 by walking the MRO tuple */
218 int i, n;
219 assert(PyTuple_Check(mro));
220 n = PyTuple_GET_SIZE(mro);
221 for (i = 0; i < n; i++) {
222 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
223 return 1;
224 }
225 return 0;
226 }
227 else {
228 /* a is not completely initilized yet; follow tp_base */
229 do {
230 if (a == b)
231 return 1;
232 a = a->tp_base;
233 } while (a != NULL);
234 return b == &PyBaseObject_Type;
235 }
236}
237
238/* Method resolution order algorithm from "Putting Metaclasses to Work"
239 by Forman and Danforth (Addison-Wesley 1999). */
240
241static int
242conservative_merge(PyObject *left, PyObject *right)
243{
244 int left_size;
245 int right_size;
246 int i, j, r, ok;
247 PyObject *temp, *rr;
248
249 assert(PyList_Check(left));
250 assert(PyList_Check(right));
251
252 again:
253 left_size = PyList_GET_SIZE(left);
254 right_size = PyList_GET_SIZE(right);
255 for (i = 0; i < left_size; i++) {
256 for (j = 0; j < right_size; j++) {
257 if (PyList_GET_ITEM(left, i) ==
258 PyList_GET_ITEM(right, j)) {
259 /* found a merge point */
260 temp = PyList_New(0);
261 if (temp == NULL)
262 return -1;
263 for (r = 0; r < j; r++) {
264 rr = PyList_GET_ITEM(right, r);
265 ok = PySequence_Contains(left, rr);
266 if (ok < 0) {
267 Py_DECREF(temp);
268 return -1;
269 }
270 if (!ok) {
271 ok = PyList_Append(temp, rr);
272 if (ok < 0) {
273 Py_DECREF(temp);
274 return -1;
275 }
276 }
277 }
278 ok = PyList_SetSlice(left, i, i, temp);
279 Py_DECREF(temp);
280 if (ok < 0)
281 return -1;
282 ok = PyList_SetSlice(right, 0, j+1, NULL);
283 if (ok < 0)
284 return -1;
285 goto again;
286 }
287 }
288 }
289 return PyList_SetSlice(left, left_size, left_size, right);
290}
291
292static int
293serious_order_disagreements(PyObject *left, PyObject *right)
294{
295 return 0; /* XXX later -- for now, we cheat: "don't do that" */
296}
297
298static PyObject *
299mro_implementation(PyTypeObject *type)
300{
301 int i, n, ok;
302 PyObject *bases, *result;
303
304 bases = type->tp_bases;
305 n = PyTuple_GET_SIZE(bases);
306 result = Py_BuildValue("[O]", (PyObject *)type);
307 if (result == NULL)
308 return NULL;
309 for (i = 0; i < n; i++) {
310 PyTypeObject *base =
311 (PyTypeObject *) PyTuple_GET_ITEM(bases, i);
312 PyObject *parentMRO = PySequence_List(base->tp_mro);
313 if (parentMRO == NULL) {
314 Py_DECREF(result);
315 return NULL;
316 }
317 if (serious_order_disagreements(result, parentMRO)) {
318 Py_DECREF(result);
319 return NULL;
320 }
321 ok = conservative_merge(result, parentMRO);
322 Py_DECREF(parentMRO);
323 if (ok < 0) {
324 Py_DECREF(result);
325 return NULL;
326 }
327 }
328 return result;
329}
330
331static PyObject *
332mro_external(PyObject *self, PyObject *args)
333{
334 PyTypeObject *type = (PyTypeObject *)self;
335
336 if (!PyArg_ParseTuple(args, ""))
337 return NULL;
338 return mro_implementation(type);
339}
340
341static int
342mro_internal(PyTypeObject *type)
343{
344 PyObject *mro, *result, *tuple;
345
346 if (type->ob_type == &PyType_Type) {
347 result = mro_implementation(type);
348 }
349 else {
350 mro = PyObject_GetAttrString((PyObject *)type, "mro");
351 if (mro == NULL)
352 return -1;
353 result = PyObject_CallObject(mro, NULL);
354 Py_DECREF(mro);
355 }
356 if (result == NULL)
357 return -1;
358 tuple = PySequence_Tuple(result);
359 Py_DECREF(result);
360 type->tp_mro = tuple;
361 return 0;
362}
363
364
365/* Calculate the best base amongst multiple base classes.
366 This is the first one that's on the path to the "solid base". */
367
368static PyTypeObject *
369best_base(PyObject *bases)
370{
371 int i, n;
372 PyTypeObject *base, *winner, *candidate, *base_i;
373
374 assert(PyTuple_Check(bases));
375 n = PyTuple_GET_SIZE(bases);
376 assert(n > 0);
377 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, 0);
378 winner = &PyBaseObject_Type;
379 for (i = 0; i < n; i++) {
380 base_i = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
381 if (!PyType_Check((PyObject *)base_i)) {
382 PyErr_SetString(
383 PyExc_TypeError,
384 "bases must be types");
385 return NULL;
386 }
387 if (base_i->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000388 if (PyType_Ready(base_i) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000389 return NULL;
390 }
391 candidate = solid_base(base_i);
392 if (PyType_IsSubtype(winner, candidate))
393 ;
394 else if (PyType_IsSubtype(candidate, winner)) {
395 winner = candidate;
396 base = base_i;
397 }
398 else {
399 PyErr_SetString(
400 PyExc_TypeError,
401 "multiple bases have "
402 "instance lay-out conflict");
403 return NULL;
404 }
405 }
406 assert(base != NULL);
407 return base;
408}
409
410static int
411extra_ivars(PyTypeObject *type, PyTypeObject *base)
412{
413 int t_size = PyType_BASICSIZE(type);
414 int b_size = PyType_BASICSIZE(base);
415
416 assert(t_size >= b_size); /* type smaller than base! */
417 if (type->tp_itemsize || base->tp_itemsize) {
418 /* If itemsize is involved, stricter rules */
419 return t_size != b_size ||
420 type->tp_itemsize != base->tp_itemsize;
421 }
422 if (t_size == b_size)
423 return 0;
424 if (type->tp_dictoffset != 0 && base->tp_dictoffset == 0 &&
425 type->tp_dictoffset == b_size &&
426 (size_t)t_size == b_size + sizeof(PyObject *))
427 return 0; /* "Forgive" adding a __dict__ only */
428 return 1;
429}
430
431static PyTypeObject *
432solid_base(PyTypeObject *type)
433{
434 PyTypeObject *base;
435
436 if (type->tp_base)
437 base = solid_base(type->tp_base);
438 else
439 base = &PyBaseObject_Type;
440 if (extra_ivars(type, base))
441 return type;
442 else
443 return base;
444}
445
446staticforward void object_dealloc(PyObject *);
447staticforward int object_init(PyObject *, PyObject *, PyObject *);
448
449static PyObject *
450type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
451{
452 PyObject *name, *bases, *dict;
453 static char *kwlist[] = {"name", "bases", "dict", 0};
454 PyObject *slots, *tmp;
455 PyTypeObject *type, *base, *tmptype;
456 etype *et;
457 struct memberlist *mp;
458 int i, nbases, nslots, slotoffset, dynamic;
459
460 if (metatype == &PyType_Type &&
461 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
462 (kwds == NULL || (PyDict_Check(kwds) && PyDict_Size(kwds) == 0))) {
463 /* type(x) -> x.__class__ */
464 PyObject *x = PyTuple_GET_ITEM(args, 0);
465 Py_INCREF(x->ob_type);
466 return (PyObject *) x->ob_type;
467 }
468
469 /* Check arguments */
470 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
471 &name,
472 &PyTuple_Type, &bases,
473 &PyDict_Type, &dict))
474 return NULL;
475
476 /* Determine the proper metatype to deal with this,
477 and check for metatype conflicts while we're at it.
478 Note that if some other metatype wins to contract,
479 it's possible that its instances are not types. */
480 nbases = PyTuple_GET_SIZE(bases);
481 for (i = 0; i < nbases; i++) {
482 tmp = PyTuple_GET_ITEM(bases, i);
483 tmptype = tmp->ob_type;
484 if (PyType_IsSubtype(metatype, tmptype))
485 continue;
486 if (PyType_IsSubtype(tmptype, metatype)) {
487 metatype = tmptype;
488 continue;
489 }
490 PyErr_SetString(PyExc_TypeError,
491 "metatype conflict among bases");
492 return NULL;
493 }
494 if (metatype->tp_new != type_new) /* Pass it to the winner */
495 return metatype->tp_new(metatype, args, kwds);
496
497 /* Adjust for empty tuple bases */
498 if (nbases == 0) {
499 bases = Py_BuildValue("(O)", &PyBaseObject_Type);
500 if (bases == NULL)
501 return NULL;
502 nbases = 1;
503 }
504 else
505 Py_INCREF(bases);
506
507 /* XXX From here until type is allocated, "return NULL" leaks bases! */
508
509 /* Calculate best base, and check that all bases are type objects */
510 base = best_base(bases);
511 if (base == NULL)
512 return NULL;
513 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
514 PyErr_Format(PyExc_TypeError,
515 "type '%.100s' is not an acceptable base type",
516 base->tp_name);
517 return NULL;
518 }
519
520 /* Should this be a dynamic class (i.e. modifiable __dict__)? */
521 tmp = PyDict_GetItemString(dict, "__dynamic__");
522 if (tmp != NULL) {
523 /* The class author has a preference */
524 dynamic = PyObject_IsTrue(tmp);
525 Py_DECREF(tmp);
526 if (dynamic < 0)
527 return NULL;
528 }
529 else {
530 /* Make a new class dynamic if any of its bases is dynamic.
531 This is not always the same as inheriting the __dynamic__
532 class attribute! */
533 dynamic = 0;
534 for (i = 0; i < nbases; i++) {
535 tmptype = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
536 if (tmptype->tp_flags & Py_TPFLAGS_DYNAMICTYPE) {
537 dynamic = 1;
538 break;
539 }
540 }
541 }
542
543 /* Check for a __slots__ sequence variable in dict, and count it */
544 slots = PyDict_GetItemString(dict, "__slots__");
545 nslots = 0;
546 if (slots != NULL) {
547 /* Make it into a tuple */
548 if (PyString_Check(slots))
549 slots = Py_BuildValue("(O)", slots);
550 else
551 slots = PySequence_Tuple(slots);
552 if (slots == NULL)
553 return NULL;
554 nslots = PyTuple_GET_SIZE(slots);
555 for (i = 0; i < nslots; i++) {
556 if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) {
557 PyErr_SetString(PyExc_TypeError,
558 "__slots__ must be a sequence of strings");
559 Py_DECREF(slots);
560 return NULL;
561 }
562 }
563 }
564 if (slots == NULL && base->tp_dictoffset == 0 &&
565 (base->tp_setattro == PyObject_GenericSetAttr ||
566 base->tp_setattro == NULL))
567 nslots = 1;
568
569 /* XXX From here until type is safely allocated,
570 "return NULL" may leak slots! */
571
572 /* Allocate the type object */
573 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
574 if (type == NULL)
575 return NULL;
576
577 /* Keep name and slots alive in the extended type object */
578 et = (etype *)type;
579 Py_INCREF(name);
580 et->name = name;
581 et->slots = slots;
582
Guido van Rossumdc91b992001-08-08 22:26:22 +0000583 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000584 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
585 Py_TPFLAGS_BASETYPE;
586 if (dynamic)
587 type->tp_flags |= Py_TPFLAGS_DYNAMICTYPE;
Guido van Rossumdc91b992001-08-08 22:26:22 +0000588
589 /* It's a new-style number unless it specifically inherits any
590 old-style numeric behavior */
591 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
592 (base->tp_as_number == NULL))
593 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
594
595 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000596 type->tp_as_number = &et->as_number;
597 type->tp_as_sequence = &et->as_sequence;
598 type->tp_as_mapping = &et->as_mapping;
599 type->tp_as_buffer = &et->as_buffer;
600 type->tp_name = PyString_AS_STRING(name);
601
602 /* Set tp_base and tp_bases */
603 type->tp_bases = bases;
604 Py_INCREF(base);
605 type->tp_base = base;
606
607 /* Initialize tp_defined from passed-in dict */
608 type->tp_defined = dict = PyDict_Copy(dict);
609 if (dict == NULL) {
610 Py_DECREF(type);
611 return NULL;
612 }
613
614 /* Special-case __new__: if it's a plain function,
615 make it a static function */
616 tmp = PyDict_GetItemString(dict, "__new__");
617 if (tmp != NULL && PyFunction_Check(tmp)) {
618 tmp = PyStaticMethod_New(tmp);
619 if (tmp == NULL) {
620 Py_DECREF(type);
621 return NULL;
622 }
623 PyDict_SetItemString(dict, "__new__", tmp);
624 Py_DECREF(tmp);
625 }
626
627 /* Add descriptors for custom slots from __slots__, or for __dict__ */
628 mp = et->members;
629 slotoffset = PyType_BASICSIZE(base);
630 if (slots != NULL) {
631 for (i = 0; i < nslots; i++, mp++) {
632 mp->name = PyString_AS_STRING(
633 PyTuple_GET_ITEM(slots, i));
634 mp->type = T_OBJECT;
635 mp->offset = slotoffset;
636 slotoffset += sizeof(PyObject *);
637 }
638 }
639 else if (nslots) {
640 type->tp_dictoffset = slotoffset;
641 mp->name = "__dict__";
642 mp->type = T_OBJECT;
643 mp->offset = slotoffset;
644 mp->readonly = 1;
645 slotoffset += sizeof(PyObject *);
646 }
647 type->tp_basicsize = slotoffset;
Guido van Rossum13d52f02001-08-10 21:24:08 +0000648 type->tp_members = et->members;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000649
650 /* Special case some slots */
651 if (type->tp_dictoffset != 0 || nslots > 0) {
652 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
653 type->tp_getattro = PyObject_GenericGetAttr;
654 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
655 type->tp_setattro = PyObject_GenericSetAttr;
656 }
657 type->tp_dealloc = subtype_dealloc;
658
659 /* Always override allocation strategy to use regular heap */
660 type->tp_alloc = PyType_GenericAlloc;
661 type->tp_free = _PyObject_Del;
662
663 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000664 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000665 Py_DECREF(type);
666 return NULL;
667 }
668
669 /* Override slots that deserve it */
Guido van Rossum8e248182001-08-12 05:17:56 +0000670 if (!PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE))
671 override_slots(type, type->tp_defined);
Guido van Rossumf040ede2001-08-07 16:40:56 +0000672
Tim Peters6d6c1a32001-08-02 04:15:00 +0000673 return (PyObject *)type;
674}
675
676/* Internal API to look for a name through the MRO.
677 This returns a borrowed reference, and doesn't set an exception! */
678PyObject *
679_PyType_Lookup(PyTypeObject *type, PyObject *name)
680{
681 int i, n;
682 PyObject *mro, *res, *dict;
683
684 /* For static types, look in tp_dict */
685 if (!(type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)) {
686 dict = type->tp_dict;
687 assert(dict && PyDict_Check(dict));
688 return PyDict_GetItem(dict, name);
689 }
690
691 /* For dynamic types, look in tp_defined of types in MRO */
692 mro = type->tp_mro;
693 assert(PyTuple_Check(mro));
694 n = PyTuple_GET_SIZE(mro);
695 for (i = 0; i < n; i++) {
696 type = (PyTypeObject *) PyTuple_GET_ITEM(mro, i);
697 assert(PyType_Check(type));
698 dict = type->tp_defined;
699 assert(dict && PyDict_Check(dict));
700 res = PyDict_GetItem(dict, name);
701 if (res != NULL)
702 return res;
703 }
704 return NULL;
705}
706
707/* This is similar to PyObject_GenericGetAttr(),
708 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
709static PyObject *
710type_getattro(PyTypeObject *type, PyObject *name)
711{
712 PyTypeObject *metatype = type->ob_type;
713 PyObject *descr, *res;
714 descrgetfunc f;
715
716 /* Initialize this type (we'll assume the metatype is initialized) */
717 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000718 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000719 return NULL;
720 }
721
722 /* Get a descriptor from the metatype */
723 descr = _PyType_Lookup(metatype, name);
724 f = NULL;
725 if (descr != NULL) {
726 f = descr->ob_type->tp_descr_get;
727 if (f != NULL && PyDescr_IsData(descr))
728 return f(descr,
729 (PyObject *)type, (PyObject *)metatype);
730 }
731
732 /* Look in tp_defined of this type and its bases */
733 res = _PyType_Lookup(type, name);
734 if (res != NULL) {
735 f = res->ob_type->tp_descr_get;
736 if (f != NULL)
737 return f(res, (PyObject *)NULL, (PyObject *)type);
738 Py_INCREF(res);
739 return res;
740 }
741
742 /* Use the descriptor from the metatype */
743 if (f != NULL) {
744 res = f(descr, (PyObject *)type, (PyObject *)metatype);
745 return res;
746 }
747 if (descr != NULL) {
748 Py_INCREF(descr);
749 return descr;
750 }
751
752 /* Give up */
753 PyErr_Format(PyExc_AttributeError,
754 "type object '%.50s' has no attribute '%.400s'",
755 type->tp_name, PyString_AS_STRING(name));
756 return NULL;
757}
758
759static int
760type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
761{
762 if (type->tp_flags & Py_TPFLAGS_DYNAMICTYPE)
763 return PyObject_GenericSetAttr((PyObject *)type, name, value);
764 PyErr_SetString(PyExc_TypeError, "can't set type attributes");
765 return -1;
766}
767
768static void
769type_dealloc(PyTypeObject *type)
770{
771 etype *et;
772
773 /* Assert this is a heap-allocated type object */
774 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
775 et = (etype *)type;
776 Py_XDECREF(type->tp_base);
777 Py_XDECREF(type->tp_dict);
778 Py_XDECREF(type->tp_bases);
779 Py_XDECREF(type->tp_mro);
780 Py_XDECREF(type->tp_defined);
781 /* XXX more? */
782 Py_XDECREF(et->name);
783 Py_XDECREF(et->slots);
784 type->ob_type->tp_free((PyObject *)type);
785}
786
787static PyMethodDef type_methods[] = {
788 {"mro", mro_external, METH_VARARGS,
789 "mro() -> list\nreturn a type's method resolution order"},
790 {0}
791};
792
793static char type_doc[] =
794"type(object) -> the object's type\n"
795"type(name, bases, dict) -> a new type";
796
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000797PyTypeObject PyType_Type = {
798 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000799 0, /* ob_size */
800 "type", /* tp_name */
801 sizeof(etype), /* tp_basicsize */
802 sizeof(struct memberlist), /* tp_itemsize */
803 (destructor)type_dealloc, /* tp_dealloc */
804 0, /* tp_print */
805 0, /* tp_getattr */
806 0, /* tp_setattr */
807 type_compare, /* tp_compare */
808 (reprfunc)type_repr, /* tp_repr */
809 0, /* tp_as_number */
810 0, /* tp_as_sequence */
811 0, /* tp_as_mapping */
812 (hashfunc)_Py_HashPointer, /* tp_hash */
813 (ternaryfunc)type_call, /* tp_call */
814 0, /* tp_str */
815 (getattrofunc)type_getattro, /* tp_getattro */
816 (setattrofunc)type_setattro, /* tp_setattro */
817 0, /* tp_as_buffer */
818 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
819 type_doc, /* tp_doc */
820 0, /* tp_traverse */
821 0, /* tp_clear */
822 0, /* tp_richcompare */
823 0, /* tp_weaklistoffset */
824 0, /* tp_iter */
825 0, /* tp_iternext */
826 type_methods, /* tp_methods */
827 type_members, /* tp_members */
828 type_getsets, /* tp_getset */
829 0, /* tp_base */
830 0, /* tp_dict */
831 0, /* tp_descr_get */
832 0, /* tp_descr_set */
833 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
834 0, /* tp_init */
835 0, /* tp_alloc */
836 type_new, /* tp_new */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000837};
Tim Peters6d6c1a32001-08-02 04:15:00 +0000838
839
840/* The base type of all types (eventually)... except itself. */
841
842static int
843object_init(PyObject *self, PyObject *args, PyObject *kwds)
844{
845 return 0;
846}
847
848static void
849object_dealloc(PyObject *self)
850{
851 self->ob_type->tp_free(self);
852}
853
Guido van Rossum8e248182001-08-12 05:17:56 +0000854#if 0
Guido van Rossum4dd64ab2001-08-14 20:04:48 +0000855/* XXX These should be made smarter before they can be used */
Guido van Rossum8e248182001-08-12 05:17:56 +0000856static PyObject *
857object_repr(PyObject *self)
858{
859 char buf[120];
860
861 sprintf(buf, "<%.80s object at %p>", self->ob_type->tp_name, self);
862 return PyString_FromString(buf);
863}
864
865static long
866object_hash(PyObject *self)
867{
868 return _Py_HashPointer(self);
869}
870#endif
871
Tim Peters6d6c1a32001-08-02 04:15:00 +0000872static void
873object_free(PyObject *self)
874{
875 PyObject_Del(self);
876}
877
878static struct memberlist object_members[] = {
879 {"__class__", T_OBJECT, offsetof(PyObject, ob_type), READONLY},
880 {0}
881};
882
883PyTypeObject PyBaseObject_Type = {
884 PyObject_HEAD_INIT(&PyType_Type)
885 0, /* ob_size */
886 "object", /* tp_name */
887 sizeof(PyObject), /* tp_basicsize */
888 0, /* tp_itemsize */
889 (destructor)object_dealloc, /* tp_dealloc */
890 0, /* tp_print */
891 0, /* tp_getattr */
892 0, /* tp_setattr */
893 0, /* tp_compare */
894 0, /* tp_repr */
895 0, /* tp_as_number */
896 0, /* tp_as_sequence */
897 0, /* tp_as_mapping */
898 0, /* tp_hash */
899 0, /* tp_call */
900 0, /* tp_str */
901 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +0000902 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000903 0, /* tp_as_buffer */
904 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
905 "The most base type", /* tp_doc */
906 0, /* tp_traverse */
907 0, /* tp_clear */
908 0, /* tp_richcompare */
909 0, /* tp_weaklistoffset */
910 0, /* tp_iter */
911 0, /* tp_iternext */
912 0, /* tp_methods */
913 object_members, /* tp_members */
914 0, /* tp_getset */
915 0, /* tp_base */
916 0, /* tp_dict */
917 0, /* tp_descr_get */
918 0, /* tp_descr_set */
919 0, /* tp_dictoffset */
920 object_init, /* tp_init */
921 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc11e1922001-08-09 19:38:15 +0000922 PyType_GenericNew, /* tp_new */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000923 object_free, /* tp_free */
924};
925
926
927/* Initialize the __dict__ in a type object */
928
929static int
930add_methods(PyTypeObject *type, PyMethodDef *meth)
931{
932 PyObject *dict = type->tp_defined;
933
934 for (; meth->ml_name != NULL; meth++) {
935 PyObject *descr;
936 if (PyDict_GetItemString(dict, meth->ml_name))
937 continue;
938 descr = PyDescr_NewMethod(type, meth);
939 if (descr == NULL)
940 return -1;
941 if (PyDict_SetItemString(dict,meth->ml_name,descr) < 0)
942 return -1;
943 Py_DECREF(descr);
944 }
945 return 0;
946}
947
948static int
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949add_members(PyTypeObject *type, struct memberlist *memb)
950{
951 PyObject *dict = type->tp_defined;
952
953 for (; memb->name != NULL; memb++) {
954 PyObject *descr;
955 if (PyDict_GetItemString(dict, memb->name))
956 continue;
957 descr = PyDescr_NewMember(type, memb);
958 if (descr == NULL)
959 return -1;
960 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
961 return -1;
962 Py_DECREF(descr);
963 }
964 return 0;
965}
966
967static int
968add_getset(PyTypeObject *type, struct getsetlist *gsp)
969{
970 PyObject *dict = type->tp_defined;
971
972 for (; gsp->name != NULL; gsp++) {
973 PyObject *descr;
974 if (PyDict_GetItemString(dict, gsp->name))
975 continue;
976 descr = PyDescr_NewGetSet(type, gsp);
977
978 if (descr == NULL)
979 return -1;
980 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
981 return -1;
982 Py_DECREF(descr);
983 }
984 return 0;
985}
986
Guido van Rossum13d52f02001-08-10 21:24:08 +0000987static void
988inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000989{
990 int oldsize, newsize;
991
Guido van Rossum13d52f02001-08-10 21:24:08 +0000992 /* Special flag magic */
993 if (!type->tp_as_buffer && base->tp_as_buffer) {
994 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
995 type->tp_flags |=
996 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
997 }
998 if (!type->tp_as_sequence && base->tp_as_sequence) {
999 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
1000 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
1001 }
1002 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
1003 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
1004 if ((!type->tp_as_number && base->tp_as_number) ||
1005 (!type->tp_as_sequence && base->tp_as_sequence)) {
1006 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
1007 if (!type->tp_as_number && !type->tp_as_sequence) {
1008 type->tp_flags |= base->tp_flags &
1009 Py_TPFLAGS_HAVE_INPLACEOPS;
1010 }
1011 }
1012 /* Wow */
1013 }
1014 if (!type->tp_as_number && base->tp_as_number) {
1015 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
1016 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
1017 }
1018
1019 /* Copying basicsize is connected to the GC flags */
1020 oldsize = PyType_BASICSIZE(base);
1021 newsize = type->tp_basicsize ? PyType_BASICSIZE(type) : oldsize;
1022 if (!(type->tp_flags & Py_TPFLAGS_GC) &&
1023 (base->tp_flags & Py_TPFLAGS_GC) &&
1024 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
1025 (!type->tp_traverse && !type->tp_clear)) {
1026 type->tp_flags |= Py_TPFLAGS_GC;
1027 if (type->tp_traverse == NULL)
1028 type->tp_traverse = base->tp_traverse;
1029 if (type->tp_clear == NULL)
1030 type->tp_clear = base->tp_clear;
1031 }
1032 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1033 if (base != &PyBaseObject_Type ||
1034 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
1035 if (type->tp_new == NULL)
1036 type->tp_new = base->tp_new;
1037 }
1038 }
1039 PyType_SET_BASICSIZE(type, newsize);
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00001040
1041 /* Copy other non-function slots */
1042
1043#undef COPYVAL
1044#define COPYVAL(SLOT) \
1045 if (type->SLOT == 0) type->SLOT = base->SLOT
1046
1047 COPYVAL(tp_itemsize);
1048 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
1049 COPYVAL(tp_weaklistoffset);
1050 }
1051 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1052 COPYVAL(tp_dictoffset);
1053 }
Guido van Rossum13d52f02001-08-10 21:24:08 +00001054}
1055
1056static void
1057inherit_slots(PyTypeObject *type, PyTypeObject *base)
1058{
1059 PyTypeObject *basebase;
1060
1061#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00001062#undef COPYSLOT
1063#undef COPYNUM
1064#undef COPYSEQ
1065#undef COPYMAP
Guido van Rossum13d52f02001-08-10 21:24:08 +00001066
1067#define SLOTDEFINED(SLOT) \
1068 (base->SLOT != 0 && \
1069 (basebase == NULL || base->SLOT != basebase->SLOT))
1070
Tim Peters6d6c1a32001-08-02 04:15:00 +00001071#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00001072 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073
1074#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
1075#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
1076#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
1077
Guido van Rossum13d52f02001-08-10 21:24:08 +00001078 /* This won't inherit indirect slots (from tp_as_number etc.)
1079 if type doesn't provide the space. */
1080
1081 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
1082 basebase = base->tp_base;
1083 if (basebase->tp_as_number == NULL)
1084 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001085 COPYNUM(nb_add);
1086 COPYNUM(nb_subtract);
1087 COPYNUM(nb_multiply);
1088 COPYNUM(nb_divide);
1089 COPYNUM(nb_remainder);
1090 COPYNUM(nb_divmod);
1091 COPYNUM(nb_power);
1092 COPYNUM(nb_negative);
1093 COPYNUM(nb_positive);
1094 COPYNUM(nb_absolute);
1095 COPYNUM(nb_nonzero);
1096 COPYNUM(nb_invert);
1097 COPYNUM(nb_lshift);
1098 COPYNUM(nb_rshift);
1099 COPYNUM(nb_and);
1100 COPYNUM(nb_xor);
1101 COPYNUM(nb_or);
1102 COPYNUM(nb_coerce);
1103 COPYNUM(nb_int);
1104 COPYNUM(nb_long);
1105 COPYNUM(nb_float);
1106 COPYNUM(nb_oct);
1107 COPYNUM(nb_hex);
1108 COPYNUM(nb_inplace_add);
1109 COPYNUM(nb_inplace_subtract);
1110 COPYNUM(nb_inplace_multiply);
1111 COPYNUM(nb_inplace_divide);
1112 COPYNUM(nb_inplace_remainder);
1113 COPYNUM(nb_inplace_power);
1114 COPYNUM(nb_inplace_lshift);
1115 COPYNUM(nb_inplace_rshift);
1116 COPYNUM(nb_inplace_and);
1117 COPYNUM(nb_inplace_xor);
1118 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00001119 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
1120 COPYNUM(nb_true_divide);
1121 COPYNUM(nb_floor_divide);
1122 COPYNUM(nb_inplace_true_divide);
1123 COPYNUM(nb_inplace_floor_divide);
1124 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001125 }
1126
Guido van Rossum13d52f02001-08-10 21:24:08 +00001127 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
1128 basebase = base->tp_base;
1129 if (basebase->tp_as_sequence == NULL)
1130 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001131 COPYSEQ(sq_length);
1132 COPYSEQ(sq_concat);
1133 COPYSEQ(sq_repeat);
1134 COPYSEQ(sq_item);
1135 COPYSEQ(sq_slice);
1136 COPYSEQ(sq_ass_item);
1137 COPYSEQ(sq_ass_slice);
1138 COPYSEQ(sq_contains);
1139 COPYSEQ(sq_inplace_concat);
1140 COPYSEQ(sq_inplace_repeat);
1141 }
1142
Guido van Rossum13d52f02001-08-10 21:24:08 +00001143 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
1144 basebase = base->tp_base;
1145 if (basebase->tp_as_mapping == NULL)
1146 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001147 COPYMAP(mp_length);
1148 COPYMAP(mp_subscript);
1149 COPYMAP(mp_ass_subscript);
1150 }
1151
Guido van Rossum13d52f02001-08-10 21:24:08 +00001152 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001153
Tim Peters6d6c1a32001-08-02 04:15:00 +00001154 COPYSLOT(tp_dealloc);
1155 COPYSLOT(tp_print);
1156 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
1157 type->tp_getattr = base->tp_getattr;
1158 type->tp_getattro = base->tp_getattro;
1159 }
1160 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
1161 type->tp_setattr = base->tp_setattr;
1162 type->tp_setattro = base->tp_setattro;
1163 }
1164 /* tp_compare see tp_richcompare */
1165 COPYSLOT(tp_repr);
1166 COPYSLOT(tp_hash);
1167 COPYSLOT(tp_call);
1168 COPYSLOT(tp_str);
1169 COPYSLOT(tp_as_buffer);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001170 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
1171 if (type->tp_compare == NULL && type->tp_richcompare == NULL) {
1172 type->tp_compare = base->tp_compare;
1173 type->tp_richcompare = base->tp_richcompare;
1174 }
1175 }
1176 else {
1177 COPYSLOT(tp_compare);
1178 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001179 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
1180 COPYSLOT(tp_iter);
1181 COPYSLOT(tp_iternext);
1182 }
1183 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1184 COPYSLOT(tp_descr_get);
1185 COPYSLOT(tp_descr_set);
1186 COPYSLOT(tp_dictoffset);
1187 COPYSLOT(tp_init);
1188 COPYSLOT(tp_alloc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001189 COPYSLOT(tp_free);
1190 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001191}
1192
Guido van Rossum13d52f02001-08-10 21:24:08 +00001193staticforward int add_operators(PyTypeObject *);
1194
Tim Peters6d6c1a32001-08-02 04:15:00 +00001195int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001196PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001197{
1198 PyObject *dict, *bases, *x;
1199 PyTypeObject *base;
1200 int i, n;
1201
Guido van Rossumd614f972001-08-10 17:39:49 +00001202 if (type->tp_flags & Py_TPFLAGS_READY) {
1203 assert(type->tp_dict != NULL);
1204 return 0;
1205 }
1206 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
1207 assert(type->tp_dict == NULL);
1208
1209 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001210
1211 /* Initialize tp_base (defaults to BaseObject unless that's us) */
1212 base = type->tp_base;
1213 if (base == NULL && type != &PyBaseObject_Type)
1214 base = type->tp_base = &PyBaseObject_Type;
1215
1216 /* Initialize tp_bases */
1217 bases = type->tp_bases;
1218 if (bases == NULL) {
1219 if (base == NULL)
1220 bases = PyTuple_New(0);
1221 else
1222 bases = Py_BuildValue("(O)", base);
1223 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00001224 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001225 type->tp_bases = bases;
1226 }
1227
1228 /* Initialize the base class */
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001229 if (base && base->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001230 if (PyType_Ready(base) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001231 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001232 }
1233
1234 /* Initialize tp_defined */
1235 dict = type->tp_defined;
1236 if (dict == NULL) {
1237 dict = PyDict_New();
1238 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00001239 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001240 type->tp_defined = dict;
1241 }
1242
1243 /* Add type-specific descriptors to tp_defined */
1244 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001245 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001246 if (type->tp_methods != NULL) {
1247 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001248 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001249 }
1250 if (type->tp_members != NULL) {
1251 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001252 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 }
1254 if (type->tp_getset != NULL) {
1255 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001256 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 }
1258
1259 /* Temporarily make tp_dict the same object as tp_defined.
1260 (This is needed to call mro(), and can stay this way for
1261 dynamic types). */
1262 Py_INCREF(type->tp_defined);
1263 type->tp_dict = type->tp_defined;
1264
1265 /* Calculate method resolution order */
1266 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00001267 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001268 }
1269
Guido van Rossum13d52f02001-08-10 21:24:08 +00001270 /* Inherit special flags from dominant base */
1271 if (type->tp_base != NULL)
1272 inherit_special(type, type->tp_base);
1273
Tim Peters6d6c1a32001-08-02 04:15:00 +00001274 /* Initialize tp_dict properly */
Guido van Rossum8de86802001-08-12 03:43:35 +00001275 if (PyType_HasFeature(type, Py_TPFLAGS_DYNAMICTYPE)) {
Guido van Rossum8e248182001-08-12 05:17:56 +00001276 /* For a dynamic type, all slots are overridden */
1277 override_slots(type, NULL);
Guido van Rossum8de86802001-08-12 03:43:35 +00001278 }
1279 else {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001280 /* For a static type, tp_dict is the consolidation
Guido van Rossum13d52f02001-08-10 21:24:08 +00001281 of the tp_defined of its bases in MRO. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001282 Py_DECREF(type->tp_dict);
Guido van Rossum13d52f02001-08-10 21:24:08 +00001283 type->tp_dict = PyDict_Copy(type->tp_defined);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001284 if (type->tp_dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00001285 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286 bases = type->tp_mro;
1287 assert(bases != NULL);
1288 assert(PyTuple_Check(bases));
1289 n = PyTuple_GET_SIZE(bases);
Guido van Rossum13d52f02001-08-10 21:24:08 +00001290 for (i = 1; i < n; i++) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001291 base = (PyTypeObject *)PyTuple_GET_ITEM(bases, i);
1292 assert(PyType_Check(base));
1293 x = base->tp_defined;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001294 if (x != NULL && PyDict_Merge(type->tp_dict, x, 0) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001295 goto error;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001296 inherit_slots(type, base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001297 }
1298 }
1299
Guido van Rossum13d52f02001-08-10 21:24:08 +00001300 /* Some more special stuff */
1301 base = type->tp_base;
1302 if (base != NULL) {
1303 if (type->tp_as_number == NULL)
1304 type->tp_as_number = base->tp_as_number;
1305 if (type->tp_as_sequence == NULL)
1306 type->tp_as_sequence = base->tp_as_sequence;
1307 if (type->tp_as_mapping == NULL)
1308 type->tp_as_mapping = base->tp_as_mapping;
1309 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001310
Guido van Rossum13d52f02001-08-10 21:24:08 +00001311 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00001312 assert(type->tp_dict != NULL);
1313 type->tp_flags =
1314 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001315 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00001316
1317 error:
1318 type->tp_flags &= ~Py_TPFLAGS_READYING;
1319 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001320}
1321
1322
1323/* Generic wrappers for overloadable 'operators' such as __getitem__ */
1324
1325/* There's a wrapper *function* for each distinct function typedef used
1326 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
1327 wrapper *table* for each distinct operation (e.g. __len__, __add__).
1328 Most tables have only one entry; the tables for binary operators have two
1329 entries, one regular and one with reversed arguments. */
1330
1331static PyObject *
1332wrap_inquiry(PyObject *self, PyObject *args, void *wrapped)
1333{
1334 inquiry func = (inquiry)wrapped;
1335 int res;
1336
1337 if (!PyArg_ParseTuple(args, ""))
1338 return NULL;
1339 res = (*func)(self);
1340 if (res == -1 && PyErr_Occurred())
1341 return NULL;
1342 return PyInt_FromLong((long)res);
1343}
1344
1345static struct wrapperbase tab_len[] = {
1346 {"__len__", (wrapperfunc)wrap_inquiry, "x.__len__() <==> len(x)"},
1347 {0}
1348};
1349
1350static PyObject *
1351wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
1352{
1353 binaryfunc func = (binaryfunc)wrapped;
1354 PyObject *other;
1355
1356 if (!PyArg_ParseTuple(args, "O", &other))
1357 return NULL;
1358 return (*func)(self, other);
1359}
1360
1361static PyObject *
1362wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
1363{
1364 binaryfunc func = (binaryfunc)wrapped;
1365 PyObject *other;
1366
1367 if (!PyArg_ParseTuple(args, "O", &other))
1368 return NULL;
1369 return (*func)(other, self);
1370}
1371
1372#undef BINARY
1373#define BINARY(NAME, OP) \
1374static struct wrapperbase tab_##NAME[] = { \
1375 {"__" #NAME "__", \
1376 (wrapperfunc)wrap_binaryfunc, \
1377 "x.__" #NAME "__(y) <==> " #OP}, \
1378 {"__r" #NAME "__", \
1379 (wrapperfunc)wrap_binaryfunc_r, \
1380 "y.__r" #NAME "__(x) <==> " #OP}, \
1381 {0} \
1382}
1383
1384BINARY(add, "x+y");
1385BINARY(sub, "x-y");
1386BINARY(mul, "x*y");
1387BINARY(div, "x/y");
1388BINARY(mod, "x%y");
1389BINARY(divmod, "divmod(x,y)");
1390BINARY(lshift, "x<<y");
1391BINARY(rshift, "x>>y");
1392BINARY(and, "x&y");
1393BINARY(xor, "x^y");
1394BINARY(or, "x|y");
1395
1396static PyObject *
1397wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
1398{
1399 ternaryfunc func = (ternaryfunc)wrapped;
1400 PyObject *other;
1401 PyObject *third = Py_None;
1402
1403 /* Note: This wrapper only works for __pow__() */
1404
1405 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
1406 return NULL;
1407 return (*func)(self, other, third);
1408}
1409
1410#undef TERNARY
1411#define TERNARY(NAME, OP) \
1412static struct wrapperbase tab_##NAME[] = { \
1413 {"__" #NAME "__", \
1414 (wrapperfunc)wrap_ternaryfunc, \
1415 "x.__" #NAME "__(y, z) <==> " #OP}, \
1416 {"__r" #NAME "__", \
1417 (wrapperfunc)wrap_ternaryfunc, \
1418 "y.__r" #NAME "__(x, z) <==> " #OP}, \
1419 {0} \
1420}
1421
1422TERNARY(pow, "(x**y) % z");
1423
1424#undef UNARY
1425#define UNARY(NAME, OP) \
1426static struct wrapperbase tab_##NAME[] = { \
1427 {"__" #NAME "__", \
1428 (wrapperfunc)wrap_unaryfunc, \
1429 "x.__" #NAME "__() <==> " #OP}, \
1430 {0} \
1431}
1432
1433static PyObject *
1434wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
1435{
1436 unaryfunc func = (unaryfunc)wrapped;
1437
1438 if (!PyArg_ParseTuple(args, ""))
1439 return NULL;
1440 return (*func)(self);
1441}
1442
1443UNARY(neg, "-x");
1444UNARY(pos, "+x");
1445UNARY(abs, "abs(x)");
1446UNARY(nonzero, "x != 0");
1447UNARY(invert, "~x");
1448UNARY(int, "int(x)");
1449UNARY(long, "long(x)");
1450UNARY(float, "float(x)");
1451UNARY(oct, "oct(x)");
1452UNARY(hex, "hex(x)");
1453
1454#undef IBINARY
1455#define IBINARY(NAME, OP) \
1456static struct wrapperbase tab_##NAME[] = { \
1457 {"__" #NAME "__", \
1458 (wrapperfunc)wrap_binaryfunc, \
1459 "x.__" #NAME "__(y) <==> " #OP}, \
1460 {0} \
1461}
1462
1463IBINARY(iadd, "x+=y");
1464IBINARY(isub, "x-=y");
1465IBINARY(imul, "x*=y");
1466IBINARY(idiv, "x/=y");
1467IBINARY(imod, "x%=y");
1468IBINARY(ilshift, "x<<=y");
1469IBINARY(irshift, "x>>=y");
1470IBINARY(iand, "x&=y");
1471IBINARY(ixor, "x^=y");
1472IBINARY(ior, "x|=y");
1473
1474#undef ITERNARY
1475#define ITERNARY(NAME, OP) \
1476static struct wrapperbase tab_##NAME[] = { \
1477 {"__" #NAME "__", \
1478 (wrapperfunc)wrap_ternaryfunc, \
1479 "x.__" #NAME "__(y) <==> " #OP}, \
1480 {0} \
1481}
1482
1483ITERNARY(ipow, "x = (x**y) % z");
1484
1485static struct wrapperbase tab_getitem[] = {
1486 {"__getitem__", (wrapperfunc)wrap_binaryfunc,
1487 "x.__getitem__(y) <==> x[y]"},
1488 {0}
1489};
1490
1491static PyObject *
1492wrap_intargfunc(PyObject *self, PyObject *args, void *wrapped)
1493{
1494 intargfunc func = (intargfunc)wrapped;
1495 int i;
1496
1497 if (!PyArg_ParseTuple(args, "i", &i))
1498 return NULL;
1499 return (*func)(self, i);
1500}
1501
1502static struct wrapperbase tab_mul_int[] = {
1503 {"__mul__", (wrapperfunc)wrap_intargfunc, "x.__mul__(n) <==> x*n"},
1504 {"__rmul__", (wrapperfunc)wrap_intargfunc, "x.__rmul__(n) <==> n*x"},
1505 {0}
1506};
1507
1508static struct wrapperbase tab_concat[] = {
1509 {"__add__", (wrapperfunc)wrap_binaryfunc, "x.__add__(y) <==> x+y"},
1510 {0}
1511};
1512
1513static struct wrapperbase tab_imul_int[] = {
1514 {"__imul__", (wrapperfunc)wrap_intargfunc, "x.__imul__(n) <==> x*=n"},
1515 {0}
1516};
1517
1518static struct wrapperbase tab_getitem_int[] = {
1519 {"__getitem__", (wrapperfunc)wrap_intargfunc,
1520 "x.__getitem__(i) <==> x[i]"},
1521 {0}
1522};
1523
1524static PyObject *
1525wrap_intintargfunc(PyObject *self, PyObject *args, void *wrapped)
1526{
1527 intintargfunc func = (intintargfunc)wrapped;
1528 int i, j;
1529
1530 if (!PyArg_ParseTuple(args, "ii", &i, &j))
1531 return NULL;
1532 return (*func)(self, i, j);
1533}
1534
1535static struct wrapperbase tab_getslice[] = {
1536 {"__getslice__", (wrapperfunc)wrap_intintargfunc,
1537 "x.__getslice__(i, j) <==> x[i:j]"},
1538 {0}
1539};
1540
1541static PyObject *
1542wrap_intobjargproc(PyObject *self, PyObject *args, void *wrapped)
1543{
1544 intobjargproc func = (intobjargproc)wrapped;
1545 int i, res;
1546 PyObject *value;
1547
1548 if (!PyArg_ParseTuple(args, "iO", &i, &value))
1549 return NULL;
1550 res = (*func)(self, i, value);
1551 if (res == -1 && PyErr_Occurred())
1552 return NULL;
1553 Py_INCREF(Py_None);
1554 return Py_None;
1555}
1556
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00001557static PyObject *
1558wrap_delitem_int(PyObject *self, PyObject *args, void *wrapped)
1559{
1560 intobjargproc func = (intobjargproc)wrapped;
1561 int i, res;
1562
1563 if (!PyArg_ParseTuple(args, "i", &i))
1564 return NULL;
1565 res = (*func)(self, i, NULL);
1566 if (res == -1 && PyErr_Occurred())
1567 return NULL;
1568 Py_INCREF(Py_None);
1569 return Py_None;
1570}
1571
Tim Peters6d6c1a32001-08-02 04:15:00 +00001572static struct wrapperbase tab_setitem_int[] = {
1573 {"__setitem__", (wrapperfunc)wrap_intobjargproc,
1574 "x.__setitem__(i, y) <==> x[i]=y"},
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00001575 {"__delitem__", (wrapperfunc)wrap_delitem_int,
1576 "x.__delitem__(y) <==> del x[y]"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001577 {0}
1578};
1579
1580static PyObject *
1581wrap_intintobjargproc(PyObject *self, PyObject *args, void *wrapped)
1582{
1583 intintobjargproc func = (intintobjargproc)wrapped;
1584 int i, j, res;
1585 PyObject *value;
1586
1587 if (!PyArg_ParseTuple(args, "iiO", &i, &j, &value))
1588 return NULL;
1589 res = (*func)(self, i, j, value);
1590 if (res == -1 && PyErr_Occurred())
1591 return NULL;
1592 Py_INCREF(Py_None);
1593 return Py_None;
1594}
1595
1596static struct wrapperbase tab_setslice[] = {
1597 {"__setslice__", (wrapperfunc)wrap_intintobjargproc,
1598 "x.__setslice__(i, j, y) <==> x[i:j]=y"},
1599 {0}
1600};
1601
1602/* XXX objobjproc is a misnomer; should be objargpred */
1603static PyObject *
1604wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
1605{
1606 objobjproc func = (objobjproc)wrapped;
1607 int res;
1608 PyObject *value;
1609
1610 if (!PyArg_ParseTuple(args, "O", &value))
1611 return NULL;
1612 res = (*func)(self, value);
1613 if (res == -1 && PyErr_Occurred())
1614 return NULL;
1615 return PyInt_FromLong((long)res);
1616}
1617
1618static struct wrapperbase tab_contains[] = {
1619 {"__contains__", (wrapperfunc)wrap_objobjproc,
1620 "x.__contains__(y) <==> y in x"},
1621 {0}
1622};
1623
1624static PyObject *
1625wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
1626{
1627 objobjargproc func = (objobjargproc)wrapped;
1628 int res;
1629 PyObject *key, *value;
1630
1631 if (!PyArg_ParseTuple(args, "OO", &key, &value))
1632 return NULL;
1633 res = (*func)(self, key, value);
1634 if (res == -1 && PyErr_Occurred())
1635 return NULL;
1636 Py_INCREF(Py_None);
1637 return Py_None;
1638}
1639
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00001640static PyObject *
1641wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
1642{
1643 objobjargproc func = (objobjargproc)wrapped;
1644 int res;
1645 PyObject *key;
1646
1647 if (!PyArg_ParseTuple(args, "O", &key))
1648 return NULL;
1649 res = (*func)(self, key, NULL);
1650 if (res == -1 && PyErr_Occurred())
1651 return NULL;
1652 Py_INCREF(Py_None);
1653 return Py_None;
1654}
1655
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656static struct wrapperbase tab_setitem[] = {
1657 {"__setitem__", (wrapperfunc)wrap_objobjargproc,
1658 "x.__setitem__(y, z) <==> x[y]=z"},
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00001659 {"__delitem__", (wrapperfunc)wrap_delitem,
1660 "x.__delitem__(y) <==> del x[y]"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001661 {0}
1662};
1663
1664static PyObject *
1665wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
1666{
1667 cmpfunc func = (cmpfunc)wrapped;
1668 int res;
1669 PyObject *other;
1670
1671 if (!PyArg_ParseTuple(args, "O", &other))
1672 return NULL;
1673 res = (*func)(self, other);
1674 if (PyErr_Occurred())
1675 return NULL;
1676 return PyInt_FromLong((long)res);
1677}
1678
1679static struct wrapperbase tab_cmp[] = {
1680 {"__cmp__", (wrapperfunc)wrap_cmpfunc,
1681 "x.__cmp__(y) <==> cmp(x,y)"},
1682 {0}
1683};
1684
1685static struct wrapperbase tab_repr[] = {
1686 {"__repr__", (wrapperfunc)wrap_unaryfunc,
1687 "x.__repr__() <==> repr(x)"},
1688 {0}
1689};
1690
1691static struct wrapperbase tab_getattr[] = {
1692 {"__getattr__", (wrapperfunc)wrap_binaryfunc,
1693 "x.__getattr__('name') <==> x.name"},
1694 {0}
1695};
1696
1697static PyObject *
1698wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
1699{
1700 setattrofunc func = (setattrofunc)wrapped;
1701 int res;
1702 PyObject *name, *value;
1703
1704 if (!PyArg_ParseTuple(args, "OO", &name, &value))
1705 return NULL;
1706 res = (*func)(self, name, value);
1707 if (res < 0)
1708 return NULL;
1709 Py_INCREF(Py_None);
1710 return Py_None;
1711}
1712
1713static PyObject *
1714wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
1715{
1716 setattrofunc func = (setattrofunc)wrapped;
1717 int res;
1718 PyObject *name;
1719
1720 if (!PyArg_ParseTuple(args, "O", &name))
1721 return NULL;
1722 res = (*func)(self, name, NULL);
1723 if (res < 0)
1724 return NULL;
1725 Py_INCREF(Py_None);
1726 return Py_None;
1727}
1728
1729static struct wrapperbase tab_setattr[] = {
1730 {"__setattr__", (wrapperfunc)wrap_setattr,
1731 "x.__setattr__('name', value) <==> x.name = value"},
1732 {"__delattr__", (wrapperfunc)wrap_delattr,
1733 "x.__delattr__('name') <==> del x.name"},
1734 {0}
1735};
1736
1737static PyObject *
1738wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
1739{
1740 hashfunc func = (hashfunc)wrapped;
1741 long res;
1742
1743 if (!PyArg_ParseTuple(args, ""))
1744 return NULL;
1745 res = (*func)(self);
1746 if (res == -1 && PyErr_Occurred())
1747 return NULL;
1748 return PyInt_FromLong(res);
1749}
1750
1751static struct wrapperbase tab_hash[] = {
1752 {"__hash__", (wrapperfunc)wrap_hashfunc,
1753 "x.__hash__() <==> hash(x)"},
1754 {0}
1755};
1756
1757static PyObject *
1758wrap_call(PyObject *self, PyObject *args, void *wrapped)
1759{
1760 ternaryfunc func = (ternaryfunc)wrapped;
1761
1762 /* XXX What about keyword arguments? */
1763 return (*func)(self, args, NULL);
1764}
1765
1766static struct wrapperbase tab_call[] = {
1767 {"__call__", (wrapperfunc)wrap_call,
1768 "x.__call__(...) <==> x(...)"},
1769 {0}
1770};
1771
1772static struct wrapperbase tab_str[] = {
1773 {"__str__", (wrapperfunc)wrap_unaryfunc,
1774 "x.__str__() <==> str(x)"},
1775 {0}
1776};
1777
1778static PyObject *
1779wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
1780{
1781 richcmpfunc func = (richcmpfunc)wrapped;
1782 PyObject *other;
1783
1784 if (!PyArg_ParseTuple(args, "O", &other))
1785 return NULL;
1786 return (*func)(self, other, op);
1787}
1788
1789#undef RICHCMP_WRAPPER
1790#define RICHCMP_WRAPPER(NAME, OP) \
1791static PyObject * \
1792richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
1793{ \
1794 return wrap_richcmpfunc(self, args, wrapped, OP); \
1795}
1796
Jack Jansen8e938b42001-08-08 15:29:49 +00001797RICHCMP_WRAPPER(lt, Py_LT)
1798RICHCMP_WRAPPER(le, Py_LE)
1799RICHCMP_WRAPPER(eq, Py_EQ)
1800RICHCMP_WRAPPER(ne, Py_NE)
1801RICHCMP_WRAPPER(gt, Py_GT)
1802RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001803
1804#undef RICHCMP_ENTRY
1805#define RICHCMP_ENTRY(NAME, EXPR) \
1806 {"__" #NAME "__", (wrapperfunc)richcmp_##NAME, \
1807 "x.__" #NAME "__(y) <==> " EXPR}
1808
1809static struct wrapperbase tab_richcmp[] = {
1810 RICHCMP_ENTRY(lt, "x<y"),
1811 RICHCMP_ENTRY(le, "x<=y"),
1812 RICHCMP_ENTRY(eq, "x==y"),
1813 RICHCMP_ENTRY(ne, "x!=y"),
1814 RICHCMP_ENTRY(gt, "x>y"),
1815 RICHCMP_ENTRY(ge, "x>=y"),
1816 {0}
1817};
1818
1819static struct wrapperbase tab_iter[] = {
1820 {"__iter__", (wrapperfunc)wrap_unaryfunc, "x.__iter__() <==> iter(x)"},
1821 {0}
1822};
1823
1824static PyObject *
1825wrap_next(PyObject *self, PyObject *args, void *wrapped)
1826{
1827 unaryfunc func = (unaryfunc)wrapped;
1828 PyObject *res;
1829
1830 if (!PyArg_ParseTuple(args, ""))
1831 return NULL;
1832 res = (*func)(self);
1833 if (res == NULL && !PyErr_Occurred())
1834 PyErr_SetNone(PyExc_StopIteration);
1835 return res;
1836}
1837
1838static struct wrapperbase tab_next[] = {
1839 {"next", (wrapperfunc)wrap_next,
1840 "x.next() -> the next value, or raise StopIteration"},
1841 {0}
1842};
1843
1844static PyObject *
1845wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
1846{
1847 descrgetfunc func = (descrgetfunc)wrapped;
1848 PyObject *obj;
1849 PyObject *type = NULL;
1850
1851 if (!PyArg_ParseTuple(args, "O|O", &obj, &type))
1852 return NULL;
1853 if (type == NULL)
1854 type = (PyObject *)obj->ob_type;
1855 return (*func)(self, obj, type);
1856}
1857
1858static struct wrapperbase tab_descr_get[] = {
1859 {"__get__", (wrapperfunc)wrap_descr_get,
1860 "descr.__get__(obj, type) -> value"},
1861 {0}
1862};
1863
1864static PyObject *
1865wrap_descrsetfunc(PyObject *self, PyObject *args, void *wrapped)
1866{
1867 descrsetfunc func = (descrsetfunc)wrapped;
1868 PyObject *obj, *value;
1869 int ret;
1870
1871 if (!PyArg_ParseTuple(args, "OO", &obj, &value))
1872 return NULL;
1873 ret = (*func)(self, obj, value);
1874 if (ret < 0)
1875 return NULL;
1876 Py_INCREF(Py_None);
1877 return Py_None;
1878}
1879
1880static struct wrapperbase tab_descr_set[] = {
1881 {"__set__", (wrapperfunc)wrap_descrsetfunc,
1882 "descr.__set__(obj, value)"},
1883 {0}
1884};
1885
1886static PyObject *
1887wrap_init(PyObject *self, PyObject *args, void *wrapped)
1888{
1889 initproc func = (initproc)wrapped;
1890
1891 /* XXX What about keyword arguments? */
1892 if (func(self, args, NULL) < 0)
1893 return NULL;
1894 Py_INCREF(Py_None);
1895 return Py_None;
1896}
1897
1898static struct wrapperbase tab_init[] = {
1899 {"__init__", (wrapperfunc)wrap_init,
1900 "x.__init__(...) initializes x; "
1901 "see x.__type__.__doc__ for signature"},
1902 {0}
1903};
1904
1905static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001906tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001907{
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001908 PyTypeObject *type, *subtype;
1909 PyObject *arg0, *res;
1910
1911 if (self == NULL || !PyType_Check(self))
1912 Py_FatalError("__new__() called with non-type 'self'");
1913 type = (PyTypeObject *)self;
1914 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
1915 PyErr_SetString(PyExc_TypeError,
1916 "T.__new__(): not enough arguments");
1917 return NULL;
1918 }
1919 arg0 = PyTuple_GET_ITEM(args, 0);
1920 if (!PyType_Check(arg0)) {
1921 PyErr_SetString(PyExc_TypeError,
1922 "T.__new__(S): S is not a type object");
1923 return NULL;
1924 }
1925 subtype = (PyTypeObject *)arg0;
1926 if (!PyType_IsSubtype(subtype, type)) {
1927 PyErr_SetString(PyExc_TypeError,
1928 "T.__new__(S): S is not a subtype of T");
1929 return NULL;
1930 }
1931 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
1932 if (args == NULL)
1933 return NULL;
1934 res = type->tp_new(subtype, args, kwds);
1935 Py_DECREF(args);
1936 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001937}
1938
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001939static struct PyMethodDef tp_new_methoddef[] = {
1940 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
1941 "T.__new__(S, ...) -> a new object with type S, a subtype of T"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001942 {0}
1943};
1944
1945static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001946add_tp_new_wrapper(PyTypeObject *type)
1947{
Guido van Rossumf040ede2001-08-07 16:40:56 +00001948 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001949
Guido van Rossumf040ede2001-08-07 16:40:56 +00001950 if (PyDict_GetItemString(type->tp_defined, "__new__") != NULL)
1951 return 0;
1952 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001953 if (func == NULL)
1954 return -1;
1955 return PyDict_SetItemString(type->tp_defined, "__new__", func);
1956}
1957
Guido van Rossum13d52f02001-08-10 21:24:08 +00001958static int
1959add_wrappers(PyTypeObject *type, struct wrapperbase *wraps, void *wrapped)
1960{
1961 PyObject *dict = type->tp_defined;
1962
1963 for (; wraps->name != NULL; wraps++) {
1964 PyObject *descr;
1965 if (PyDict_GetItemString(dict, wraps->name))
1966 continue;
1967 descr = PyDescr_NewWrapper(type, wraps, wrapped);
1968 if (descr == NULL)
1969 return -1;
1970 if (PyDict_SetItemString(dict, wraps->name, descr) < 0)
1971 return -1;
1972 Py_DECREF(descr);
1973 }
1974 return 0;
1975}
1976
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001977/* This function is called by PyType_Ready() to populate the type's
Guido van Rossumf040ede2001-08-07 16:40:56 +00001978 dictionary with method descriptors for function slots. For each
1979 function slot (like tp_repr) that's defined in the type, one or
1980 more corresponding descriptors are added in the type's tp_defined
1981 dictionary under the appropriate name (like __repr__). Some
1982 function slots cause more than one descriptor to be added (for
1983 example, the nb_add slot adds both __add__ and __radd__
1984 descriptors) and some function slots compete for the same
1985 descriptor (for example both sq_item and mp_subscript generate a
1986 __getitem__ descriptor). This only adds new descriptors and
1987 doesn't overwrite entries in tp_defined that were previously
1988 defined. The descriptors contain a reference to the C function
1989 they must call, so that it's safe if they are copied into a
1990 subtype's __dict__ and the subtype has a different C function in
1991 its slot -- calling the method defined by the descriptor will call
1992 the C function that was used to create it, rather than the C
1993 function present in the slot when it is called. (This is important
1994 because a subtype may have a C function in the slot that calls the
1995 method from the dictionary, and we want to avoid infinite recursion
1996 here.) */
1997
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001998static int
Tim Peters6d6c1a32001-08-02 04:15:00 +00001999add_operators(PyTypeObject *type)
2000{
2001 PySequenceMethods *sq;
2002 PyMappingMethods *mp;
2003 PyNumberMethods *nb;
2004
2005#undef ADD
2006#define ADD(SLOT, TABLE) \
2007 if (SLOT) { \
2008 if (add_wrappers(type, TABLE, (void *)(SLOT)) < 0) \
2009 return -1; \
2010 }
2011
2012 if ((sq = type->tp_as_sequence) != NULL) {
2013 ADD(sq->sq_length, tab_len);
2014 ADD(sq->sq_concat, tab_concat);
2015 ADD(sq->sq_repeat, tab_mul_int);
2016 ADD(sq->sq_item, tab_getitem_int);
2017 ADD(sq->sq_slice, tab_getslice);
2018 ADD(sq->sq_ass_item, tab_setitem_int);
2019 ADD(sq->sq_ass_slice, tab_setslice);
2020 ADD(sq->sq_contains, tab_contains);
2021 ADD(sq->sq_inplace_concat, tab_iadd);
2022 ADD(sq->sq_inplace_repeat, tab_imul_int);
2023 }
2024
2025 if ((mp = type->tp_as_mapping) != NULL) {
2026 if (sq->sq_length == NULL)
2027 ADD(mp->mp_length, tab_len);
2028 ADD(mp->mp_subscript, tab_getitem);
2029 ADD(mp->mp_ass_subscript, tab_setitem);
2030 }
2031
2032 /* We don't support "old-style numbers" because their binary
2033 operators require that both arguments have the same type;
2034 the wrappers here only work for new-style numbers. */
2035 if ((type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
2036 (nb = type->tp_as_number) != NULL) {
2037 ADD(nb->nb_add, tab_add);
2038 ADD(nb->nb_subtract, tab_sub);
2039 ADD(nb->nb_multiply, tab_mul);
2040 ADD(nb->nb_divide, tab_div);
2041 ADD(nb->nb_remainder, tab_mod);
2042 ADD(nb->nb_divmod, tab_divmod);
2043 ADD(nb->nb_power, tab_pow);
2044 ADD(nb->nb_negative, tab_neg);
2045 ADD(nb->nb_positive, tab_pos);
2046 ADD(nb->nb_absolute, tab_abs);
2047 ADD(nb->nb_nonzero, tab_nonzero);
2048 ADD(nb->nb_invert, tab_invert);
2049 ADD(nb->nb_lshift, tab_lshift);
2050 ADD(nb->nb_rshift, tab_rshift);
2051 ADD(nb->nb_and, tab_and);
2052 ADD(nb->nb_xor, tab_xor);
2053 ADD(nb->nb_or, tab_or);
2054 /* We don't support coerce() -- see above comment */
2055 ADD(nb->nb_int, tab_int);
2056 ADD(nb->nb_long, tab_long);
2057 ADD(nb->nb_float, tab_float);
2058 ADD(nb->nb_oct, tab_oct);
2059 ADD(nb->nb_hex, tab_hex);
2060 ADD(nb->nb_inplace_add, tab_iadd);
2061 ADD(nb->nb_inplace_subtract, tab_isub);
2062 ADD(nb->nb_inplace_multiply, tab_imul);
2063 ADD(nb->nb_inplace_divide, tab_idiv);
2064 ADD(nb->nb_inplace_remainder, tab_imod);
2065 ADD(nb->nb_inplace_power, tab_ipow);
2066 ADD(nb->nb_inplace_lshift, tab_ilshift);
2067 ADD(nb->nb_inplace_rshift, tab_irshift);
2068 ADD(nb->nb_inplace_and, tab_iand);
2069 ADD(nb->nb_inplace_xor, tab_ixor);
2070 ADD(nb->nb_inplace_or, tab_ior);
2071 }
2072
2073 ADD(type->tp_getattro, tab_getattr);
2074 ADD(type->tp_setattro, tab_setattr);
2075 ADD(type->tp_compare, tab_cmp);
2076 ADD(type->tp_repr, tab_repr);
2077 ADD(type->tp_hash, tab_hash);
2078 ADD(type->tp_call, tab_call);
2079 ADD(type->tp_str, tab_str);
2080 ADD(type->tp_richcompare, tab_richcmp);
2081 ADD(type->tp_iter, tab_iter);
2082 ADD(type->tp_iternext, tab_next);
2083 ADD(type->tp_descr_get, tab_descr_get);
2084 ADD(type->tp_descr_set, tab_descr_set);
2085 ADD(type->tp_init, tab_init);
2086
Guido van Rossumf040ede2001-08-07 16:40:56 +00002087 if (type->tp_new != NULL) {
2088 if (add_tp_new_wrapper(type) < 0)
2089 return -1;
2090 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002091
2092 return 0;
2093}
2094
Guido van Rossumf040ede2001-08-07 16:40:56 +00002095/* Slot wrappers that call the corresponding __foo__ slot. See comments
2096 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002097
Guido van Rossumdc91b992001-08-08 22:26:22 +00002098#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002099static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002100FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002101{ \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002102 return PyObject_CallMethod(self, OPSTR, ""); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002103}
2104
Guido van Rossumdc91b992001-08-08 22:26:22 +00002105#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002106static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002107FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002108{ \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002109 return PyObject_CallMethod(self, OPSTR, ARGCODES, arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002110}
2111
Guido van Rossumdc91b992001-08-08 22:26:22 +00002112
2113#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002114static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002115FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002116{ \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002117 if (self->ob_type->tp_as_number != NULL && \
2118 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
2119 PyObject *r; \
2120 r = PyObject_CallMethod( \
2121 self, OPSTR, "O", other); \
2122 if (r != Py_NotImplemented || \
2123 other->ob_type == self->ob_type) \
2124 return r; \
2125 Py_DECREF(r); \
2126 } \
2127 if (other->ob_type->tp_as_number != NULL && \
2128 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
2129 return PyObject_CallMethod( \
2130 other, ROPSTR, "O", self); \
2131 } \
2132 Py_INCREF(Py_NotImplemented); \
2133 return Py_NotImplemented; \
2134}
2135
2136#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
2137 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
2138
2139#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
2140static PyObject * \
2141FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
2142{ \
2143 return PyObject_CallMethod(self, OPSTR, ARGCODES, arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002144}
2145
2146static int
2147slot_sq_length(PyObject *self)
2148{
2149 PyObject *res = PyObject_CallMethod(self, "__len__", "");
2150
2151 if (res == NULL)
2152 return -1;
2153 return (int)PyInt_AsLong(res);
2154}
2155
Guido van Rossumdc91b992001-08-08 22:26:22 +00002156SLOT1(slot_sq_concat, "__add__", PyObject *, "O")
2157SLOT1(slot_sq_repeat, "__mul__", int, "i")
2158SLOT1(slot_sq_item, "__getitem__", int, "i")
2159SLOT2(slot_sq_slice, "__getslice__", int, int, "ii")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002160
2161static int
2162slot_sq_ass_item(PyObject *self, int index, PyObject *value)
2163{
2164 PyObject *res;
2165
2166 if (value == NULL)
2167 res = PyObject_CallMethod(self, "__delitem__", "i", index);
2168 else
2169 res = PyObject_CallMethod(self, "__setitem__",
2170 "iO", index, value);
2171 if (res == NULL)
2172 return -1;
2173 Py_DECREF(res);
2174 return 0;
2175}
2176
2177static int
2178slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value)
2179{
2180 PyObject *res;
2181
2182 if (value == NULL)
2183 res = PyObject_CallMethod(self, "__delslice__", "ii", i, j);
2184 else
2185 res = PyObject_CallMethod(self, "__setslice__",
2186 "iiO", i, j, value);
2187 if (res == NULL)
2188 return -1;
2189 Py_DECREF(res);
2190 return 0;
2191}
2192
2193static int
2194slot_sq_contains(PyObject *self, PyObject *value)
2195{
2196 PyObject *res = PyObject_CallMethod(self, "__contains__", "O", value);
2197 int r;
2198
2199 if (res == NULL)
2200 return -1;
2201 r = PyInt_AsLong(res);
2202 Py_DECREF(res);
2203 return r;
2204}
2205
Guido van Rossumdc91b992001-08-08 22:26:22 +00002206SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
2207SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002208
2209#define slot_mp_length slot_sq_length
2210
Guido van Rossumdc91b992001-08-08 22:26:22 +00002211SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002212
2213static int
2214slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
2215{
2216 PyObject *res;
2217
2218 if (value == NULL)
2219 res = PyObject_CallMethod(self, "__delitem__", "O", key);
2220 else
2221 res = PyObject_CallMethod(self, "__setitem__",
2222 "OO", key, value);
2223 if (res == NULL)
2224 return -1;
2225 Py_DECREF(res);
2226 return 0;
2227}
2228
Guido van Rossumdc91b992001-08-08 22:26:22 +00002229SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
2230SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
2231SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
2232SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
2233SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
2234SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
2235
2236staticforward PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
2237
2238SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
2239 nb_power, "__pow__", "__rpow__")
2240
2241static PyObject *
2242slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
2243{
2244 if (modulus == Py_None)
2245 return slot_nb_power_binary(self, other);
2246 /* Three-arg power doesn't use __rpow__ */
2247 return PyObject_CallMethod(self, "__pow__", "OO", other, modulus);
2248}
2249
2250SLOT0(slot_nb_negative, "__neg__")
2251SLOT0(slot_nb_positive, "__pos__")
2252SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002253
2254static int
2255slot_nb_nonzero(PyObject *self)
2256{
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002257 /* XXX This should cope with a missing __nonzero__ */
2258 /* XXX Should it also look for __len__? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002259 PyObject *res = PyObject_CallMethod(self, "__nonzero__", "");
2260
2261 if (res == NULL)
2262 return -1;
2263 return (int)PyInt_AsLong(res);
2264}
2265
Guido van Rossumdc91b992001-08-08 22:26:22 +00002266SLOT0(slot_nb_invert, "__invert__")
2267SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
2268SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
2269SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
2270SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
2271SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002272/* Not coerce() */
Guido van Rossumdc91b992001-08-08 22:26:22 +00002273SLOT0(slot_nb_int, "__int__")
2274SLOT0(slot_nb_long, "__long__")
2275SLOT0(slot_nb_float, "__float__")
2276SLOT0(slot_nb_oct, "__oct__")
2277SLOT0(slot_nb_hex, "__hex__")
2278SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
2279SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
2280SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
2281SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
2282SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
2283SLOT2(slot_nb_inplace_power, "__ipow__", PyObject *, PyObject *, "OO")
2284SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
2285SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
2286SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
2287SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
2288SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
2289SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
2290 "__floordiv__", "__rfloordiv__")
2291SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
2292SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
2293SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002294
2295static int
2296slot_tp_compare(PyObject *self, PyObject *other)
2297{
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002298 /* XXX Should this cope with a missing __cmp__? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002299 PyObject *res = PyObject_CallMethod(self, "__cmp__", "O", other);
2300 long r;
2301
2302 if (res == NULL)
2303 return -1;
2304 r = PyInt_AsLong(res);
2305 Py_DECREF(res);
2306 return (int)r;
2307}
2308
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002309/* XXX This should cope with a missing __repr__, and also look for __str__ */
Guido van Rossumdc91b992001-08-08 22:26:22 +00002310SLOT0(slot_tp_repr, "__repr__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002311
2312static long
2313slot_tp_hash(PyObject *self)
2314{
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002315 /* XXX This should cope with a missing __hash__ */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002316 PyObject *res = PyObject_CallMethod(self, "__hash__", "");
2317 long h;
2318
2319 if (res == NULL)
2320 return -1;
2321 h = PyInt_AsLong(res);
2322 if (h == -1 && !PyErr_Occurred())
2323 h = -2;
2324 return h;
2325}
2326
2327static PyObject *
2328slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
2329{
2330 PyObject *meth = PyObject_GetAttrString(self, "__call__");
2331 PyObject *res;
2332
2333 if (meth == NULL)
2334 return NULL;
2335 res = PyObject_Call(meth, args, kwds);
2336 Py_DECREF(meth);
2337 return res;
2338}
2339
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002340/* XXX This should cope with a missing __str__, and also look for __repr__ */
Guido van Rossumdc91b992001-08-08 22:26:22 +00002341SLOT0(slot_tp_str, "__str__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002342
2343static PyObject *
2344slot_tp_getattro(PyObject *self, PyObject *name)
2345{
2346 PyTypeObject *tp = self->ob_type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002347 PyObject *getattr;
Guido van Rossum8e248182001-08-12 05:17:56 +00002348 static PyObject *getattr_str = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002349
Guido van Rossum8e248182001-08-12 05:17:56 +00002350 if (getattr_str == NULL) {
2351 getattr_str = PyString_InternFromString("__getattr__");
2352 if (getattr_str == NULL)
2353 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002354 }
Guido van Rossum8e248182001-08-12 05:17:56 +00002355 getattr = _PyType_Lookup(tp, getattr_str);
2356 if (getattr == NULL)
2357 return PyObject_GenericGetAttr(self, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002358 return PyObject_CallFunction(getattr, "OO", self, name);
2359}
2360
2361static int
2362slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
2363{
2364 PyObject *res;
2365
2366 if (value == NULL)
2367 res = PyObject_CallMethod(self, "__delattr__", "O", name);
2368 else
2369 res = PyObject_CallMethod(self, "__setattr__",
2370 "OO", name, value);
2371 if (res == NULL)
2372 return -1;
2373 Py_DECREF(res);
2374 return 0;
2375}
2376
2377/* Map rich comparison operators to their __xx__ namesakes */
2378static char *name_op[] = {
2379 "__lt__",
2380 "__le__",
2381 "__eq__",
2382 "__ne__",
2383 "__gt__",
2384 "__ge__",
2385};
2386
2387static PyObject *
2388slot_tp_richcompare(PyObject *self, PyObject *other, int op)
2389{
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002390 /* XXX How should this cope with missing __xx__? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002391 PyObject *meth = PyObject_GetAttrString(self, name_op[op]);
2392 PyObject *res;
2393
2394 if (meth == NULL)
2395 return NULL;
2396 res = PyObject_CallFunction(meth, "O", other);
2397 Py_DECREF(meth);
2398 return res;
2399}
2400
Guido van Rossumdc91b992001-08-08 22:26:22 +00002401SLOT0(slot_tp_iter, "__iter__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002402
2403static PyObject *
2404slot_tp_iternext(PyObject *self)
2405{
2406 return PyObject_CallMethod(self, "next", "");
2407}
2408
Guido van Rossumdc91b992001-08-08 22:26:22 +00002409SLOT2(slot_tp_descr_get, "__get__", PyObject *, PyObject *, "OO")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002410
2411static int
2412slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
2413{
2414 PyObject *res = PyObject_CallMethod(self, "__set__",
2415 "OO", target, value);
2416 if (res == NULL)
2417 return -1;
2418 Py_DECREF(res);
2419 return 0;
2420}
2421
2422static int
2423slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
2424{
2425 PyObject *meth = PyObject_GetAttrString(self, "__init__");
2426 PyObject *res;
2427
2428 if (meth == NULL)
2429 return -1;
2430 res = PyObject_Call(meth, args, kwds);
2431 Py_DECREF(meth);
2432 if (res == NULL)
2433 return -1;
2434 Py_DECREF(res);
2435 return 0;
2436}
2437
2438static PyObject *
2439slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2440{
2441 PyObject *func = PyObject_GetAttrString((PyObject *)type, "__new__");
2442 PyObject *newargs, *x;
2443 int i, n;
2444
2445 if (func == NULL)
2446 return NULL;
2447 assert(PyTuple_Check(args));
2448 n = PyTuple_GET_SIZE(args);
2449 newargs = PyTuple_New(n+1);
2450 if (newargs == NULL)
2451 return NULL;
2452 Py_INCREF(type);
2453 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
2454 for (i = 0; i < n; i++) {
2455 x = PyTuple_GET_ITEM(args, i);
2456 Py_INCREF(x);
2457 PyTuple_SET_ITEM(newargs, i+1, x);
2458 }
2459 x = PyObject_Call(func, newargs, kwds);
2460 Py_DECREF(func);
2461 return x;
2462}
2463
Guido van Rossumf040ede2001-08-07 16:40:56 +00002464/* This is called at the very end of type_new() (even after
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002465 PyType_Ready()) to complete the initialization of dynamic types.
Guido van Rossumf040ede2001-08-07 16:40:56 +00002466 The dict argument is the dictionary argument passed to type_new(),
2467 which is the local namespace of the class statement, in other
2468 words, it contains the methods. For each special method (like
2469 __repr__) defined in the dictionary, the corresponding function
2470 slot in the type object (like tp_repr) is set to a special function
2471 whose name is 'slot_' followed by the slot name and whose signature
2472 is whatever is required for that slot. These slot functions look
2473 up the corresponding method in the type's dictionary and call it.
2474 The slot functions have to take care of the various peculiarities
2475 of the mapping between slots and special methods, such as mapping
2476 one slot to multiple methods (tp_richcompare <--> __le__, __lt__
2477 etc.) or mapping multiple slots to a single method (sq_item,
2478 mp_subscript <--> __getitem__). */
2479
Tim Peters6d6c1a32001-08-02 04:15:00 +00002480static void
2481override_slots(PyTypeObject *type, PyObject *dict)
2482{
2483 PySequenceMethods *sq = type->tp_as_sequence;
2484 PyMappingMethods *mp = type->tp_as_mapping;
2485 PyNumberMethods *nb = type->tp_as_number;
2486
Guido van Rossumdc91b992001-08-08 22:26:22 +00002487#define SQSLOT(OPNAME, SLOTNAME, FUNCNAME) \
Guido van Rossum8e248182001-08-12 05:17:56 +00002488 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002489 sq->SLOTNAME = FUNCNAME; \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002490 }
2491
Guido van Rossumdc91b992001-08-08 22:26:22 +00002492#define MPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
Guido van Rossum8e248182001-08-12 05:17:56 +00002493 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002494 mp->SLOTNAME = FUNCNAME; \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002495 }
2496
Guido van Rossumdc91b992001-08-08 22:26:22 +00002497#define NBSLOT(OPNAME, SLOTNAME, FUNCNAME) \
Guido van Rossum8e248182001-08-12 05:17:56 +00002498 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002499 nb->SLOTNAME = FUNCNAME; \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002500 }
2501
Guido van Rossumdc91b992001-08-08 22:26:22 +00002502#define TPSLOT(OPNAME, SLOTNAME, FUNCNAME) \
Guido van Rossum8e248182001-08-12 05:17:56 +00002503 if (dict == NULL || PyDict_GetItemString(dict, OPNAME)) { \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002504 type->SLOTNAME = FUNCNAME; \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002505 }
2506
Guido van Rossumdc91b992001-08-08 22:26:22 +00002507 SQSLOT("__len__", sq_length, slot_sq_length);
2508 SQSLOT("__add__", sq_concat, slot_sq_concat);
2509 SQSLOT("__mul__", sq_repeat, slot_sq_repeat);
2510 SQSLOT("__getitem__", sq_item, slot_sq_item);
2511 SQSLOT("__getslice__", sq_slice, slot_sq_slice);
2512 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item);
2513 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item);
2514 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice);
2515 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice);
2516 SQSLOT("__contains__", sq_contains, slot_sq_contains);
2517 SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat);
2518 SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002519
Guido van Rossumdc91b992001-08-08 22:26:22 +00002520 MPSLOT("__len__", mp_length, slot_mp_length);
2521 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript);
2522 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript);
2523 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002524
Guido van Rossumdc91b992001-08-08 22:26:22 +00002525 NBSLOT("__add__", nb_add, slot_nb_add);
2526 NBSLOT("__sub__", nb_subtract, slot_nb_subtract);
2527 NBSLOT("__mul__", nb_multiply, slot_nb_multiply);
2528 NBSLOT("__div__", nb_divide, slot_nb_divide);
2529 NBSLOT("__mod__", nb_remainder, slot_nb_remainder);
2530 NBSLOT("__divmod__", nb_divmod, slot_nb_divmod);
2531 NBSLOT("__pow__", nb_power, slot_nb_power);
2532 NBSLOT("__neg__", nb_negative, slot_nb_negative);
2533 NBSLOT("__pos__", nb_positive, slot_nb_positive);
2534 NBSLOT("__abs__", nb_absolute, slot_nb_absolute);
2535 NBSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero);
2536 NBSLOT("__invert__", nb_invert, slot_nb_invert);
2537 NBSLOT("__lshift__", nb_lshift, slot_nb_lshift);
2538 NBSLOT("__rshift__", nb_rshift, slot_nb_rshift);
2539 NBSLOT("__and__", nb_and, slot_nb_and);
2540 NBSLOT("__xor__", nb_xor, slot_nb_xor);
2541 NBSLOT("__or__", nb_or, slot_nb_or);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002542 /* Not coerce() */
Guido van Rossumdc91b992001-08-08 22:26:22 +00002543 NBSLOT("__int__", nb_int, slot_nb_int);
2544 NBSLOT("__long__", nb_long, slot_nb_long);
2545 NBSLOT("__float__", nb_float, slot_nb_float);
2546 NBSLOT("__oct__", nb_oct, slot_nb_oct);
2547 NBSLOT("__hex__", nb_hex, slot_nb_hex);
2548 NBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add);
2549 NBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract);
2550 NBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply);
2551 NBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide);
2552 NBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder);
2553 NBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power);
2554 NBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift);
2555 NBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift);
2556 NBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and);
2557 NBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor);
2558 NBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or);
2559 NBSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide);
2560 NBSLOT("__truediv__", nb_true_divide, slot_nb_true_divide);
2561 NBSLOT("__ifloordiv__", nb_inplace_floor_divide,
2562 slot_nb_inplace_floor_divide);
2563 NBSLOT("__itruediv__", nb_inplace_true_divide,
2564 slot_nb_inplace_true_divide);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002565
Guido van Rossum8e248182001-08-12 05:17:56 +00002566 if (dict == NULL ||
2567 PyDict_GetItemString(dict, "__str__") ||
Tim Peters6d6c1a32001-08-02 04:15:00 +00002568 PyDict_GetItemString(dict, "__repr__"))
2569 type->tp_print = NULL;
2570
Guido van Rossumdc91b992001-08-08 22:26:22 +00002571 TPSLOT("__cmp__", tp_compare, slot_tp_compare);
2572 TPSLOT("__repr__", tp_repr, slot_tp_repr);
2573 TPSLOT("__hash__", tp_hash, slot_tp_hash);
2574 TPSLOT("__call__", tp_call, slot_tp_call);
2575 TPSLOT("__str__", tp_str, slot_tp_str);
2576 TPSLOT("__getattr__", tp_getattro, slot_tp_getattro);
2577 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro);
2578 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare);
2579 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare);
2580 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare);
2581 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare);
2582 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare);
2583 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare);
2584 TPSLOT("__iter__", tp_iter, slot_tp_iter);
2585 TPSLOT("next", tp_iternext, slot_tp_iternext);
2586 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get);
2587 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set);
2588 TPSLOT("__init__", tp_init, slot_tp_init);
2589 TPSLOT("__new__", tp_new, slot_tp_new);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002590}