blob: 6243e81e71af9e1e800fe9689eb2c184c5c2780a [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
Guido van Rossum6f799372001-09-20 20:46:19 +00007static PyMemberDef type_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +00008 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
9 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
10 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
11 {"__doc__", T_STRING, offsetof(PyTypeObject, tp_doc), READONLY},
Guido van Rossum9676b222001-08-17 20:32:36 +000012 {"__weakrefoffset__", T_LONG,
Tim Peters6d6c1a32001-08-02 04:15:00 +000013 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
14 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
15 {"__dictoffset__", T_LONG,
16 offsetof(PyTypeObject, tp_dictoffset), READONLY},
17 {"__bases__", T_OBJECT, offsetof(PyTypeObject, tp_bases), READONLY},
18 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
19 {0}
20};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000021
Guido van Rossumc0b618a1997-05-02 03:12:38 +000022static PyObject *
Guido van Rossumc3542212001-08-16 09:18:56 +000023type_name(PyTypeObject *type, void *context)
24{
25 char *s;
26
27 s = strrchr(type->tp_name, '.');
28 if (s == NULL)
29 s = type->tp_name;
30 else
31 s++;
32 return PyString_FromString(s);
33}
34
35static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000036type_module(PyTypeObject *type, void *context)
Guido van Rossum29ca26e1995-01-07 11:58:15 +000037{
Guido van Rossumc3542212001-08-16 09:18:56 +000038 PyObject *mod;
39 char *s;
40
41 s = strrchr(type->tp_name, '.');
42 if (s != NULL)
43 return PyString_FromStringAndSize(type->tp_name,
44 (int)(s - type->tp_name));
45 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
46 return PyString_FromString("__builtin__");
Guido van Rossum687ae002001-10-15 22:03:32 +000047 mod = PyDict_GetItemString(type->tp_dict, "__module__");
Guido van Rossumc3542212001-08-16 09:18:56 +000048 if (mod != NULL && PyString_Check(mod)) {
49 Py_INCREF(mod);
50 return mod;
51 }
52 PyErr_SetString(PyExc_AttributeError, "__module__");
53 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +000054}
55
Guido van Rossum3926a632001-09-25 16:25:58 +000056static int
57type_set_module(PyTypeObject *type, PyObject *value, void *context)
58{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000059 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
Guido van Rossum3926a632001-09-25 16:25:58 +000060 strrchr(type->tp_name, '.')) {
61 PyErr_Format(PyExc_TypeError,
62 "can't set %s.__module__", type->tp_name);
63 return -1;
64 }
65 if (!value) {
66 PyErr_Format(PyExc_TypeError,
67 "can't delete %s.__module__", type->tp_name);
68 return -1;
69 }
70 return PyDict_SetItemString(type->tp_dict, "__module__", value);
71}
72
Tim Peters6d6c1a32001-08-02 04:15:00 +000073static PyObject *
74type_dict(PyTypeObject *type, void *context)
75{
76 if (type->tp_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000077 Py_INCREF(Py_None);
78 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +000079 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000080 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +000081}
82
Neil Schemenauerf23473f2001-10-21 22:28:58 +000083static PyGetSetDef type_getsets[] = {
Guido van Rossumc3542212001-08-16 09:18:56 +000084 {"__name__", (getter)type_name, NULL, NULL},
Guido van Rossum3926a632001-09-25 16:25:58 +000085 {"__module__", (getter)type_module, (setter)type_set_module, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +000086 {"__dict__", (getter)type_dict, NULL, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +000087 {0}
88};
89
Martin v. Löwis0163d6d2001-06-09 07:34:05 +000090static int
91type_compare(PyObject *v, PyObject *w)
92{
93 /* This is called with type objects only. So we
94 can just compare the addresses. */
95 Py_uintptr_t vv = (Py_uintptr_t)v;
96 Py_uintptr_t ww = (Py_uintptr_t)w;
97 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
98}
99
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000101type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000102{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000103 PyObject *mod, *name, *rtn;
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000104 char *kind;
Guido van Rossumc3542212001-08-16 09:18:56 +0000105
106 mod = type_module(type, NULL);
107 if (mod == NULL)
108 PyErr_Clear();
109 else if (!PyString_Check(mod)) {
110 Py_DECREF(mod);
111 mod = NULL;
112 }
113 name = type_name(type, NULL);
114 if (name == NULL)
115 return NULL;
Barry Warsaw7ce36942001-08-24 18:34:26 +0000116
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000117 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
118 kind = "class";
119 else
120 kind = "type";
121
Barry Warsaw7ce36942001-08-24 18:34:26 +0000122 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000123 rtn = PyString_FromFormat("<%s '%s.%s'>",
124 kind,
Barry Warsaw7ce36942001-08-24 18:34:26 +0000125 PyString_AS_STRING(mod),
126 PyString_AS_STRING(name));
127 }
Guido van Rossumc3542212001-08-16 09:18:56 +0000128 else
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000129 rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000130
Guido van Rossumc3542212001-08-16 09:18:56 +0000131 Py_XDECREF(mod);
132 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000133 return rtn;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000134}
135
Tim Peters6d6c1a32001-08-02 04:15:00 +0000136static PyObject *
137type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
138{
139 PyObject *obj;
140
141 if (type->tp_new == NULL) {
142 PyErr_Format(PyExc_TypeError,
143 "cannot create '%.100s' instances",
144 type->tp_name);
145 return NULL;
146 }
147
Tim Peters3f996e72001-09-13 19:18:27 +0000148 obj = type->tp_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000149 if (obj != NULL) {
Guido van Rossumf76de622001-10-18 15:49:21 +0000150 /* Ugly exception: when the call was type(something),
151 don't call tp_init on the result. */
152 if (type == &PyType_Type &&
153 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
154 (kwds == NULL ||
155 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
156 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000157 type = obj->ob_type;
158 if (type->tp_init != NULL &&
159 type->tp_init(obj, args, kwds) < 0) {
160 Py_DECREF(obj);
161 obj = NULL;
162 }
163 }
164 return obj;
165}
166
167PyObject *
168PyType_GenericAlloc(PyTypeObject *type, int nitems)
169{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000170 PyObject *obj;
Tim Petersf2a67da2001-10-07 03:54:51 +0000171 const size_t size = _PyObject_VAR_SIZE(type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000172
173 if (PyType_IS_GC(type))
Tim Peters6d483d32001-10-06 21:27:34 +0000174 obj = _PyObject_GC_Malloc(type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000175 else
Neil Schemenauerc806c882001-08-29 23:54:54 +0000176 obj = PyObject_MALLOC(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000177
Neil Schemenauerc806c882001-08-29 23:54:54 +0000178 if (obj == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000179 return PyErr_NoMemory();
Tim Peters406fe3b2001-10-06 19:04:01 +0000180
Neil Schemenauerc806c882001-08-29 23:54:54 +0000181 memset(obj, '\0', size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000182
Tim Peters6d6c1a32001-08-02 04:15:00 +0000183 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
184 Py_INCREF(type);
Tim Peters406fe3b2001-10-06 19:04:01 +0000185
Tim Peters6d6c1a32001-08-02 04:15:00 +0000186 if (type->tp_itemsize == 0)
187 PyObject_INIT(obj, type);
188 else
189 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000190
Tim Peters6d6c1a32001-08-02 04:15:00 +0000191 if (PyType_IS_GC(type))
Neil Schemenauerc806c882001-08-29 23:54:54 +0000192 _PyObject_GC_TRACK(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000193 return obj;
194}
195
196PyObject *
197PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
198{
199 return type->tp_alloc(type, 0);
200}
201
Guido van Rossum9475a232001-10-05 20:51:39 +0000202/* Helpers for subtyping */
203
204static int
205subtype_traverse(PyObject *self, visitproc visit, void *arg)
206{
207 PyTypeObject *type, *base;
208 traverseproc f;
209 int err;
210
211 /* Find the nearest base with a different tp_traverse */
212 type = self->ob_type;
213 base = type->tp_base;
214 while ((f = base->tp_traverse) == subtype_traverse) {
215 base = base->tp_base;
216 assert(base);
217 }
218
219 if (type->tp_dictoffset != base->tp_dictoffset) {
220 PyObject **dictptr = _PyObject_GetDictPtr(self);
221 if (dictptr && *dictptr) {
222 err = visit(*dictptr, arg);
223 if (err)
224 return err;
225 }
226 }
227
228 if (f)
229 return f(self, visit, arg);
230 return 0;
231}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000232
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000233staticforward PyObject *lookup_maybe(PyObject *, char *, PyObject **);
234
235static int
236call_finalizer(PyObject *self)
237{
238 static PyObject *del_str = NULL;
239 PyObject *del, *res;
240 PyObject *error_type, *error_value, *error_traceback;
241
242 /* Temporarily resurrect the object. */
243#ifdef Py_TRACE_REFS
244#ifndef Py_REF_DEBUG
245# error "Py_TRACE_REFS defined but Py_REF_DEBUG not."
246#endif
247 /* much too complicated if Py_TRACE_REFS defined */
248 _Py_NewReference((PyObject *)self);
249#ifdef COUNT_ALLOCS
250 /* compensate for boost in _Py_NewReference; note that
251 * _Py_RefTotal was also boosted; we'll knock that down later.
252 */
253 self->ob_type->tp_allocs--;
254#endif
255#else /* !Py_TRACE_REFS */
256 /* Py_INCREF boosts _Py_RefTotal if Py_REF_DEBUG is defined */
257 Py_INCREF(self);
258#endif /* !Py_TRACE_REFS */
259
260 /* Save the current exception, if any. */
261 PyErr_Fetch(&error_type, &error_value, &error_traceback);
262
263 /* Execute __del__ method, if any. */
264 del = lookup_maybe(self, "__del__", &del_str);
265 if (del != NULL) {
266 res = PyEval_CallObject(del, NULL);
267 if (res == NULL)
268 PyErr_WriteUnraisable(del);
269 else
270 Py_DECREF(res);
271 Py_DECREF(del);
272 }
273
274 /* Restore the saved exception. */
275 PyErr_Restore(error_type, error_value, error_traceback);
276
277 /* Undo the temporary resurrection; can't use DECREF here, it would
278 * cause a recursive call.
279 */
280#ifdef Py_REF_DEBUG
281 /* _Py_RefTotal was boosted either by _Py_NewReference or
282 * Py_INCREF above.
283 */
284 _Py_RefTotal--;
285#endif
286 if (--self->ob_refcnt > 0) {
287#ifdef COUNT_ALLOCS
288 self->ob_type->tp_frees--;
289#endif
290 _PyObject_GC_TRACK(self);
291 return -1; /* __del__ added a reference; don't delete now */
292 }
293#ifdef Py_TRACE_REFS
294 _Py_ForgetReference((PyObject *)self);
295#ifdef COUNT_ALLOCS
296 /* compensate for increment in _Py_ForgetReference */
297 self->ob_type->tp_frees--;
298#endif
299#endif
300
301 return 0;
302}
303
Tim Peters6d6c1a32001-08-02 04:15:00 +0000304static void
305subtype_dealloc(PyObject *self)
306{
Guido van Rossum14227b42001-12-06 02:35:58 +0000307 PyTypeObject *type, *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000308 destructor f;
309
310 /* This exists so we can DECREF self->ob_type */
311
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000312 if (call_finalizer(self) < 0)
313 return;
314
Tim Peters6d6c1a32001-08-02 04:15:00 +0000315 /* Find the nearest base with a different tp_dealloc */
316 type = self->ob_type;
Guido van Rossum14227b42001-12-06 02:35:58 +0000317 base = type->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000318 while ((f = base->tp_dealloc) == subtype_dealloc) {
319 base = base->tp_base;
320 assert(base);
Guido van Rossum14227b42001-12-06 02:35:58 +0000321 }
322
323 /* Clear __slots__ variables */
324 if (type->tp_basicsize != base->tp_basicsize &&
325 type->tp_itemsize == 0)
326 {
327 char *addr = ((char *)self);
328 char *p = addr + base->tp_basicsize;
329 char *q = addr + type->tp_basicsize;
330 for (; p < q; p += sizeof(PyObject *)) {
331 PyObject **pp;
332 if (p == addr + type->tp_dictoffset ||
333 p == addr + type->tp_weaklistoffset)
334 continue;
335 pp = (PyObject **)p;
336 if (*pp != NULL) {
337 Py_DECREF(*pp);
338 *pp = NULL;
Guido van Rossum33bab012001-12-05 22:45:48 +0000339 }
340 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000341 }
342
343 /* If we added a dict, DECREF it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000344 if (type->tp_dictoffset && !base->tp_dictoffset) {
345 PyObject **dictptr = _PyObject_GetDictPtr(self);
346 if (dictptr != NULL) {
347 PyObject *dict = *dictptr;
348 if (dict != NULL) {
349 Py_DECREF(dict);
350 *dictptr = NULL;
351 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000352 }
353 }
354
Guido van Rossum9676b222001-08-17 20:32:36 +0000355 /* If we added weaklist, we clear it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000356 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
Guido van Rossum9676b222001-08-17 20:32:36 +0000357 PyObject_ClearWeakRefs(self);
358
Tim Peters6d6c1a32001-08-02 04:15:00 +0000359 /* Finalize GC if the base doesn't do GC and we do */
360 if (PyType_IS_GC(type) && !PyType_IS_GC(base))
Guido van Rossum048eb752001-10-02 21:24:57 +0000361 _PyObject_GC_UNTRACK(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000362
363 /* Call the base tp_dealloc() */
364 assert(f);
365 f(self);
366
367 /* Can't reference self beyond this point */
368 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
369 Py_DECREF(type);
370 }
371}
372
Tim Peters6d6c1a32001-08-02 04:15:00 +0000373staticforward PyTypeObject *solid_base(PyTypeObject *type);
374
375typedef struct {
376 PyTypeObject type;
377 PyNumberMethods as_number;
378 PySequenceMethods as_sequence;
379 PyMappingMethods as_mapping;
380 PyBufferProcs as_buffer;
381 PyObject *name, *slots;
Guido van Rossum6f799372001-09-20 20:46:19 +0000382 PyMemberDef members[1];
Tim Peters6d6c1a32001-08-02 04:15:00 +0000383} etype;
384
385/* type test with subclassing support */
386
387int
388PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
389{
390 PyObject *mro;
391
Guido van Rossum9478d072001-09-07 18:52:13 +0000392 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
393 return b == a || b == &PyBaseObject_Type;
394
Tim Peters6d6c1a32001-08-02 04:15:00 +0000395 mro = a->tp_mro;
396 if (mro != NULL) {
397 /* Deal with multiple inheritance without recursion
398 by walking the MRO tuple */
399 int i, n;
400 assert(PyTuple_Check(mro));
401 n = PyTuple_GET_SIZE(mro);
402 for (i = 0; i < n; i++) {
403 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
404 return 1;
405 }
406 return 0;
407 }
408 else {
409 /* a is not completely initilized yet; follow tp_base */
410 do {
411 if (a == b)
412 return 1;
413 a = a->tp_base;
414 } while (a != NULL);
415 return b == &PyBaseObject_Type;
416 }
417}
418
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000419/* Internal routines to do a method lookup in the type
Guido van Rossum60718732001-08-28 17:47:51 +0000420 without looking in the instance dictionary
421 (so we can't use PyObject_GetAttr) but still binding
422 it to the instance. The arguments are the object,
423 the method name as a C string, and the address of a
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000424 static variable used to cache the interned Python string.
425
426 Two variants:
427
428 - lookup_maybe() returns NULL without raising an exception
429 when the _PyType_Lookup() call fails;
430
431 - lookup_method() always raises an exception upon errors.
432*/
Guido van Rossum60718732001-08-28 17:47:51 +0000433
434static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000435lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
Guido van Rossum60718732001-08-28 17:47:51 +0000436{
437 PyObject *res;
438
439 if (*attrobj == NULL) {
440 *attrobj = PyString_InternFromString(attrstr);
441 if (*attrobj == NULL)
442 return NULL;
443 }
444 res = _PyType_Lookup(self->ob_type, *attrobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000445 if (res != NULL) {
Guido van Rossum60718732001-08-28 17:47:51 +0000446 descrgetfunc f;
447 if ((f = res->ob_type->tp_descr_get) == NULL)
448 Py_INCREF(res);
449 else
450 res = f(res, self, (PyObject *)(self->ob_type));
451 }
452 return res;
453}
454
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000455static PyObject *
456lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
457{
458 PyObject *res = lookup_maybe(self, attrstr, attrobj);
459 if (res == NULL && !PyErr_Occurred())
460 PyErr_SetObject(PyExc_AttributeError, *attrobj);
461 return res;
462}
463
Guido van Rossum2730b132001-08-28 18:22:14 +0000464/* A variation of PyObject_CallMethod that uses lookup_method()
465 instead of PyObject_GetAttrString(). This uses the same convention
466 as lookup_method to cache the interned name string object. */
467
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000468static PyObject *
Guido van Rossum2730b132001-08-28 18:22:14 +0000469call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
470{
471 va_list va;
472 PyObject *args, *func = 0, *retval;
Guido van Rossum2730b132001-08-28 18:22:14 +0000473 va_start(va, format);
474
Guido van Rossumda21c012001-10-03 00:50:18 +0000475 func = lookup_maybe(o, name, nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000476 if (func == NULL) {
477 va_end(va);
478 if (!PyErr_Occurred())
Guido van Rossumda21c012001-10-03 00:50:18 +0000479 PyErr_SetObject(PyExc_AttributeError, *nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000480 return NULL;
481 }
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000482
483 if (format && *format)
484 args = Py_VaBuildValue(format, va);
485 else
486 args = PyTuple_New(0);
487
488 va_end(va);
489
490 if (args == NULL)
491 return NULL;
492
493 assert(PyTuple_Check(args));
494 retval = PyObject_Call(func, args, NULL);
495
496 Py_DECREF(args);
497 Py_DECREF(func);
498
499 return retval;
500}
501
502/* Clone of call_method() that returns NotImplemented when the lookup fails. */
503
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000504static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000505call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
506{
507 va_list va;
508 PyObject *args, *func = 0, *retval;
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000509 va_start(va, format);
510
Guido van Rossumda21c012001-10-03 00:50:18 +0000511 func = lookup_maybe(o, name, nameobj);
Guido van Rossum2730b132001-08-28 18:22:14 +0000512 if (func == NULL) {
513 va_end(va);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000514 if (!PyErr_Occurred()) {
515 Py_INCREF(Py_NotImplemented);
516 return Py_NotImplemented;
517 }
Guido van Rossum717ce002001-09-14 16:58:08 +0000518 return NULL;
Guido van Rossum2730b132001-08-28 18:22:14 +0000519 }
520
521 if (format && *format)
522 args = Py_VaBuildValue(format, va);
523 else
524 args = PyTuple_New(0);
525
526 va_end(va);
527
Guido van Rossum717ce002001-09-14 16:58:08 +0000528 if (args == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +0000529 return NULL;
530
Guido van Rossum717ce002001-09-14 16:58:08 +0000531 assert(PyTuple_Check(args));
532 retval = PyObject_Call(func, args, NULL);
Guido van Rossum2730b132001-08-28 18:22:14 +0000533
534 Py_DECREF(args);
535 Py_DECREF(func);
536
537 return retval;
538}
539
Tim Peters6d6c1a32001-08-02 04:15:00 +0000540/* Method resolution order algorithm from "Putting Metaclasses to Work"
541 by Forman and Danforth (Addison-Wesley 1999). */
542
543static int
544conservative_merge(PyObject *left, PyObject *right)
545{
546 int left_size;
547 int right_size;
548 int i, j, r, ok;
549 PyObject *temp, *rr;
550
551 assert(PyList_Check(left));
552 assert(PyList_Check(right));
553
554 again:
555 left_size = PyList_GET_SIZE(left);
556 right_size = PyList_GET_SIZE(right);
557 for (i = 0; i < left_size; i++) {
558 for (j = 0; j < right_size; j++) {
559 if (PyList_GET_ITEM(left, i) ==
560 PyList_GET_ITEM(right, j)) {
561 /* found a merge point */
562 temp = PyList_New(0);
563 if (temp == NULL)
564 return -1;
565 for (r = 0; r < j; r++) {
566 rr = PyList_GET_ITEM(right, r);
567 ok = PySequence_Contains(left, rr);
568 if (ok < 0) {
569 Py_DECREF(temp);
570 return -1;
571 }
572 if (!ok) {
573 ok = PyList_Append(temp, rr);
574 if (ok < 0) {
575 Py_DECREF(temp);
576 return -1;
577 }
578 }
579 }
580 ok = PyList_SetSlice(left, i, i, temp);
581 Py_DECREF(temp);
582 if (ok < 0)
583 return -1;
584 ok = PyList_SetSlice(right, 0, j+1, NULL);
585 if (ok < 0)
586 return -1;
587 goto again;
588 }
589 }
590 }
591 return PyList_SetSlice(left, left_size, left_size, right);
592}
593
594static int
595serious_order_disagreements(PyObject *left, PyObject *right)
596{
597 return 0; /* XXX later -- for now, we cheat: "don't do that" */
598}
599
Tim Petersa91e9642001-11-14 23:32:33 +0000600static int
601fill_classic_mro(PyObject *mro, PyObject *cls)
602{
603 PyObject *bases, *base;
604 int i, n;
605
606 assert(PyList_Check(mro));
607 assert(PyClass_Check(cls));
608 i = PySequence_Contains(mro, cls);
609 if (i < 0)
610 return -1;
611 if (!i) {
612 if (PyList_Append(mro, cls) < 0)
613 return -1;
614 }
615 bases = ((PyClassObject *)cls)->cl_bases;
616 assert(bases && PyTuple_Check(bases));
617 n = PyTuple_GET_SIZE(bases);
618 for (i = 0; i < n; i++) {
619 base = PyTuple_GET_ITEM(bases, i);
620 if (fill_classic_mro(mro, base) < 0)
621 return -1;
622 }
623 return 0;
624}
625
626static PyObject *
627classic_mro(PyObject *cls)
628{
629 PyObject *mro;
630
631 assert(PyClass_Check(cls));
632 mro = PyList_New(0);
633 if (mro != NULL) {
634 if (fill_classic_mro(mro, cls) == 0)
635 return mro;
636 Py_DECREF(mro);
637 }
638 return NULL;
639}
640
Tim Peters6d6c1a32001-08-02 04:15:00 +0000641static PyObject *
642mro_implementation(PyTypeObject *type)
643{
644 int i, n, ok;
645 PyObject *bases, *result;
646
647 bases = type->tp_bases;
648 n = PyTuple_GET_SIZE(bases);
649 result = Py_BuildValue("[O]", (PyObject *)type);
650 if (result == NULL)
651 return NULL;
652 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +0000653 PyObject *base = PyTuple_GET_ITEM(bases, i);
654 PyObject *parentMRO;
655 if (PyType_Check(base))
656 parentMRO = PySequence_List(
657 ((PyTypeObject*)base)->tp_mro);
658 else
659 parentMRO = classic_mro(base);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000660 if (parentMRO == NULL) {
661 Py_DECREF(result);
662 return NULL;
663 }
664 if (serious_order_disagreements(result, parentMRO)) {
665 Py_DECREF(result);
666 return NULL;
667 }
668 ok = conservative_merge(result, parentMRO);
669 Py_DECREF(parentMRO);
670 if (ok < 0) {
671 Py_DECREF(result);
672 return NULL;
673 }
674 }
675 return result;
676}
677
678static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000679mro_external(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000680{
681 PyTypeObject *type = (PyTypeObject *)self;
682
Tim Peters6d6c1a32001-08-02 04:15:00 +0000683 return mro_implementation(type);
684}
685
686static int
687mro_internal(PyTypeObject *type)
688{
689 PyObject *mro, *result, *tuple;
690
691 if (type->ob_type == &PyType_Type) {
692 result = mro_implementation(type);
693 }
694 else {
Guido van Rossum60718732001-08-28 17:47:51 +0000695 static PyObject *mro_str;
696 mro = lookup_method((PyObject *)type, "mro", &mro_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000697 if (mro == NULL)
698 return -1;
699 result = PyObject_CallObject(mro, NULL);
700 Py_DECREF(mro);
701 }
702 if (result == NULL)
703 return -1;
704 tuple = PySequence_Tuple(result);
705 Py_DECREF(result);
706 type->tp_mro = tuple;
707 return 0;
708}
709
710
711/* Calculate the best base amongst multiple base classes.
712 This is the first one that's on the path to the "solid base". */
713
714static PyTypeObject *
715best_base(PyObject *bases)
716{
717 int i, n;
718 PyTypeObject *base, *winner, *candidate, *base_i;
Tim Petersa91e9642001-11-14 23:32:33 +0000719 PyObject *base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000720
721 assert(PyTuple_Check(bases));
722 n = PyTuple_GET_SIZE(bases);
723 assert(n > 0);
Tim Petersa91e9642001-11-14 23:32:33 +0000724 base = NULL;
725 winner = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000726 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +0000727 base_proto = PyTuple_GET_ITEM(bases, i);
728 if (PyClass_Check(base_proto))
729 continue;
730 if (!PyType_Check(base_proto)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000731 PyErr_SetString(
732 PyExc_TypeError,
733 "bases must be types");
734 return NULL;
735 }
Tim Petersa91e9642001-11-14 23:32:33 +0000736 base_i = (PyTypeObject *)base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000737 if (base_i->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000738 if (PyType_Ready(base_i) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000739 return NULL;
740 }
741 candidate = solid_base(base_i);
Tim Petersa91e9642001-11-14 23:32:33 +0000742 if (winner == NULL) {
743 winner = candidate;
744 base = base_i;
745 }
746 else if (PyType_IsSubtype(winner, candidate))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000747 ;
748 else if (PyType_IsSubtype(candidate, winner)) {
749 winner = candidate;
750 base = base_i;
751 }
752 else {
753 PyErr_SetString(
754 PyExc_TypeError,
755 "multiple bases have "
756 "instance lay-out conflict");
757 return NULL;
758 }
759 }
760 assert(base != NULL);
761 return base;
762}
763
764static int
765extra_ivars(PyTypeObject *type, PyTypeObject *base)
766{
Neil Schemenauerc806c882001-08-29 23:54:54 +0000767 size_t t_size = type->tp_basicsize;
768 size_t b_size = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000769
Guido van Rossum9676b222001-08-17 20:32:36 +0000770 assert(t_size >= b_size); /* Else type smaller than base! */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000771 if (type->tp_itemsize || base->tp_itemsize) {
772 /* If itemsize is involved, stricter rules */
773 return t_size != b_size ||
774 type->tp_itemsize != base->tp_itemsize;
775 }
Guido van Rossum9676b222001-08-17 20:32:36 +0000776 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
777 type->tp_weaklistoffset + sizeof(PyObject *) == t_size)
778 t_size -= sizeof(PyObject *);
779 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
780 type->tp_dictoffset + sizeof(PyObject *) == t_size)
781 t_size -= sizeof(PyObject *);
782
783 return t_size != b_size;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000784}
785
786static PyTypeObject *
787solid_base(PyTypeObject *type)
788{
789 PyTypeObject *base;
790
791 if (type->tp_base)
792 base = solid_base(type->tp_base);
793 else
794 base = &PyBaseObject_Type;
795 if (extra_ivars(type, base))
796 return type;
797 else
798 return base;
799}
800
801staticforward void object_dealloc(PyObject *);
802staticforward int object_init(PyObject *, PyObject *, PyObject *);
Guido van Rossum875eeaa2001-10-11 18:33:53 +0000803staticforward int update_slot(PyTypeObject *, PyObject *);
Guido van Rossum7b9144b2001-10-09 19:39:46 +0000804staticforward void fixup_slot_dispatchers(PyTypeObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000805
806static PyObject *
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000807subtype_dict(PyObject *obj, void *context)
808{
809 PyObject **dictptr = _PyObject_GetDictPtr(obj);
810 PyObject *dict;
811
812 if (dictptr == NULL) {
813 PyErr_SetString(PyExc_AttributeError,
814 "This object has no __dict__");
815 return NULL;
816 }
817 dict = *dictptr;
Guido van Rossum3926a632001-09-25 16:25:58 +0000818 if (dict == NULL)
819 *dictptr = dict = PyDict_New();
820 Py_XINCREF(dict);
821 return dict;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000822}
823
Guido van Rossum6661be32001-10-26 04:26:12 +0000824static int
825subtype_setdict(PyObject *obj, PyObject *value, void *context)
826{
827 PyObject **dictptr = _PyObject_GetDictPtr(obj);
828 PyObject *dict;
829
830 if (dictptr == NULL) {
831 PyErr_SetString(PyExc_AttributeError,
832 "This object has no __dict__");
833 return -1;
834 }
Guido van Rossumd331cb52001-12-05 19:46:42 +0000835 if (value != NULL && !PyDict_Check(value)) {
Guido van Rossum6661be32001-10-26 04:26:12 +0000836 PyErr_SetString(PyExc_TypeError,
837 "__dict__ must be set to a dictionary");
838 return -1;
839 }
840 dict = *dictptr;
Guido van Rossumd331cb52001-12-05 19:46:42 +0000841 Py_XINCREF(value);
Guido van Rossum6661be32001-10-26 04:26:12 +0000842 *dictptr = value;
843 Py_XDECREF(dict);
844 return 0;
845}
846
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000847static PyGetSetDef subtype_getsets[] = {
Guido van Rossum6661be32001-10-26 04:26:12 +0000848 {"__dict__", subtype_dict, subtype_setdict, NULL},
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000849 {0},
850};
851
852static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000853type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
854{
855 PyObject *name, *bases, *dict;
856 static char *kwlist[] = {"name", "bases", "dict", 0};
857 PyObject *slots, *tmp;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000858 PyTypeObject *type, *base, *tmptype, *winner;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000859 etype *et;
Guido van Rossum6f799372001-09-20 20:46:19 +0000860 PyMemberDef *mp;
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +0000861 int i, nbases, nslots, slotoffset, add_dict, add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000862
Tim Peters3abca122001-10-27 19:37:48 +0000863 assert(args != NULL && PyTuple_Check(args));
864 assert(kwds == NULL || PyDict_Check(kwds));
865
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000866 /* Special case: type(x) should return x->ob_type */
Tim Peters3abca122001-10-27 19:37:48 +0000867 {
868 const int nargs = PyTuple_GET_SIZE(args);
869 const int nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
870
871 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
872 PyObject *x = PyTuple_GET_ITEM(args, 0);
873 Py_INCREF(x->ob_type);
874 return (PyObject *) x->ob_type;
875 }
876
877 /* SF bug 475327 -- if that didn't trigger, we need 3
878 arguments. but PyArg_ParseTupleAndKeywords below may give
879 a msg saying type() needs exactly 3. */
880 if (nargs + nkwds != 3) {
881 PyErr_SetString(PyExc_TypeError,
882 "type() takes 1 or 3 arguments");
883 return NULL;
884 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000885 }
886
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000887 /* Check arguments: (name, bases, dict) */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000888 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
889 &name,
890 &PyTuple_Type, &bases,
891 &PyDict_Type, &dict))
892 return NULL;
893
894 /* Determine the proper metatype to deal with this,
895 and check for metatype conflicts while we're at it.
896 Note that if some other metatype wins to contract,
897 it's possible that its instances are not types. */
898 nbases = PyTuple_GET_SIZE(bases);
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000899 winner = metatype;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000900 for (i = 0; i < nbases; i++) {
901 tmp = PyTuple_GET_ITEM(bases, i);
902 tmptype = tmp->ob_type;
Tim Petersa91e9642001-11-14 23:32:33 +0000903 if (tmptype == &PyClass_Type)
904 continue; /* Special case classic classes */
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000905 if (PyType_IsSubtype(winner, tmptype))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000906 continue;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000907 if (PyType_IsSubtype(tmptype, winner)) {
908 winner = tmptype;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000909 continue;
910 }
911 PyErr_SetString(PyExc_TypeError,
912 "metatype conflict among bases");
913 return NULL;
914 }
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000915 if (winner != metatype) {
916 if (winner->tp_new != type_new) /* Pass it to the winner */
917 return winner->tp_new(winner, args, kwds);
918 metatype = winner;
919 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000920
921 /* Adjust for empty tuple bases */
922 if (nbases == 0) {
923 bases = Py_BuildValue("(O)", &PyBaseObject_Type);
924 if (bases == NULL)
925 return NULL;
926 nbases = 1;
927 }
928 else
929 Py_INCREF(bases);
930
931 /* XXX From here until type is allocated, "return NULL" leaks bases! */
932
933 /* Calculate best base, and check that all bases are type objects */
934 base = best_base(bases);
935 if (base == NULL)
936 return NULL;
937 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
938 PyErr_Format(PyExc_TypeError,
939 "type '%.100s' is not an acceptable base type",
940 base->tp_name);
941 return NULL;
942 }
943
Tim Peters6d6c1a32001-08-02 04:15:00 +0000944 /* Check for a __slots__ sequence variable in dict, and count it */
945 slots = PyDict_GetItemString(dict, "__slots__");
946 nslots = 0;
Guido van Rossum9676b222001-08-17 20:32:36 +0000947 add_dict = 0;
948 add_weak = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000949 if (slots != NULL) {
950 /* Make it into a tuple */
951 if (PyString_Check(slots))
952 slots = Py_BuildValue("(O)", slots);
953 else
954 slots = PySequence_Tuple(slots);
955 if (slots == NULL)
956 return NULL;
957 nslots = PyTuple_GET_SIZE(slots);
Guido van Rossumc4141872001-08-30 04:43:35 +0000958 if (nslots > 0 && base->tp_itemsize != 0) {
959 PyErr_Format(PyExc_TypeError,
960 "nonempty __slots__ "
961 "not supported for subtype of '%s'",
962 base->tp_name);
963 return NULL;
964 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000965 for (i = 0; i < nslots; i++) {
966 if (!PyString_Check(PyTuple_GET_ITEM(slots, i))) {
967 PyErr_SetString(PyExc_TypeError,
968 "__slots__ must be a sequence of strings");
969 Py_DECREF(slots);
970 return NULL;
971 }
Guido van Rossum9676b222001-08-17 20:32:36 +0000972 /* XXX Check against null bytes in name */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000973 }
974 }
975 if (slots == NULL && base->tp_dictoffset == 0 &&
976 (base->tp_setattro == PyObject_GenericSetAttr ||
Guido van Rossum9676b222001-08-17 20:32:36 +0000977 base->tp_setattro == NULL)) {
Guido van Rossum9676b222001-08-17 20:32:36 +0000978 add_dict++;
979 }
Guido van Rossumc4141872001-08-30 04:43:35 +0000980 if (slots == NULL && base->tp_weaklistoffset == 0 &&
981 base->tp_itemsize == 0) {
Guido van Rossum9676b222001-08-17 20:32:36 +0000982 nslots++;
983 add_weak++;
984 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000985
986 /* XXX From here until type is safely allocated,
987 "return NULL" may leak slots! */
988
989 /* Allocate the type object */
990 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
991 if (type == NULL)
992 return NULL;
993
994 /* Keep name and slots alive in the extended type object */
995 et = (etype *)type;
996 Py_INCREF(name);
997 et->name = name;
998 et->slots = slots;
999
Guido van Rossumdc91b992001-08-08 22:26:22 +00001000 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
1002 Py_TPFLAGS_BASETYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00001003 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
1004 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00001005
1006 /* It's a new-style number unless it specifically inherits any
1007 old-style numeric behavior */
1008 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
1009 (base->tp_as_number == NULL))
1010 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
1011
1012 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001013 type->tp_as_number = &et->as_number;
1014 type->tp_as_sequence = &et->as_sequence;
1015 type->tp_as_mapping = &et->as_mapping;
1016 type->tp_as_buffer = &et->as_buffer;
1017 type->tp_name = PyString_AS_STRING(name);
1018
1019 /* Set tp_base and tp_bases */
1020 type->tp_bases = bases;
1021 Py_INCREF(base);
1022 type->tp_base = base;
1023
Guido van Rossum687ae002001-10-15 22:03:32 +00001024 /* Initialize tp_dict from passed-in dict */
1025 type->tp_dict = dict = PyDict_Copy(dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001026 if (dict == NULL) {
1027 Py_DECREF(type);
1028 return NULL;
1029 }
1030
Guido van Rossumc3542212001-08-16 09:18:56 +00001031 /* Set __module__ in the dict */
1032 if (PyDict_GetItemString(dict, "__module__") == NULL) {
1033 tmp = PyEval_GetGlobals();
1034 if (tmp != NULL) {
1035 tmp = PyDict_GetItemString(tmp, "__name__");
1036 if (tmp != NULL) {
1037 if (PyDict_SetItemString(dict, "__module__",
1038 tmp) < 0)
1039 return NULL;
1040 }
1041 }
1042 }
1043
Tim Peters2f93e282001-10-04 05:27:00 +00001044 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
1045 and is a string (tp_doc is a char* -- can't copy a general object
1046 into it).
1047 XXX What if it's a Unicode string? Don't know -- this ignores it.
1048 */
1049 {
1050 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
1051 if (doc != NULL && PyString_Check(doc)) {
1052 const size_t n = (size_t)PyString_GET_SIZE(doc);
Tim Peters59f809d2001-10-04 05:43:02 +00001053 type->tp_doc = (char *)PyObject_MALLOC(n+1);
Tim Peters2f93e282001-10-04 05:27:00 +00001054 if (type->tp_doc == NULL) {
1055 Py_DECREF(type);
1056 return NULL;
1057 }
1058 memcpy(type->tp_doc, PyString_AS_STRING(doc), n+1);
1059 }
1060 }
1061
Tim Peters6d6c1a32001-08-02 04:15:00 +00001062 /* Special-case __new__: if it's a plain function,
1063 make it a static function */
1064 tmp = PyDict_GetItemString(dict, "__new__");
1065 if (tmp != NULL && PyFunction_Check(tmp)) {
1066 tmp = PyStaticMethod_New(tmp);
1067 if (tmp == NULL) {
1068 Py_DECREF(type);
1069 return NULL;
1070 }
1071 PyDict_SetItemString(dict, "__new__", tmp);
1072 Py_DECREF(tmp);
1073 }
1074
1075 /* Add descriptors for custom slots from __slots__, or for __dict__ */
1076 mp = et->members;
Neil Schemenauerc806c882001-08-29 23:54:54 +00001077 slotoffset = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001078 if (slots != NULL) {
1079 for (i = 0; i < nslots; i++, mp++) {
1080 mp->name = PyString_AS_STRING(
1081 PyTuple_GET_ITEM(slots, i));
Guido van Rossum64b206c2001-12-04 17:13:22 +00001082 mp->type = T_OBJECT_EX;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001083 mp->offset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00001084 if (base->tp_weaklistoffset == 0 &&
Guido van Rossum64b206c2001-12-04 17:13:22 +00001085 strcmp(mp->name, "__weakref__") == 0) {
1086 mp->type = T_OBJECT;
Guido van Rossum9676b222001-08-17 20:32:36 +00001087 type->tp_weaklistoffset = slotoffset;
Guido van Rossum64b206c2001-12-04 17:13:22 +00001088 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001089 slotoffset += sizeof(PyObject *);
1090 }
1091 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001092 else {
1093 if (add_dict) {
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001094 if (base->tp_itemsize)
Guido van Rossum048eb752001-10-02 21:24:57 +00001095 type->tp_dictoffset =
1096 -(long)sizeof(PyObject *);
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001097 else
1098 type->tp_dictoffset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00001099 slotoffset += sizeof(PyObject *);
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001100 type->tp_getset = subtype_getsets;
Guido van Rossum9676b222001-08-17 20:32:36 +00001101 }
1102 if (add_weak) {
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001103 assert(!base->tp_itemsize);
Guido van Rossum9676b222001-08-17 20:32:36 +00001104 type->tp_weaklistoffset = slotoffset;
1105 mp->name = "__weakref__";
1106 mp->type = T_OBJECT;
1107 mp->offset = slotoffset;
Tim Peters26f68f52001-09-18 00:23:33 +00001108 mp->flags = READONLY;
Guido van Rossum9676b222001-08-17 20:32:36 +00001109 mp++;
1110 slotoffset += sizeof(PyObject *);
1111 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001112 }
1113 type->tp_basicsize = slotoffset;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001114 type->tp_itemsize = base->tp_itemsize;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001115 type->tp_members = et->members;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001116
1117 /* Special case some slots */
1118 if (type->tp_dictoffset != 0 || nslots > 0) {
1119 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
1120 type->tp_getattro = PyObject_GenericGetAttr;
1121 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
1122 type->tp_setattro = PyObject_GenericSetAttr;
1123 }
1124 type->tp_dealloc = subtype_dealloc;
1125
Guido van Rossum9475a232001-10-05 20:51:39 +00001126 /* Enable GC unless there are really no instance variables possible */
1127 if (!(type->tp_basicsize == sizeof(PyObject) &&
1128 type->tp_itemsize == 0))
1129 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
1130
Tim Peters6d6c1a32001-08-02 04:15:00 +00001131 /* Always override allocation strategy to use regular heap */
1132 type->tp_alloc = PyType_GenericAlloc;
Guido van Rossum048eb752001-10-02 21:24:57 +00001133 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
1134 type->tp_free = _PyObject_GC_Del;
Guido van Rossum9475a232001-10-05 20:51:39 +00001135 type->tp_traverse = subtype_traverse;
Guido van Rossum048eb752001-10-02 21:24:57 +00001136 type->tp_clear = base->tp_clear;
1137 }
1138 else
1139 type->tp_free = _PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001140
1141 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001142 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001143 Py_DECREF(type);
1144 return NULL;
1145 }
1146
Guido van Rossum7b9144b2001-10-09 19:39:46 +00001147 /* Put the proper slots in place */
1148 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00001149
Tim Peters6d6c1a32001-08-02 04:15:00 +00001150 return (PyObject *)type;
1151}
1152
1153/* Internal API to look for a name through the MRO.
1154 This returns a borrowed reference, and doesn't set an exception! */
1155PyObject *
1156_PyType_Lookup(PyTypeObject *type, PyObject *name)
1157{
1158 int i, n;
Tim Petersa91e9642001-11-14 23:32:33 +00001159 PyObject *mro, *res, *base, *dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001160
Guido van Rossum687ae002001-10-15 22:03:32 +00001161 /* Look in tp_dict of types in MRO */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001162 mro = type->tp_mro;
1163 assert(PyTuple_Check(mro));
1164 n = PyTuple_GET_SIZE(mro);
1165 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001166 base = PyTuple_GET_ITEM(mro, i);
1167 if (PyClass_Check(base))
1168 dict = ((PyClassObject *)base)->cl_dict;
1169 else {
1170 assert(PyType_Check(base));
1171 dict = ((PyTypeObject *)base)->tp_dict;
1172 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001173 assert(dict && PyDict_Check(dict));
1174 res = PyDict_GetItem(dict, name);
1175 if (res != NULL)
1176 return res;
1177 }
1178 return NULL;
1179}
1180
1181/* This is similar to PyObject_GenericGetAttr(),
1182 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
1183static PyObject *
1184type_getattro(PyTypeObject *type, PyObject *name)
1185{
1186 PyTypeObject *metatype = type->ob_type;
1187 PyObject *descr, *res;
1188 descrgetfunc f;
1189
1190 /* Initialize this type (we'll assume the metatype is initialized) */
1191 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001192 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001193 return NULL;
1194 }
1195
1196 /* Get a descriptor from the metatype */
1197 descr = _PyType_Lookup(metatype, name);
1198 f = NULL;
1199 if (descr != NULL) {
1200 f = descr->ob_type->tp_descr_get;
1201 if (f != NULL && PyDescr_IsData(descr))
1202 return f(descr,
1203 (PyObject *)type, (PyObject *)metatype);
1204 }
1205
Guido van Rossum687ae002001-10-15 22:03:32 +00001206 /* Look in tp_dict of this type and its bases */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001207 res = _PyType_Lookup(type, name);
1208 if (res != NULL) {
1209 f = res->ob_type->tp_descr_get;
1210 if (f != NULL)
1211 return f(res, (PyObject *)NULL, (PyObject *)type);
1212 Py_INCREF(res);
1213 return res;
1214 }
1215
1216 /* Use the descriptor from the metatype */
1217 if (f != NULL) {
1218 res = f(descr, (PyObject *)type, (PyObject *)metatype);
1219 return res;
1220 }
1221 if (descr != NULL) {
1222 Py_INCREF(descr);
1223 return descr;
1224 }
1225
1226 /* Give up */
1227 PyErr_Format(PyExc_AttributeError,
1228 "type object '%.50s' has no attribute '%.400s'",
1229 type->tp_name, PyString_AS_STRING(name));
1230 return NULL;
1231}
1232
1233static int
1234type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
1235{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001236 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
1237 PyErr_Format(
1238 PyExc_TypeError,
1239 "can't set attributes of built-in/extension type '%s'",
1240 type->tp_name);
1241 return -1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00001242 }
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001243 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
1244 return -1;
1245 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001246}
1247
1248static void
1249type_dealloc(PyTypeObject *type)
1250{
1251 etype *et;
1252
1253 /* Assert this is a heap-allocated type object */
1254 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00001255 _PyObject_GC_UNTRACK(type);
Guido van Rossum1c450732001-10-08 15:18:27 +00001256 PyObject_ClearWeakRefs((PyObject *)type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001257 et = (etype *)type;
1258 Py_XDECREF(type->tp_base);
1259 Py_XDECREF(type->tp_dict);
1260 Py_XDECREF(type->tp_bases);
1261 Py_XDECREF(type->tp_mro);
Guido van Rossum687ae002001-10-15 22:03:32 +00001262 Py_XDECREF(type->tp_cache);
Guido van Rossum1c450732001-10-08 15:18:27 +00001263 Py_XDECREF(type->tp_subclasses);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 Py_XDECREF(et->name);
1265 Py_XDECREF(et->slots);
1266 type->ob_type->tp_free((PyObject *)type);
1267}
1268
Guido van Rossum1c450732001-10-08 15:18:27 +00001269static PyObject *
1270type_subclasses(PyTypeObject *type, PyObject *args_ignored)
1271{
1272 PyObject *list, *raw, *ref;
1273 int i, n;
1274
1275 list = PyList_New(0);
1276 if (list == NULL)
1277 return NULL;
1278 raw = type->tp_subclasses;
1279 if (raw == NULL)
1280 return list;
1281 assert(PyList_Check(raw));
1282 n = PyList_GET_SIZE(raw);
1283 for (i = 0; i < n; i++) {
1284 ref = PyList_GET_ITEM(raw, i);
Tim Peters44383382001-10-08 16:49:26 +00001285 assert(PyWeakref_CheckRef(ref));
Guido van Rossum1c450732001-10-08 15:18:27 +00001286 ref = PyWeakref_GET_OBJECT(ref);
1287 if (ref != Py_None) {
1288 if (PyList_Append(list, ref) < 0) {
1289 Py_DECREF(list);
1290 return NULL;
1291 }
1292 }
1293 }
1294 return list;
1295}
1296
Tim Peters6d6c1a32001-08-02 04:15:00 +00001297static PyMethodDef type_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001298 {"mro", (PyCFunction)mro_external, METH_NOARGS,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001299 "mro() -> list\nreturn a type's method resolution order"},
Guido van Rossum1c450732001-10-08 15:18:27 +00001300 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
1301 "__subclasses__() -> list of immediate subclasses"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001302 {0}
1303};
1304
1305static char type_doc[] =
1306"type(object) -> the object's type\n"
1307"type(name, bases, dict) -> a new type";
1308
Guido van Rossum048eb752001-10-02 21:24:57 +00001309static int
1310type_traverse(PyTypeObject *type, visitproc visit, void *arg)
1311{
1312 etype *et;
1313 int err;
1314
1315 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
1316 return 0;
1317
1318 et = (etype *)type;
1319
1320#define VISIT(SLOT) \
1321 if (SLOT) { \
1322 err = visit((PyObject *)(SLOT), arg); \
1323 if (err) \
1324 return err; \
1325 }
1326
1327 VISIT(type->tp_dict);
Guido van Rossum687ae002001-10-15 22:03:32 +00001328 VISIT(type->tp_cache);
Guido van Rossum048eb752001-10-02 21:24:57 +00001329 VISIT(type->tp_mro);
1330 VISIT(type->tp_bases);
1331 VISIT(type->tp_base);
Guido van Rossum1c450732001-10-08 15:18:27 +00001332 VISIT(type->tp_subclasses);
Guido van Rossum048eb752001-10-02 21:24:57 +00001333 VISIT(et->slots);
1334
1335#undef VISIT
1336
1337 return 0;
1338}
1339
1340static int
1341type_clear(PyTypeObject *type)
1342{
1343 etype *et;
1344 PyObject *tmp;
1345
1346 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
1347 return 0;
1348
1349 et = (etype *)type;
1350
1351#define CLEAR(SLOT) \
1352 if (SLOT) { \
1353 tmp = (PyObject *)(SLOT); \
1354 SLOT = NULL; \
1355 Py_DECREF(tmp); \
1356 }
1357
1358 CLEAR(type->tp_dict);
Guido van Rossum687ae002001-10-15 22:03:32 +00001359 CLEAR(type->tp_cache);
Guido van Rossum048eb752001-10-02 21:24:57 +00001360 CLEAR(type->tp_mro);
1361 CLEAR(type->tp_bases);
1362 CLEAR(type->tp_base);
Guido van Rossum1c450732001-10-08 15:18:27 +00001363 CLEAR(type->tp_subclasses);
Guido van Rossum048eb752001-10-02 21:24:57 +00001364 CLEAR(et->slots);
1365
Tim Peters2f93e282001-10-04 05:27:00 +00001366 if (type->tp_doc != NULL) {
1367 PyObject_FREE(type->tp_doc);
1368 type->tp_doc = NULL;
1369 }
1370
Guido van Rossum048eb752001-10-02 21:24:57 +00001371#undef CLEAR
1372
1373 return 0;
1374}
1375
1376static int
1377type_is_gc(PyTypeObject *type)
1378{
1379 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
1380}
1381
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001382PyTypeObject PyType_Type = {
1383 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001384 0, /* ob_size */
1385 "type", /* tp_name */
1386 sizeof(etype), /* tp_basicsize */
Guido van Rossum6f799372001-09-20 20:46:19 +00001387 sizeof(PyMemberDef), /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001388 (destructor)type_dealloc, /* tp_dealloc */
1389 0, /* tp_print */
1390 0, /* tp_getattr */
1391 0, /* tp_setattr */
1392 type_compare, /* tp_compare */
1393 (reprfunc)type_repr, /* tp_repr */
1394 0, /* tp_as_number */
1395 0, /* tp_as_sequence */
1396 0, /* tp_as_mapping */
1397 (hashfunc)_Py_HashPointer, /* tp_hash */
1398 (ternaryfunc)type_call, /* tp_call */
1399 0, /* tp_str */
1400 (getattrofunc)type_getattro, /* tp_getattro */
1401 (setattrofunc)type_setattro, /* tp_setattro */
1402 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00001403 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1404 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001405 type_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00001406 (traverseproc)type_traverse, /* tp_traverse */
1407 (inquiry)type_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001408 0, /* tp_richcompare */
Guido van Rossum1c450732001-10-08 15:18:27 +00001409 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001410 0, /* tp_iter */
1411 0, /* tp_iternext */
1412 type_methods, /* tp_methods */
1413 type_members, /* tp_members */
1414 type_getsets, /* tp_getset */
1415 0, /* tp_base */
1416 0, /* tp_dict */
1417 0, /* tp_descr_get */
1418 0, /* tp_descr_set */
1419 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
1420 0, /* tp_init */
1421 0, /* tp_alloc */
1422 type_new, /* tp_new */
Guido van Rossum048eb752001-10-02 21:24:57 +00001423 _PyObject_GC_Del, /* tp_free */
1424 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001425};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001426
1427
1428/* The base type of all types (eventually)... except itself. */
1429
1430static int
1431object_init(PyObject *self, PyObject *args, PyObject *kwds)
1432{
1433 return 0;
1434}
1435
1436static void
1437object_dealloc(PyObject *self)
1438{
1439 self->ob_type->tp_free(self);
1440}
1441
Guido van Rossum8e248182001-08-12 05:17:56 +00001442static PyObject *
1443object_repr(PyObject *self)
1444{
Guido van Rossum76e69632001-08-16 18:52:43 +00001445 PyTypeObject *type;
Barry Warsaw7ce36942001-08-24 18:34:26 +00001446 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00001447
Guido van Rossum76e69632001-08-16 18:52:43 +00001448 type = self->ob_type;
1449 mod = type_module(type, NULL);
1450 if (mod == NULL)
1451 PyErr_Clear();
1452 else if (!PyString_Check(mod)) {
1453 Py_DECREF(mod);
1454 mod = NULL;
1455 }
1456 name = type_name(type, NULL);
1457 if (name == NULL)
1458 return NULL;
1459 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001460 rtn = PyString_FromFormat("<%s.%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00001461 PyString_AS_STRING(mod),
1462 PyString_AS_STRING(name),
1463 self);
Guido van Rossum76e69632001-08-16 18:52:43 +00001464 else
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001465 rtn = PyString_FromFormat("<%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00001466 type->tp_name, self);
Guido van Rossum76e69632001-08-16 18:52:43 +00001467 Py_XDECREF(mod);
1468 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +00001469 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00001470}
1471
Guido van Rossumb8f63662001-08-15 23:57:02 +00001472static PyObject *
1473object_str(PyObject *self)
1474{
1475 unaryfunc f;
1476
1477 f = self->ob_type->tp_repr;
1478 if (f == NULL)
1479 f = object_repr;
1480 return f(self);
1481}
1482
Guido van Rossum8e248182001-08-12 05:17:56 +00001483static long
1484object_hash(PyObject *self)
1485{
1486 return _Py_HashPointer(self);
1487}
Guido van Rossum8e248182001-08-12 05:17:56 +00001488
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001489static PyObject *
1490object_get_class(PyObject *self, void *closure)
1491{
1492 Py_INCREF(self->ob_type);
1493 return (PyObject *)(self->ob_type);
1494}
1495
1496static int
1497equiv_structs(PyTypeObject *a, PyTypeObject *b)
1498{
1499 return a == b ||
1500 (a != NULL &&
1501 b != NULL &&
1502 a->tp_basicsize == b->tp_basicsize &&
1503 a->tp_itemsize == b->tp_itemsize &&
1504 a->tp_dictoffset == b->tp_dictoffset &&
1505 a->tp_weaklistoffset == b->tp_weaklistoffset &&
1506 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
1507 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
1508}
1509
1510static int
1511same_slots_added(PyTypeObject *a, PyTypeObject *b)
1512{
1513 PyTypeObject *base = a->tp_base;
1514 int size;
1515
1516 if (base != b->tp_base)
1517 return 0;
1518 if (equiv_structs(a, base) && equiv_structs(b, base))
1519 return 1;
1520 size = base->tp_basicsize;
1521 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
1522 size += sizeof(PyObject *);
1523 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
1524 size += sizeof(PyObject *);
1525 return size == a->tp_basicsize && size == b->tp_basicsize;
1526}
1527
1528static int
1529object_set_class(PyObject *self, PyObject *value, void *closure)
1530{
1531 PyTypeObject *old = self->ob_type;
1532 PyTypeObject *new, *newbase, *oldbase;
1533
1534 if (!PyType_Check(value)) {
1535 PyErr_Format(PyExc_TypeError,
1536 "__class__ must be set to new-style class, not '%s' object",
1537 value->ob_type->tp_name);
1538 return -1;
1539 }
1540 new = (PyTypeObject *)value;
1541 newbase = new;
1542 oldbase = old;
1543 while (equiv_structs(newbase, newbase->tp_base))
1544 newbase = newbase->tp_base;
1545 while (equiv_structs(oldbase, oldbase->tp_base))
1546 oldbase = oldbase->tp_base;
1547 if (newbase != oldbase &&
1548 (newbase->tp_base != oldbase->tp_base ||
1549 !same_slots_added(newbase, oldbase))) {
1550 PyErr_Format(PyExc_TypeError,
1551 "__class__ assignment: "
1552 "'%s' object layout differs from '%s'",
Tim Peters2f93e282001-10-04 05:27:00 +00001553 new->tp_name,
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001554 old->tp_name);
1555 return -1;
1556 }
1557 if (new->tp_flags & Py_TPFLAGS_HEAPTYPE) {
1558 Py_INCREF(new);
1559 }
1560 self->ob_type = new;
1561 if (old->tp_flags & Py_TPFLAGS_HEAPTYPE) {
1562 Py_DECREF(old);
1563 }
1564 return 0;
1565}
1566
1567static PyGetSetDef object_getsets[] = {
1568 {"__class__", object_get_class, object_set_class,
1569 "the object's class"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001570 {0}
1571};
1572
Guido van Rossum3926a632001-09-25 16:25:58 +00001573static PyObject *
1574object_reduce(PyObject *self, PyObject *args)
1575{
1576 /* Call copy_reg._reduce(self) */
1577 static PyObject *copy_reg_str;
1578 PyObject *copy_reg, *res;
1579
1580 if (!copy_reg_str) {
1581 copy_reg_str = PyString_InternFromString("copy_reg");
1582 if (copy_reg_str == NULL)
1583 return NULL;
1584 }
1585 copy_reg = PyImport_Import(copy_reg_str);
1586 if (!copy_reg)
1587 return NULL;
1588 res = PyEval_CallMethod(copy_reg, "_reduce", "(O)", self);
1589 Py_DECREF(copy_reg);
1590 return res;
1591}
1592
1593static PyMethodDef object_methods[] = {
1594 {"__reduce__", object_reduce, METH_NOARGS, "helper for pickle"},
1595 {0}
1596};
1597
Tim Peters6d6c1a32001-08-02 04:15:00 +00001598PyTypeObject PyBaseObject_Type = {
1599 PyObject_HEAD_INIT(&PyType_Type)
1600 0, /* ob_size */
1601 "object", /* tp_name */
1602 sizeof(PyObject), /* tp_basicsize */
1603 0, /* tp_itemsize */
1604 (destructor)object_dealloc, /* tp_dealloc */
1605 0, /* tp_print */
1606 0, /* tp_getattr */
1607 0, /* tp_setattr */
1608 0, /* tp_compare */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001609 object_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001610 0, /* tp_as_number */
1611 0, /* tp_as_sequence */
1612 0, /* tp_as_mapping */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001613 object_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001614 0, /* tp_call */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001615 object_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001616 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +00001617 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001618 0, /* tp_as_buffer */
1619 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1620 "The most base type", /* tp_doc */
1621 0, /* tp_traverse */
1622 0, /* tp_clear */
1623 0, /* tp_richcompare */
1624 0, /* tp_weaklistoffset */
1625 0, /* tp_iter */
1626 0, /* tp_iternext */
Guido van Rossum3926a632001-09-25 16:25:58 +00001627 object_methods, /* tp_methods */
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001628 0, /* tp_members */
1629 object_getsets, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001630 0, /* tp_base */
1631 0, /* tp_dict */
1632 0, /* tp_descr_get */
1633 0, /* tp_descr_set */
1634 0, /* tp_dictoffset */
1635 object_init, /* tp_init */
1636 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc11e1922001-08-09 19:38:15 +00001637 PyType_GenericNew, /* tp_new */
Guido van Rossum9475a232001-10-05 20:51:39 +00001638 _PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001639};
1640
1641
1642/* Initialize the __dict__ in a type object */
1643
1644static int
1645add_methods(PyTypeObject *type, PyMethodDef *meth)
1646{
Guido van Rossum687ae002001-10-15 22:03:32 +00001647 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001648
1649 for (; meth->ml_name != NULL; meth++) {
1650 PyObject *descr;
1651 if (PyDict_GetItemString(dict, meth->ml_name))
1652 continue;
1653 descr = PyDescr_NewMethod(type, meth);
1654 if (descr == NULL)
1655 return -1;
1656 if (PyDict_SetItemString(dict,meth->ml_name,descr) < 0)
1657 return -1;
1658 Py_DECREF(descr);
1659 }
1660 return 0;
1661}
1662
1663static int
Guido van Rossum6f799372001-09-20 20:46:19 +00001664add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001665{
Guido van Rossum687ae002001-10-15 22:03:32 +00001666 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667
1668 for (; memb->name != NULL; memb++) {
1669 PyObject *descr;
1670 if (PyDict_GetItemString(dict, memb->name))
1671 continue;
1672 descr = PyDescr_NewMember(type, memb);
1673 if (descr == NULL)
1674 return -1;
1675 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
1676 return -1;
1677 Py_DECREF(descr);
1678 }
1679 return 0;
1680}
1681
1682static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00001683add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684{
Guido van Rossum687ae002001-10-15 22:03:32 +00001685 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686
1687 for (; gsp->name != NULL; gsp++) {
1688 PyObject *descr;
1689 if (PyDict_GetItemString(dict, gsp->name))
1690 continue;
1691 descr = PyDescr_NewGetSet(type, gsp);
1692
1693 if (descr == NULL)
1694 return -1;
1695 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
1696 return -1;
1697 Py_DECREF(descr);
1698 }
1699 return 0;
1700}
1701
Guido van Rossum13d52f02001-08-10 21:24:08 +00001702static void
1703inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001704{
1705 int oldsize, newsize;
1706
Guido van Rossum13d52f02001-08-10 21:24:08 +00001707 /* Special flag magic */
1708 if (!type->tp_as_buffer && base->tp_as_buffer) {
1709 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
1710 type->tp_flags |=
1711 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
1712 }
1713 if (!type->tp_as_sequence && base->tp_as_sequence) {
1714 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
1715 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
1716 }
1717 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
1718 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
1719 if ((!type->tp_as_number && base->tp_as_number) ||
1720 (!type->tp_as_sequence && base->tp_as_sequence)) {
1721 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
1722 if (!type->tp_as_number && !type->tp_as_sequence) {
1723 type->tp_flags |= base->tp_flags &
1724 Py_TPFLAGS_HAVE_INPLACEOPS;
1725 }
1726 }
1727 /* Wow */
1728 }
1729 if (!type->tp_as_number && base->tp_as_number) {
1730 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
1731 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
1732 }
1733
1734 /* Copying basicsize is connected to the GC flags */
Neil Schemenauerc806c882001-08-29 23:54:54 +00001735 oldsize = base->tp_basicsize;
1736 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
1737 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
1738 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
Guido van Rossum13d52f02001-08-10 21:24:08 +00001739 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
1740 (!type->tp_traverse && !type->tp_clear)) {
Neil Schemenauerc806c882001-08-29 23:54:54 +00001741 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001742 if (type->tp_traverse == NULL)
1743 type->tp_traverse = base->tp_traverse;
1744 if (type->tp_clear == NULL)
1745 type->tp_clear = base->tp_clear;
1746 }
1747 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1748 if (base != &PyBaseObject_Type ||
1749 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
1750 if (type->tp_new == NULL)
1751 type->tp_new = base->tp_new;
1752 }
1753 }
Neil Schemenauerc806c882001-08-29 23:54:54 +00001754 type->tp_basicsize = newsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00001755
1756 /* Copy other non-function slots */
1757
1758#undef COPYVAL
1759#define COPYVAL(SLOT) \
1760 if (type->SLOT == 0) type->SLOT = base->SLOT
1761
1762 COPYVAL(tp_itemsize);
1763 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
1764 COPYVAL(tp_weaklistoffset);
1765 }
1766 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1767 COPYVAL(tp_dictoffset);
1768 }
Guido van Rossum13d52f02001-08-10 21:24:08 +00001769}
1770
1771static void
1772inherit_slots(PyTypeObject *type, PyTypeObject *base)
1773{
1774 PyTypeObject *basebase;
1775
1776#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00001777#undef COPYSLOT
1778#undef COPYNUM
1779#undef COPYSEQ
1780#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00001781#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00001782
1783#define SLOTDEFINED(SLOT) \
1784 (base->SLOT != 0 && \
1785 (basebase == NULL || base->SLOT != basebase->SLOT))
1786
Tim Peters6d6c1a32001-08-02 04:15:00 +00001787#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00001788 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00001789
1790#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
1791#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
1792#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00001793#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001794
Guido van Rossum13d52f02001-08-10 21:24:08 +00001795 /* This won't inherit indirect slots (from tp_as_number etc.)
1796 if type doesn't provide the space. */
1797
1798 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
1799 basebase = base->tp_base;
1800 if (basebase->tp_as_number == NULL)
1801 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001802 COPYNUM(nb_add);
1803 COPYNUM(nb_subtract);
1804 COPYNUM(nb_multiply);
1805 COPYNUM(nb_divide);
1806 COPYNUM(nb_remainder);
1807 COPYNUM(nb_divmod);
1808 COPYNUM(nb_power);
1809 COPYNUM(nb_negative);
1810 COPYNUM(nb_positive);
1811 COPYNUM(nb_absolute);
1812 COPYNUM(nb_nonzero);
1813 COPYNUM(nb_invert);
1814 COPYNUM(nb_lshift);
1815 COPYNUM(nb_rshift);
1816 COPYNUM(nb_and);
1817 COPYNUM(nb_xor);
1818 COPYNUM(nb_or);
1819 COPYNUM(nb_coerce);
1820 COPYNUM(nb_int);
1821 COPYNUM(nb_long);
1822 COPYNUM(nb_float);
1823 COPYNUM(nb_oct);
1824 COPYNUM(nb_hex);
1825 COPYNUM(nb_inplace_add);
1826 COPYNUM(nb_inplace_subtract);
1827 COPYNUM(nb_inplace_multiply);
1828 COPYNUM(nb_inplace_divide);
1829 COPYNUM(nb_inplace_remainder);
1830 COPYNUM(nb_inplace_power);
1831 COPYNUM(nb_inplace_lshift);
1832 COPYNUM(nb_inplace_rshift);
1833 COPYNUM(nb_inplace_and);
1834 COPYNUM(nb_inplace_xor);
1835 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00001836 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
1837 COPYNUM(nb_true_divide);
1838 COPYNUM(nb_floor_divide);
1839 COPYNUM(nb_inplace_true_divide);
1840 COPYNUM(nb_inplace_floor_divide);
1841 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001842 }
1843
Guido van Rossum13d52f02001-08-10 21:24:08 +00001844 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
1845 basebase = base->tp_base;
1846 if (basebase->tp_as_sequence == NULL)
1847 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001848 COPYSEQ(sq_length);
1849 COPYSEQ(sq_concat);
1850 COPYSEQ(sq_repeat);
1851 COPYSEQ(sq_item);
1852 COPYSEQ(sq_slice);
1853 COPYSEQ(sq_ass_item);
1854 COPYSEQ(sq_ass_slice);
1855 COPYSEQ(sq_contains);
1856 COPYSEQ(sq_inplace_concat);
1857 COPYSEQ(sq_inplace_repeat);
1858 }
1859
Guido van Rossum13d52f02001-08-10 21:24:08 +00001860 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
1861 basebase = base->tp_base;
1862 if (basebase->tp_as_mapping == NULL)
1863 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001864 COPYMAP(mp_length);
1865 COPYMAP(mp_subscript);
1866 COPYMAP(mp_ass_subscript);
1867 }
1868
Tim Petersfc57ccb2001-10-12 02:38:24 +00001869 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
1870 basebase = base->tp_base;
1871 if (basebase->tp_as_buffer == NULL)
1872 basebase = NULL;
1873 COPYBUF(bf_getreadbuffer);
1874 COPYBUF(bf_getwritebuffer);
1875 COPYBUF(bf_getsegcount);
1876 COPYBUF(bf_getcharbuffer);
1877 }
1878
Guido van Rossum13d52f02001-08-10 21:24:08 +00001879 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001880
Tim Peters6d6c1a32001-08-02 04:15:00 +00001881 COPYSLOT(tp_dealloc);
1882 COPYSLOT(tp_print);
1883 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
1884 type->tp_getattr = base->tp_getattr;
1885 type->tp_getattro = base->tp_getattro;
1886 }
1887 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
1888 type->tp_setattr = base->tp_setattr;
1889 type->tp_setattro = base->tp_setattro;
1890 }
1891 /* tp_compare see tp_richcompare */
1892 COPYSLOT(tp_repr);
Guido van Rossumb8f63662001-08-15 23:57:02 +00001893 /* tp_hash see tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001894 COPYSLOT(tp_call);
1895 COPYSLOT(tp_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001896 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00001897 if (type->tp_compare == NULL &&
1898 type->tp_richcompare == NULL &&
1899 type->tp_hash == NULL)
1900 {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001901 type->tp_compare = base->tp_compare;
1902 type->tp_richcompare = base->tp_richcompare;
Guido van Rossumb8f63662001-08-15 23:57:02 +00001903 type->tp_hash = base->tp_hash;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001904 }
1905 }
1906 else {
1907 COPYSLOT(tp_compare);
1908 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001909 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
1910 COPYSLOT(tp_iter);
1911 COPYSLOT(tp_iternext);
1912 }
1913 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
1914 COPYSLOT(tp_descr_get);
1915 COPYSLOT(tp_descr_set);
1916 COPYSLOT(tp_dictoffset);
1917 COPYSLOT(tp_init);
1918 COPYSLOT(tp_alloc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001919 COPYSLOT(tp_free);
1920 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001921}
1922
Guido van Rossum13d52f02001-08-10 21:24:08 +00001923staticforward int add_operators(PyTypeObject *);
Guido van Rossum1c450732001-10-08 15:18:27 +00001924staticforward int add_subclass(PyTypeObject *base, PyTypeObject *type);
Guido van Rossum13d52f02001-08-10 21:24:08 +00001925
Tim Peters6d6c1a32001-08-02 04:15:00 +00001926int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001927PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001928{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001929 PyObject *dict, *bases;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001930 PyTypeObject *base;
1931 int i, n;
1932
Guido van Rossumd614f972001-08-10 17:39:49 +00001933 if (type->tp_flags & Py_TPFLAGS_READY) {
1934 assert(type->tp_dict != NULL);
1935 return 0;
1936 }
1937 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00001938
1939 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001940
1941 /* Initialize tp_base (defaults to BaseObject unless that's us) */
1942 base = type->tp_base;
1943 if (base == NULL && type != &PyBaseObject_Type)
1944 base = type->tp_base = &PyBaseObject_Type;
1945
1946 /* Initialize tp_bases */
1947 bases = type->tp_bases;
1948 if (bases == NULL) {
1949 if (base == NULL)
1950 bases = PyTuple_New(0);
1951 else
1952 bases = Py_BuildValue("(O)", base);
1953 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00001954 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001955 type->tp_bases = bases;
1956 }
1957
1958 /* Initialize the base class */
Guido van Rossum0d231ed2001-08-06 16:50:37 +00001959 if (base && base->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001960 if (PyType_Ready(base) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001961 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001962 }
1963
Guido van Rossum687ae002001-10-15 22:03:32 +00001964 /* Initialize tp_dict */
1965 dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001966 if (dict == NULL) {
1967 dict = PyDict_New();
1968 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00001969 goto error;
Guido van Rossum687ae002001-10-15 22:03:32 +00001970 type->tp_dict = dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001971 }
1972
Guido van Rossum687ae002001-10-15 22:03:32 +00001973 /* Add type-specific descriptors to tp_dict */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001974 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001975 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001976 if (type->tp_methods != NULL) {
1977 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001978 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001979 }
1980 if (type->tp_members != NULL) {
1981 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001982 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001983 }
1984 if (type->tp_getset != NULL) {
1985 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00001986 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001987 }
1988
Tim Peters6d6c1a32001-08-02 04:15:00 +00001989 /* Calculate method resolution order */
1990 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00001991 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001992 }
1993
Guido van Rossum13d52f02001-08-10 21:24:08 +00001994 /* Inherit special flags from dominant base */
1995 if (type->tp_base != NULL)
1996 inherit_special(type, type->tp_base);
1997
Tim Peters6d6c1a32001-08-02 04:15:00 +00001998 /* Initialize tp_dict properly */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001999 bases = type->tp_mro;
2000 assert(bases != NULL);
2001 assert(PyTuple_Check(bases));
2002 n = PyTuple_GET_SIZE(bases);
2003 for (i = 1; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002004 PyObject *b = PyTuple_GET_ITEM(bases, i);
2005 if (PyType_Check(b))
2006 inherit_slots(type, (PyTypeObject *)b);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002007 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002008
Guido van Rossum13d52f02001-08-10 21:24:08 +00002009 /* Some more special stuff */
2010 base = type->tp_base;
2011 if (base != NULL) {
2012 if (type->tp_as_number == NULL)
2013 type->tp_as_number = base->tp_as_number;
2014 if (type->tp_as_sequence == NULL)
2015 type->tp_as_sequence = base->tp_as_sequence;
2016 if (type->tp_as_mapping == NULL)
2017 type->tp_as_mapping = base->tp_as_mapping;
2018 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002019
Guido van Rossum1c450732001-10-08 15:18:27 +00002020 /* Link into each base class's list of subclasses */
2021 bases = type->tp_bases;
2022 n = PyTuple_GET_SIZE(bases);
2023 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002024 PyObject *b = PyTuple_GET_ITEM(bases, i);
2025 if (PyType_Check(b) &&
2026 add_subclass((PyTypeObject *)b, type) < 0)
Guido van Rossum1c450732001-10-08 15:18:27 +00002027 goto error;
2028 }
2029
Guido van Rossum13d52f02001-08-10 21:24:08 +00002030 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00002031 assert(type->tp_dict != NULL);
2032 type->tp_flags =
2033 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002034 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00002035
2036 error:
2037 type->tp_flags &= ~Py_TPFLAGS_READYING;
2038 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002039}
2040
Guido van Rossum1c450732001-10-08 15:18:27 +00002041static int
2042add_subclass(PyTypeObject *base, PyTypeObject *type)
2043{
2044 int i;
2045 PyObject *list, *ref, *new;
2046
2047 list = base->tp_subclasses;
2048 if (list == NULL) {
2049 base->tp_subclasses = list = PyList_New(0);
2050 if (list == NULL)
2051 return -1;
2052 }
2053 assert(PyList_Check(list));
2054 new = PyWeakref_NewRef((PyObject *)type, NULL);
2055 i = PyList_GET_SIZE(list);
2056 while (--i >= 0) {
2057 ref = PyList_GET_ITEM(list, i);
2058 assert(PyWeakref_CheckRef(ref));
2059 if (PyWeakref_GET_OBJECT(ref) == Py_None)
2060 return PyList_SetItem(list, i, new);
2061 }
2062 i = PyList_Append(list, new);
2063 Py_DECREF(new);
2064 return i;
2065}
2066
Tim Peters6d6c1a32001-08-02 04:15:00 +00002067
2068/* Generic wrappers for overloadable 'operators' such as __getitem__ */
2069
2070/* There's a wrapper *function* for each distinct function typedef used
2071 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
2072 wrapper *table* for each distinct operation (e.g. __len__, __add__).
2073 Most tables have only one entry; the tables for binary operators have two
2074 entries, one regular and one with reversed arguments. */
2075
2076static PyObject *
2077wrap_inquiry(PyObject *self, PyObject *args, void *wrapped)
2078{
2079 inquiry func = (inquiry)wrapped;
2080 int res;
2081
2082 if (!PyArg_ParseTuple(args, ""))
2083 return NULL;
2084 res = (*func)(self);
2085 if (res == -1 && PyErr_Occurred())
2086 return NULL;
2087 return PyInt_FromLong((long)res);
2088}
2089
Tim Peters6d6c1a32001-08-02 04:15:00 +00002090static PyObject *
2091wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
2092{
2093 binaryfunc func = (binaryfunc)wrapped;
2094 PyObject *other;
2095
2096 if (!PyArg_ParseTuple(args, "O", &other))
2097 return NULL;
2098 return (*func)(self, other);
2099}
2100
2101static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002102wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
2103{
2104 binaryfunc func = (binaryfunc)wrapped;
2105 PyObject *other;
2106
2107 if (!PyArg_ParseTuple(args, "O", &other))
2108 return NULL;
2109 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002110 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002111 Py_INCREF(Py_NotImplemented);
2112 return Py_NotImplemented;
2113 }
2114 return (*func)(self, other);
2115}
2116
2117static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002118wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
2119{
2120 binaryfunc func = (binaryfunc)wrapped;
2121 PyObject *other;
2122
2123 if (!PyArg_ParseTuple(args, "O", &other))
2124 return NULL;
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002125 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002126 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002127 Py_INCREF(Py_NotImplemented);
2128 return Py_NotImplemented;
2129 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002130 return (*func)(other, self);
2131}
2132
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002133static PyObject *
2134wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
2135{
2136 coercion func = (coercion)wrapped;
2137 PyObject *other, *res;
2138 int ok;
2139
2140 if (!PyArg_ParseTuple(args, "O", &other))
2141 return NULL;
2142 ok = func(&self, &other);
2143 if (ok < 0)
2144 return NULL;
2145 if (ok > 0) {
2146 Py_INCREF(Py_NotImplemented);
2147 return Py_NotImplemented;
2148 }
2149 res = PyTuple_New(2);
2150 if (res == NULL) {
2151 Py_DECREF(self);
2152 Py_DECREF(other);
2153 return NULL;
2154 }
2155 PyTuple_SET_ITEM(res, 0, self);
2156 PyTuple_SET_ITEM(res, 1, other);
2157 return res;
2158}
2159
Tim Peters6d6c1a32001-08-02 04:15:00 +00002160static PyObject *
2161wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
2162{
2163 ternaryfunc func = (ternaryfunc)wrapped;
2164 PyObject *other;
2165 PyObject *third = Py_None;
2166
2167 /* Note: This wrapper only works for __pow__() */
2168
2169 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
2170 return NULL;
2171 return (*func)(self, other, third);
2172}
2173
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00002174static PyObject *
2175wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
2176{
2177 ternaryfunc func = (ternaryfunc)wrapped;
2178 PyObject *other;
2179 PyObject *third = Py_None;
2180
2181 /* Note: This wrapper only works for __pow__() */
2182
2183 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
2184 return NULL;
2185 return (*func)(other, self, third);
2186}
2187
Tim Peters6d6c1a32001-08-02 04:15:00 +00002188static PyObject *
2189wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
2190{
2191 unaryfunc func = (unaryfunc)wrapped;
2192
2193 if (!PyArg_ParseTuple(args, ""))
2194 return NULL;
2195 return (*func)(self);
2196}
2197
Tim Peters6d6c1a32001-08-02 04:15:00 +00002198static PyObject *
2199wrap_intargfunc(PyObject *self, PyObject *args, void *wrapped)
2200{
2201 intargfunc func = (intargfunc)wrapped;
2202 int i;
2203
2204 if (!PyArg_ParseTuple(args, "i", &i))
2205 return NULL;
2206 return (*func)(self, i);
2207}
2208
Guido van Rossum5d815f32001-08-17 21:57:47 +00002209static int
2210getindex(PyObject *self, PyObject *arg)
2211{
2212 int i;
2213
2214 i = PyInt_AsLong(arg);
2215 if (i == -1 && PyErr_Occurred())
2216 return -1;
2217 if (i < 0) {
2218 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
2219 if (sq && sq->sq_length) {
2220 int n = (*sq->sq_length)(self);
2221 if (n < 0)
2222 return -1;
2223 i += n;
2224 }
2225 }
2226 return i;
2227}
2228
2229static PyObject *
2230wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
2231{
2232 intargfunc func = (intargfunc)wrapped;
2233 PyObject *arg;
2234 int i;
2235
Guido van Rossumf4593e02001-10-03 12:09:30 +00002236 if (PyTuple_GET_SIZE(args) == 1) {
2237 arg = PyTuple_GET_ITEM(args, 0);
2238 i = getindex(self, arg);
2239 if (i == -1 && PyErr_Occurred())
2240 return NULL;
2241 return (*func)(self, i);
2242 }
2243 PyArg_ParseTuple(args, "O", &arg);
2244 assert(PyErr_Occurred());
2245 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002246}
2247
Tim Peters6d6c1a32001-08-02 04:15:00 +00002248static PyObject *
2249wrap_intintargfunc(PyObject *self, PyObject *args, void *wrapped)
2250{
2251 intintargfunc func = (intintargfunc)wrapped;
2252 int i, j;
2253
2254 if (!PyArg_ParseTuple(args, "ii", &i, &j))
2255 return NULL;
2256 return (*func)(self, i, j);
2257}
2258
Tim Peters6d6c1a32001-08-02 04:15:00 +00002259static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00002260wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002261{
2262 intobjargproc func = (intobjargproc)wrapped;
2263 int i, res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002264 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002265
Guido van Rossum5d815f32001-08-17 21:57:47 +00002266 if (!PyArg_ParseTuple(args, "OO", &arg, &value))
2267 return NULL;
2268 i = getindex(self, arg);
2269 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00002270 return NULL;
2271 res = (*func)(self, i, value);
2272 if (res == -1 && PyErr_Occurred())
2273 return NULL;
2274 Py_INCREF(Py_None);
2275 return Py_None;
2276}
2277
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002278static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00002279wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002280{
2281 intobjargproc func = (intobjargproc)wrapped;
2282 int i, res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002283 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002284
Guido van Rossum5d815f32001-08-17 21:57:47 +00002285 if (!PyArg_ParseTuple(args, "O", &arg))
2286 return NULL;
2287 i = getindex(self, arg);
2288 if (i == -1 && PyErr_Occurred())
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002289 return NULL;
2290 res = (*func)(self, i, NULL);
2291 if (res == -1 && PyErr_Occurred())
2292 return NULL;
2293 Py_INCREF(Py_None);
2294 return Py_None;
2295}
2296
Tim Peters6d6c1a32001-08-02 04:15:00 +00002297static PyObject *
2298wrap_intintobjargproc(PyObject *self, PyObject *args, void *wrapped)
2299{
2300 intintobjargproc func = (intintobjargproc)wrapped;
2301 int i, j, res;
2302 PyObject *value;
2303
2304 if (!PyArg_ParseTuple(args, "iiO", &i, &j, &value))
2305 return NULL;
2306 res = (*func)(self, i, j, value);
2307 if (res == -1 && PyErr_Occurred())
2308 return NULL;
2309 Py_INCREF(Py_None);
2310 return Py_None;
2311}
2312
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002313static PyObject *
2314wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
2315{
2316 intintobjargproc func = (intintobjargproc)wrapped;
2317 int i, j, res;
2318
2319 if (!PyArg_ParseTuple(args, "ii", &i, &j))
2320 return NULL;
2321 res = (*func)(self, i, j, NULL);
2322 if (res == -1 && PyErr_Occurred())
2323 return NULL;
2324 Py_INCREF(Py_None);
2325 return Py_None;
2326}
2327
Tim Peters6d6c1a32001-08-02 04:15:00 +00002328/* XXX objobjproc is a misnomer; should be objargpred */
2329static PyObject *
2330wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
2331{
2332 objobjproc func = (objobjproc)wrapped;
2333 int res;
2334 PyObject *value;
2335
2336 if (!PyArg_ParseTuple(args, "O", &value))
2337 return NULL;
2338 res = (*func)(self, value);
2339 if (res == -1 && PyErr_Occurred())
2340 return NULL;
2341 return PyInt_FromLong((long)res);
2342}
2343
Tim Peters6d6c1a32001-08-02 04:15:00 +00002344static PyObject *
2345wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
2346{
2347 objobjargproc func = (objobjargproc)wrapped;
2348 int res;
2349 PyObject *key, *value;
2350
2351 if (!PyArg_ParseTuple(args, "OO", &key, &value))
2352 return NULL;
2353 res = (*func)(self, key, value);
2354 if (res == -1 && PyErr_Occurred())
2355 return NULL;
2356 Py_INCREF(Py_None);
2357 return Py_None;
2358}
2359
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002360static PyObject *
2361wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
2362{
2363 objobjargproc func = (objobjargproc)wrapped;
2364 int res;
2365 PyObject *key;
2366
2367 if (!PyArg_ParseTuple(args, "O", &key))
2368 return NULL;
2369 res = (*func)(self, key, NULL);
2370 if (res == -1 && PyErr_Occurred())
2371 return NULL;
2372 Py_INCREF(Py_None);
2373 return Py_None;
2374}
2375
Tim Peters6d6c1a32001-08-02 04:15:00 +00002376static PyObject *
2377wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
2378{
2379 cmpfunc func = (cmpfunc)wrapped;
2380 int res;
2381 PyObject *other;
2382
2383 if (!PyArg_ParseTuple(args, "O", &other))
2384 return NULL;
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00002385 if (other->ob_type->tp_compare != func &&
2386 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossumceccae52001-09-18 20:03:57 +00002387 PyErr_Format(
2388 PyExc_TypeError,
2389 "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
2390 self->ob_type->tp_name,
2391 self->ob_type->tp_name,
2392 other->ob_type->tp_name);
2393 return NULL;
2394 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002395 res = (*func)(self, other);
2396 if (PyErr_Occurred())
2397 return NULL;
2398 return PyInt_FromLong((long)res);
2399}
2400
Tim Peters6d6c1a32001-08-02 04:15:00 +00002401static PyObject *
2402wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
2403{
2404 setattrofunc func = (setattrofunc)wrapped;
2405 int res;
2406 PyObject *name, *value;
2407
2408 if (!PyArg_ParseTuple(args, "OO", &name, &value))
2409 return NULL;
2410 res = (*func)(self, name, value);
2411 if (res < 0)
2412 return NULL;
2413 Py_INCREF(Py_None);
2414 return Py_None;
2415}
2416
2417static PyObject *
2418wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
2419{
2420 setattrofunc func = (setattrofunc)wrapped;
2421 int res;
2422 PyObject *name;
2423
2424 if (!PyArg_ParseTuple(args, "O", &name))
2425 return NULL;
2426 res = (*func)(self, name, NULL);
2427 if (res < 0)
2428 return NULL;
2429 Py_INCREF(Py_None);
2430 return Py_None;
2431}
2432
Tim Peters6d6c1a32001-08-02 04:15:00 +00002433static PyObject *
2434wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
2435{
2436 hashfunc func = (hashfunc)wrapped;
2437 long res;
2438
2439 if (!PyArg_ParseTuple(args, ""))
2440 return NULL;
2441 res = (*func)(self);
2442 if (res == -1 && PyErr_Occurred())
2443 return NULL;
2444 return PyInt_FromLong(res);
2445}
2446
Tim Peters6d6c1a32001-08-02 04:15:00 +00002447static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00002448wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002449{
2450 ternaryfunc func = (ternaryfunc)wrapped;
2451
Guido van Rossumc8e56452001-10-22 00:43:43 +00002452 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002453}
2454
Tim Peters6d6c1a32001-08-02 04:15:00 +00002455static PyObject *
2456wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
2457{
2458 richcmpfunc func = (richcmpfunc)wrapped;
2459 PyObject *other;
2460
2461 if (!PyArg_ParseTuple(args, "O", &other))
2462 return NULL;
2463 return (*func)(self, other, op);
2464}
2465
2466#undef RICHCMP_WRAPPER
2467#define RICHCMP_WRAPPER(NAME, OP) \
2468static PyObject * \
2469richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
2470{ \
2471 return wrap_richcmpfunc(self, args, wrapped, OP); \
2472}
2473
Jack Jansen8e938b42001-08-08 15:29:49 +00002474RICHCMP_WRAPPER(lt, Py_LT)
2475RICHCMP_WRAPPER(le, Py_LE)
2476RICHCMP_WRAPPER(eq, Py_EQ)
2477RICHCMP_WRAPPER(ne, Py_NE)
2478RICHCMP_WRAPPER(gt, Py_GT)
2479RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002480
Tim Peters6d6c1a32001-08-02 04:15:00 +00002481static PyObject *
2482wrap_next(PyObject *self, PyObject *args, void *wrapped)
2483{
2484 unaryfunc func = (unaryfunc)wrapped;
2485 PyObject *res;
2486
2487 if (!PyArg_ParseTuple(args, ""))
2488 return NULL;
2489 res = (*func)(self);
2490 if (res == NULL && !PyErr_Occurred())
2491 PyErr_SetNone(PyExc_StopIteration);
2492 return res;
2493}
2494
Tim Peters6d6c1a32001-08-02 04:15:00 +00002495static PyObject *
2496wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
2497{
2498 descrgetfunc func = (descrgetfunc)wrapped;
2499 PyObject *obj;
2500 PyObject *type = NULL;
2501
2502 if (!PyArg_ParseTuple(args, "O|O", &obj, &type))
2503 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002504 return (*func)(self, obj, type);
2505}
2506
Tim Peters6d6c1a32001-08-02 04:15:00 +00002507static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002508wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002509{
2510 descrsetfunc func = (descrsetfunc)wrapped;
2511 PyObject *obj, *value;
2512 int ret;
2513
2514 if (!PyArg_ParseTuple(args, "OO", &obj, &value))
2515 return NULL;
2516 ret = (*func)(self, obj, value);
2517 if (ret < 0)
2518 return NULL;
2519 Py_INCREF(Py_None);
2520 return Py_None;
2521}
2522
Tim Peters6d6c1a32001-08-02 04:15:00 +00002523static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00002524wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002525{
2526 initproc func = (initproc)wrapped;
2527
Guido van Rossumc8e56452001-10-22 00:43:43 +00002528 if (func(self, args, kwds) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002529 return NULL;
2530 Py_INCREF(Py_None);
2531 return Py_None;
2532}
2533
Tim Peters6d6c1a32001-08-02 04:15:00 +00002534static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002535tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002536{
Barry Warsaw60f01882001-08-22 19:24:42 +00002537 PyTypeObject *type, *subtype, *staticbase;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002538 PyObject *arg0, *res;
2539
2540 if (self == NULL || !PyType_Check(self))
2541 Py_FatalError("__new__() called with non-type 'self'");
2542 type = (PyTypeObject *)self;
2543 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002544 PyErr_Format(PyExc_TypeError,
2545 "%s.__new__(): not enough arguments",
2546 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002547 return NULL;
2548 }
2549 arg0 = PyTuple_GET_ITEM(args, 0);
2550 if (!PyType_Check(arg0)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002551 PyErr_Format(PyExc_TypeError,
2552 "%s.__new__(X): X is not a type object (%s)",
2553 type->tp_name,
2554 arg0->ob_type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002555 return NULL;
2556 }
2557 subtype = (PyTypeObject *)arg0;
2558 if (!PyType_IsSubtype(subtype, type)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002559 PyErr_Format(PyExc_TypeError,
2560 "%s.__new__(%s): %s is not a subtype of %s",
2561 type->tp_name,
2562 subtype->tp_name,
2563 subtype->tp_name,
2564 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002565 return NULL;
2566 }
Barry Warsaw60f01882001-08-22 19:24:42 +00002567
2568 /* Check that the use doesn't do something silly and unsafe like
Tim Petersa427a2b2001-10-29 22:25:45 +00002569 object.__new__(dict). To do this, we check that the
Barry Warsaw60f01882001-08-22 19:24:42 +00002570 most derived base that's not a heap type is this type. */
2571 staticbase = subtype;
2572 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
2573 staticbase = staticbase->tp_base;
Guido van Rossuma8c60f42001-09-14 19:43:36 +00002574 if (staticbase->tp_new != type->tp_new) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002575 PyErr_Format(PyExc_TypeError,
2576 "%s.__new__(%s) is not safe, use %s.__new__()",
2577 type->tp_name,
2578 subtype->tp_name,
2579 staticbase == NULL ? "?" : staticbase->tp_name);
2580 return NULL;
2581 }
2582
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002583 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
2584 if (args == NULL)
2585 return NULL;
2586 res = type->tp_new(subtype, args, kwds);
2587 Py_DECREF(args);
2588 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002589}
2590
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002591static struct PyMethodDef tp_new_methoddef[] = {
2592 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
2593 "T.__new__(S, ...) -> a new object with type S, a subtype of T"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002594 {0}
2595};
2596
2597static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002598add_tp_new_wrapper(PyTypeObject *type)
2599{
Guido van Rossumf040ede2001-08-07 16:40:56 +00002600 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002601
Guido van Rossum687ae002001-10-15 22:03:32 +00002602 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
Guido van Rossumf040ede2001-08-07 16:40:56 +00002603 return 0;
2604 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002605 if (func == NULL)
2606 return -1;
Guido van Rossum687ae002001-10-15 22:03:32 +00002607 return PyDict_SetItemString(type->tp_dict, "__new__", func);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002608}
2609
Guido van Rossumf040ede2001-08-07 16:40:56 +00002610/* Slot wrappers that call the corresponding __foo__ slot. See comments
2611 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002612
Guido van Rossumdc91b992001-08-08 22:26:22 +00002613#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002614static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002615FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002616{ \
Guido van Rossum5592e4d2001-08-28 18:28:21 +00002617 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002618 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002619}
2620
Guido van Rossumdc91b992001-08-08 22:26:22 +00002621#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002622static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002623FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002624{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002625 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002626 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002627}
2628
Guido van Rossumdc91b992001-08-08 22:26:22 +00002629
2630#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002631static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002632FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002633{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002634 static PyObject *cache_str, *rcache_str; \
Guido van Rossum55f20992001-10-01 17:18:22 +00002635 int do_other = self->ob_type != other->ob_type && \
2636 other->ob_type->tp_as_number != NULL && \
2637 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002638 if (self->ob_type->tp_as_number != NULL && \
2639 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
2640 PyObject *r; \
Guido van Rossum55f20992001-10-01 17:18:22 +00002641 if (do_other && \
2642 PyType_IsSubtype(other->ob_type, self->ob_type)) { \
2643 r = call_maybe( \
2644 other, ROPSTR, &rcache_str, "(O)", self); \
2645 if (r != Py_NotImplemented) \
2646 return r; \
2647 Py_DECREF(r); \
2648 do_other = 0; \
2649 } \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00002650 r = call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00002651 self, OPSTR, &cache_str, "(O)", other); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002652 if (r != Py_NotImplemented || \
2653 other->ob_type == self->ob_type) \
2654 return r; \
2655 Py_DECREF(r); \
2656 } \
Guido van Rossum55f20992001-10-01 17:18:22 +00002657 if (do_other) { \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00002658 return call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00002659 other, ROPSTR, &rcache_str, "(O)", self); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002660 } \
2661 Py_INCREF(Py_NotImplemented); \
2662 return Py_NotImplemented; \
2663}
2664
2665#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
2666 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
2667
2668#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
2669static PyObject * \
2670FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
2671{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002672 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002673 return call_method(self, OPSTR, &cache_str, \
2674 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002675}
2676
2677static int
2678slot_sq_length(PyObject *self)
2679{
Guido van Rossum2730b132001-08-28 18:22:14 +00002680 static PyObject *len_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00002681 PyObject *res = call_method(self, "__len__", &len_str, "()");
Guido van Rossum26111622001-10-01 16:42:49 +00002682 int len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002683
2684 if (res == NULL)
2685 return -1;
Guido van Rossum26111622001-10-01 16:42:49 +00002686 len = (int)PyInt_AsLong(res);
2687 Py_DECREF(res);
2688 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002689}
2690
Guido van Rossumdc91b992001-08-08 22:26:22 +00002691SLOT1(slot_sq_concat, "__add__", PyObject *, "O")
2692SLOT1(slot_sq_repeat, "__mul__", int, "i")
Guido van Rossumf4593e02001-10-03 12:09:30 +00002693
2694/* Super-optimized version of slot_sq_item.
2695 Other slots could do the same... */
2696static PyObject *
2697slot_sq_item(PyObject *self, int i)
2698{
2699 static PyObject *getitem_str;
2700 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
2701 descrgetfunc f;
2702
2703 if (getitem_str == NULL) {
2704 getitem_str = PyString_InternFromString("__getitem__");
2705 if (getitem_str == NULL)
2706 return NULL;
2707 }
2708 func = _PyType_Lookup(self->ob_type, getitem_str);
2709 if (func != NULL) {
Guido van Rossumf4593e02001-10-03 12:09:30 +00002710 if ((f = func->ob_type->tp_descr_get) == NULL)
2711 Py_INCREF(func);
2712 else
2713 func = f(func, self, (PyObject *)(self->ob_type));
2714 ival = PyInt_FromLong(i);
2715 if (ival != NULL) {
2716 args = PyTuple_New(1);
2717 if (args != NULL) {
2718 PyTuple_SET_ITEM(args, 0, ival);
2719 retval = PyObject_Call(func, args, NULL);
2720 Py_XDECREF(args);
2721 Py_XDECREF(func);
2722 return retval;
2723 }
2724 }
2725 }
2726 else {
2727 PyErr_SetObject(PyExc_AttributeError, getitem_str);
2728 }
2729 Py_XDECREF(args);
2730 Py_XDECREF(ival);
2731 Py_XDECREF(func);
2732 return NULL;
2733}
2734
Guido van Rossumdc91b992001-08-08 22:26:22 +00002735SLOT2(slot_sq_slice, "__getslice__", int, int, "ii")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002736
2737static int
2738slot_sq_ass_item(PyObject *self, int index, PyObject *value)
2739{
2740 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00002741 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002742
2743 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00002744 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002745 "(i)", index);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002746 else
Guido van Rossum2730b132001-08-28 18:22:14 +00002747 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002748 "(iO)", index, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002749 if (res == NULL)
2750 return -1;
2751 Py_DECREF(res);
2752 return 0;
2753}
2754
2755static int
2756slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value)
2757{
2758 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00002759 static PyObject *delslice_str, *setslice_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002760
2761 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00002762 res = call_method(self, "__delslice__", &delslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002763 "(ii)", i, j);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002764 else
Guido van Rossum2730b132001-08-28 18:22:14 +00002765 res = call_method(self, "__setslice__", &setslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002766 "(iiO)", i, j, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002767 if (res == NULL)
2768 return -1;
2769 Py_DECREF(res);
2770 return 0;
2771}
2772
2773static int
2774slot_sq_contains(PyObject *self, PyObject *value)
2775{
Guido van Rossumb8f63662001-08-15 23:57:02 +00002776 PyObject *func, *res, *args;
Guido van Rossum60718732001-08-28 17:47:51 +00002777 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002778
Guido van Rossum55f20992001-10-01 17:18:22 +00002779 func = lookup_maybe(self, "__contains__", &contains_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002780
2781 if (func != NULL) {
2782 args = Py_BuildValue("(O)", value);
2783 if (args == NULL)
2784 res = NULL;
2785 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00002786 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002787 Py_DECREF(args);
2788 }
2789 Py_DECREF(func);
2790 if (res == NULL)
2791 return -1;
2792 return PyObject_IsTrue(res);
2793 }
Guido van Rossum55f20992001-10-01 17:18:22 +00002794 else if (PyErr_Occurred())
2795 return -1;
Guido van Rossumb8f63662001-08-15 23:57:02 +00002796 else {
Tim Peters16a77ad2001-09-08 04:00:12 +00002797 return _PySequence_IterSearch(self, value,
2798 PY_ITERSEARCH_CONTAINS);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002799 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002800}
2801
Guido van Rossumdc91b992001-08-08 22:26:22 +00002802SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
2803SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002804
2805#define slot_mp_length slot_sq_length
2806
Guido van Rossumdc91b992001-08-08 22:26:22 +00002807SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002808
2809static int
2810slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
2811{
2812 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00002813 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002814
2815 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00002816 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002817 "(O)", key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002818 else
Guido van Rossum2730b132001-08-28 18:22:14 +00002819 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002820 "(OO)", key, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002821 if (res == NULL)
2822 return -1;
2823 Py_DECREF(res);
2824 return 0;
2825}
2826
Guido van Rossumdc91b992001-08-08 22:26:22 +00002827SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
2828SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
2829SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
2830SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
2831SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
2832SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
2833
2834staticforward PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
2835
2836SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
2837 nb_power, "__pow__", "__rpow__")
2838
2839static PyObject *
2840slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
2841{
Guido van Rossum2730b132001-08-28 18:22:14 +00002842 static PyObject *pow_str;
2843
Guido van Rossumdc91b992001-08-08 22:26:22 +00002844 if (modulus == Py_None)
2845 return slot_nb_power_binary(self, other);
2846 /* Three-arg power doesn't use __rpow__ */
Guido van Rossum2730b132001-08-28 18:22:14 +00002847 return call_method(self, "__pow__", &pow_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00002848 "(OO)", other, modulus);
Guido van Rossumdc91b992001-08-08 22:26:22 +00002849}
2850
2851SLOT0(slot_nb_negative, "__neg__")
2852SLOT0(slot_nb_positive, "__pos__")
2853SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002854
2855static int
2856slot_nb_nonzero(PyObject *self)
2857{
Guido van Rossumb8f63662001-08-15 23:57:02 +00002858 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00002859 static PyObject *nonzero_str, *len_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002860
Guido van Rossum55f20992001-10-01 17:18:22 +00002861 func = lookup_maybe(self, "__nonzero__", &nonzero_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002862 if (func == NULL) {
Guido van Rossum55f20992001-10-01 17:18:22 +00002863 if (PyErr_Occurred())
Guido van Rossumb8f63662001-08-15 23:57:02 +00002864 return -1;
Guido van Rossum55f20992001-10-01 17:18:22 +00002865 func = lookup_maybe(self, "__len__", &len_str);
2866 if (func == NULL) {
2867 if (PyErr_Occurred())
2868 return -1;
2869 else
2870 return 1;
2871 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00002872 }
Guido van Rossum55f20992001-10-01 17:18:22 +00002873 res = PyObject_CallObject(func, NULL);
2874 Py_DECREF(func);
2875 if (res == NULL)
2876 return -1;
2877 return PyObject_IsTrue(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002878}
2879
Guido van Rossumdc91b992001-08-08 22:26:22 +00002880SLOT0(slot_nb_invert, "__invert__")
2881SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
2882SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
2883SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
2884SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
2885SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002886
2887static int
2888slot_nb_coerce(PyObject **a, PyObject **b)
2889{
2890 static PyObject *coerce_str;
2891 PyObject *self = *a, *other = *b;
2892
2893 if (self->ob_type->tp_as_number != NULL &&
2894 self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
2895 PyObject *r;
2896 r = call_maybe(
2897 self, "__coerce__", &coerce_str, "(O)", other);
2898 if (r == NULL)
2899 return -1;
2900 if (r == Py_NotImplemented) {
2901 Py_DECREF(r);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002902 }
Guido van Rossum55f20992001-10-01 17:18:22 +00002903 else {
2904 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
2905 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002906 "__coerce__ didn't return a 2-tuple");
Guido van Rossum55f20992001-10-01 17:18:22 +00002907 Py_DECREF(r);
2908 return -1;
2909 }
2910 *a = PyTuple_GET_ITEM(r, 0);
2911 Py_INCREF(*a);
2912 *b = PyTuple_GET_ITEM(r, 1);
2913 Py_INCREF(*b);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002914 Py_DECREF(r);
Guido van Rossum55f20992001-10-01 17:18:22 +00002915 return 0;
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002916 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002917 }
2918 if (other->ob_type->tp_as_number != NULL &&
2919 other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
2920 PyObject *r;
2921 r = call_maybe(
2922 other, "__coerce__", &coerce_str, "(O)", self);
2923 if (r == NULL)
2924 return -1;
2925 if (r == Py_NotImplemented) {
2926 Py_DECREF(r);
2927 return 1;
2928 }
2929 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
2930 PyErr_SetString(PyExc_TypeError,
2931 "__coerce__ didn't return a 2-tuple");
2932 Py_DECREF(r);
2933 return -1;
2934 }
2935 *a = PyTuple_GET_ITEM(r, 1);
2936 Py_INCREF(*a);
2937 *b = PyTuple_GET_ITEM(r, 0);
2938 Py_INCREF(*b);
2939 Py_DECREF(r);
2940 return 0;
2941 }
2942 return 1;
2943}
2944
Guido van Rossumdc91b992001-08-08 22:26:22 +00002945SLOT0(slot_nb_int, "__int__")
2946SLOT0(slot_nb_long, "__long__")
2947SLOT0(slot_nb_float, "__float__")
2948SLOT0(slot_nb_oct, "__oct__")
2949SLOT0(slot_nb_hex, "__hex__")
2950SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
2951SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
2952SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
2953SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
2954SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
2955SLOT2(slot_nb_inplace_power, "__ipow__", PyObject *, PyObject *, "OO")
2956SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
2957SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
2958SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
2959SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
2960SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
2961SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
2962 "__floordiv__", "__rfloordiv__")
2963SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
2964SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
2965SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00002966
2967static int
Guido van Rossumb8f63662001-08-15 23:57:02 +00002968half_compare(PyObject *self, PyObject *other)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002969{
Guido van Rossumb8f63662001-08-15 23:57:02 +00002970 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00002971 static PyObject *cmp_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00002972 int c;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002973
Guido van Rossum60718732001-08-28 17:47:51 +00002974 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002975 if (func == NULL) {
2976 PyErr_Clear();
2977 }
2978 else {
2979 args = Py_BuildValue("(O)", other);
2980 if (args == NULL)
2981 res = NULL;
2982 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00002983 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002984 Py_DECREF(args);
2985 }
2986 if (res != Py_NotImplemented) {
2987 if (res == NULL)
2988 return -2;
2989 c = PyInt_AsLong(res);
2990 Py_DECREF(res);
2991 if (c == -1 && PyErr_Occurred())
2992 return -2;
2993 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
2994 }
2995 Py_DECREF(res);
2996 }
2997 return 2;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002998}
2999
Guido van Rossumab3b0342001-09-18 20:38:53 +00003000/* This slot is published for the benefit of try_3way_compare in object.c */
3001int
3002_PyObject_SlotCompare(PyObject *self, PyObject *other)
Guido van Rossumb8f63662001-08-15 23:57:02 +00003003{
3004 int c;
3005
Guido van Rossumab3b0342001-09-18 20:38:53 +00003006 if (self->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003007 c = half_compare(self, other);
3008 if (c <= 1)
3009 return c;
3010 }
Guido van Rossumab3b0342001-09-18 20:38:53 +00003011 if (other->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003012 c = half_compare(other, self);
3013 if (c < -1)
3014 return -2;
3015 if (c <= 1)
3016 return -c;
3017 }
3018 return (void *)self < (void *)other ? -1 :
3019 (void *)self > (void *)other ? 1 : 0;
3020}
3021
3022static PyObject *
3023slot_tp_repr(PyObject *self)
3024{
3025 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003026 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003027
Guido van Rossum60718732001-08-28 17:47:51 +00003028 func = lookup_method(self, "__repr__", &repr_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003029 if (func != NULL) {
3030 res = PyEval_CallObject(func, NULL);
3031 Py_DECREF(func);
3032 return res;
3033 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00003034 PyErr_Clear();
3035 return PyString_FromFormat("<%s object at %p>",
3036 self->ob_type->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003037}
3038
3039static PyObject *
3040slot_tp_str(PyObject *self)
3041{
3042 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003043 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003044
Guido van Rossum60718732001-08-28 17:47:51 +00003045 func = lookup_method(self, "__str__", &str_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003046 if (func != NULL) {
3047 res = PyEval_CallObject(func, NULL);
3048 Py_DECREF(func);
3049 return res;
3050 }
3051 else {
3052 PyErr_Clear();
3053 return slot_tp_repr(self);
3054 }
3055}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003056
3057static long
3058slot_tp_hash(PyObject *self)
3059{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003060 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003061 static PyObject *hash_str, *eq_str, *cmp_str;
3062
Tim Peters6d6c1a32001-08-02 04:15:00 +00003063 long h;
3064
Guido van Rossum60718732001-08-28 17:47:51 +00003065 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003066
3067 if (func != NULL) {
3068 res = PyEval_CallObject(func, NULL);
3069 Py_DECREF(func);
3070 if (res == NULL)
3071 return -1;
3072 h = PyInt_AsLong(res);
3073 }
3074 else {
3075 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003076 func = lookup_method(self, "__eq__", &eq_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003077 if (func == NULL) {
3078 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003079 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003080 }
3081 if (func != NULL) {
3082 Py_DECREF(func);
3083 PyErr_SetString(PyExc_TypeError, "unhashable type");
3084 return -1;
3085 }
3086 PyErr_Clear();
3087 h = _Py_HashPointer((void *)self);
3088 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003089 if (h == -1 && !PyErr_Occurred())
3090 h = -2;
3091 return h;
3092}
3093
3094static PyObject *
3095slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
3096{
Guido van Rossum60718732001-08-28 17:47:51 +00003097 static PyObject *call_str;
3098 PyObject *meth = lookup_method(self, "__call__", &call_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003099 PyObject *res;
3100
3101 if (meth == NULL)
3102 return NULL;
3103 res = PyObject_Call(meth, args, kwds);
3104 Py_DECREF(meth);
3105 return res;
3106}
3107
Guido van Rossum14a6f832001-10-17 13:59:09 +00003108/* There are two slot dispatch functions for tp_getattro.
3109
3110 - slot_tp_getattro() is used when __getattribute__ is overridden
3111 but no __getattr__ hook is present;
3112
3113 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
3114
3115 The code in update_slot() and fixup_slot_dispatchers() always installs
3116 slot_tp_getattr_hook(); this detects the absence of __getattr__ and then
3117 installs the simpler slot if necessary. */
3118
Tim Peters6d6c1a32001-08-02 04:15:00 +00003119static PyObject *
3120slot_tp_getattro(PyObject *self, PyObject *name)
3121{
Guido van Rossum14a6f832001-10-17 13:59:09 +00003122 static PyObject *getattribute_str = NULL;
3123 return call_method(self, "__getattribute__", &getattribute_str,
3124 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003125}
3126
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003127static PyObject *
3128slot_tp_getattr_hook(PyObject *self, PyObject *name)
3129{
3130 PyTypeObject *tp = self->ob_type;
3131 PyObject *getattr, *getattribute, *res;
3132 static PyObject *getattribute_str = NULL;
3133 static PyObject *getattr_str = NULL;
3134
3135 if (getattr_str == NULL) {
3136 getattr_str = PyString_InternFromString("__getattr__");
3137 if (getattr_str == NULL)
3138 return NULL;
3139 }
3140 if (getattribute_str == NULL) {
3141 getattribute_str =
3142 PyString_InternFromString("__getattribute__");
3143 if (getattribute_str == NULL)
3144 return NULL;
3145 }
3146 getattr = _PyType_Lookup(tp, getattr_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003147 if (getattr == NULL) {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003148 /* No __getattr__ hook: use a simpler dispatcher */
3149 tp->tp_getattro = slot_tp_getattro;
3150 return slot_tp_getattro(self, name);
3151 }
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003152 getattribute = _PyType_Lookup(tp, getattribute_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003153 if (getattribute == NULL ||
3154 (getattribute->ob_type == &PyWrapperDescr_Type &&
3155 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
3156 (void *)PyObject_GenericGetAttr))
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003157 res = PyObject_GenericGetAttr(self, name);
3158 else
3159 res = PyObject_CallFunction(getattribute, "OO", self, name);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003160 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003161 PyErr_Clear();
3162 res = PyObject_CallFunction(getattr, "OO", self, name);
3163 }
3164 return res;
3165}
3166
Tim Peters6d6c1a32001-08-02 04:15:00 +00003167static int
3168slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
3169{
3170 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003171 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003172
3173 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00003174 res = call_method(self, "__delattr__", &delattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003175 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003176 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003177 res = call_method(self, "__setattr__", &setattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003178 "(OO)", name, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003179 if (res == NULL)
3180 return -1;
3181 Py_DECREF(res);
3182 return 0;
3183}
3184
3185/* Map rich comparison operators to their __xx__ namesakes */
3186static char *name_op[] = {
3187 "__lt__",
3188 "__le__",
3189 "__eq__",
3190 "__ne__",
3191 "__gt__",
3192 "__ge__",
3193};
3194
3195static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00003196half_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003197{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003198 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003199 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00003200
Guido van Rossum60718732001-08-28 17:47:51 +00003201 func = lookup_method(self, name_op[op], &op_str[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003202 if (func == NULL) {
3203 PyErr_Clear();
3204 Py_INCREF(Py_NotImplemented);
3205 return Py_NotImplemented;
3206 }
3207 args = Py_BuildValue("(O)", other);
3208 if (args == NULL)
3209 res = NULL;
3210 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00003211 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003212 Py_DECREF(args);
3213 }
3214 Py_DECREF(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003215 return res;
3216}
3217
Guido van Rossumb8f63662001-08-15 23:57:02 +00003218/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
3219static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
3220
3221static PyObject *
3222slot_tp_richcompare(PyObject *self, PyObject *other, int op)
3223{
3224 PyObject *res;
3225
3226 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
3227 res = half_richcompare(self, other, op);
3228 if (res != Py_NotImplemented)
3229 return res;
3230 Py_DECREF(res);
3231 }
3232 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
3233 res = half_richcompare(other, self, swapped_op[op]);
3234 if (res != Py_NotImplemented) {
3235 return res;
3236 }
3237 Py_DECREF(res);
3238 }
3239 Py_INCREF(Py_NotImplemented);
3240 return Py_NotImplemented;
3241}
3242
3243static PyObject *
3244slot_tp_iter(PyObject *self)
3245{
3246 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003247 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003248
Guido van Rossum60718732001-08-28 17:47:51 +00003249 func = lookup_method(self, "__iter__", &iter_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003250 if (func != NULL) {
3251 res = PyObject_CallObject(func, NULL);
3252 Py_DECREF(func);
3253 return res;
3254 }
3255 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003256 func = lookup_method(self, "__getitem__", &getitem_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003257 if (func == NULL) {
Tim Peters8b13b3e2001-09-30 05:58:42 +00003258 PyErr_SetString(PyExc_TypeError, "iteration over non-sequence");
Guido van Rossumb8f63662001-08-15 23:57:02 +00003259 return NULL;
3260 }
3261 Py_DECREF(func);
3262 return PySeqIter_New(self);
3263}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003264
3265static PyObject *
3266slot_tp_iternext(PyObject *self)
3267{
Guido van Rossum2730b132001-08-28 18:22:14 +00003268 static PyObject *next_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00003269 return call_method(self, "next", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003270}
3271
Guido van Rossum1a493502001-08-17 16:47:50 +00003272static PyObject *
3273slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
3274{
3275 PyTypeObject *tp = self->ob_type;
3276 PyObject *get;
3277 static PyObject *get_str = NULL;
3278
3279 if (get_str == NULL) {
3280 get_str = PyString_InternFromString("__get__");
3281 if (get_str == NULL)
3282 return NULL;
3283 }
3284 get = _PyType_Lookup(tp, get_str);
3285 if (get == NULL) {
3286 /* Avoid further slowdowns */
3287 if (tp->tp_descr_get == slot_tp_descr_get)
3288 tp->tp_descr_get = NULL;
3289 Py_INCREF(self);
3290 return self;
3291 }
Guido van Rossum2c252392001-08-24 10:13:31 +00003292 if (obj == NULL)
3293 obj = Py_None;
3294 if (type == NULL)
3295 type = Py_None;
Guido van Rossum1a493502001-08-17 16:47:50 +00003296 return PyObject_CallFunction(get, "OOO", self, obj, type);
3297}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003298
3299static int
3300slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
3301{
Guido van Rossum2c252392001-08-24 10:13:31 +00003302 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003303 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00003304
3305 if (value == NULL)
Guido van Rossum1d5b3f22001-12-03 00:08:33 +00003306 res = call_method(self, "__delete__", &del_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003307 "(O)", target);
Guido van Rossum2c252392001-08-24 10:13:31 +00003308 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003309 res = call_method(self, "__set__", &set_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003310 "(OO)", target, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003311 if (res == NULL)
3312 return -1;
3313 Py_DECREF(res);
3314 return 0;
3315}
3316
3317static int
3318slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
3319{
Guido van Rossum60718732001-08-28 17:47:51 +00003320 static PyObject *init_str;
3321 PyObject *meth = lookup_method(self, "__init__", &init_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003322 PyObject *res;
3323
3324 if (meth == NULL)
3325 return -1;
3326 res = PyObject_Call(meth, args, kwds);
3327 Py_DECREF(meth);
3328 if (res == NULL)
3329 return -1;
3330 Py_DECREF(res);
3331 return 0;
3332}
3333
3334static PyObject *
3335slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3336{
3337 PyObject *func = PyObject_GetAttrString((PyObject *)type, "__new__");
3338 PyObject *newargs, *x;
3339 int i, n;
3340
3341 if (func == NULL)
3342 return NULL;
3343 assert(PyTuple_Check(args));
3344 n = PyTuple_GET_SIZE(args);
3345 newargs = PyTuple_New(n+1);
3346 if (newargs == NULL)
3347 return NULL;
3348 Py_INCREF(type);
3349 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
3350 for (i = 0; i < n; i++) {
3351 x = PyTuple_GET_ITEM(args, i);
3352 Py_INCREF(x);
3353 PyTuple_SET_ITEM(newargs, i+1, x);
3354 }
3355 x = PyObject_Call(func, newargs, kwds);
Guido van Rossum25d18072001-10-01 15:55:28 +00003356 Py_DECREF(newargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003357 Py_DECREF(func);
3358 return x;
3359}
3360
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003361
3362/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
3363 functions. The offsets here are relative to the 'etype' structure, which
3364 incorporates the additional structures used for numbers, sequences and
3365 mappings. Note that multiple names may map to the same slot (e.g. __eq__,
3366 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
3367 slots (e.g. __str__ affects tp_str as well as tp_repr). */
3368
Guido van Rossum6d204072001-10-21 00:44:31 +00003369typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003370
3371#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00003372#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003373#undef ETSLOT
3374#undef SQSLOT
3375#undef MPSLOT
3376#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00003377#undef UNSLOT
3378#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003379#undef BINSLOT
3380#undef RBINSLOT
3381
Guido van Rossum6d204072001-10-21 00:44:31 +00003382#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3383 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, DOC}
Guido van Rossumc8e56452001-10-22 00:43:43 +00003384#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
3385 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
3386 DOC, FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00003387#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3388 {NAME, offsetof(etype, SLOT), (void *)(FUNCTION), WRAPPER, DOC}
3389#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3390 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
3391#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3392 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
3393#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3394 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
3395#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3396 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
3397 "x." NAME "() <==> " DOC)
3398#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3399 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
3400 "x." NAME "(y) <==> x" DOC "y")
3401#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
3402 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
3403 "x." NAME "(y) <==> x" DOC "y")
3404#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
3405 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
3406 "x." NAME "(y) <==> y" DOC "x")
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003407
3408static slotdef slotdefs[] = {
Guido van Rossum6d204072001-10-21 00:44:31 +00003409 SQSLOT("__len__", sq_length, slot_sq_length, wrap_inquiry,
3410 "x.__len__() <==> len(x)"),
3411 SQSLOT("__add__", sq_concat, slot_sq_concat, wrap_binaryfunc,
3412 "x.__add__(y) <==> x+y"),
3413 SQSLOT("__mul__", sq_repeat, slot_sq_repeat, wrap_intargfunc,
3414 "x.__mul__(n) <==> x*n"),
3415 SQSLOT("__rmul__", sq_repeat, slot_sq_repeat, wrap_intargfunc,
3416 "x.__rmul__(n) <==> n*x"),
3417 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
3418 "x.__getitem__(y) <==> x[y]"),
3419 SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_intintargfunc,
3420 "x.__getslice__(i, j) <==> x[i:j]"),
3421 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
3422 "x.__setitem__(i, y) <==> x[i]=y"),
3423 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
3424 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003425 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
Guido van Rossum6d204072001-10-21 00:44:31 +00003426 wrap_intintobjargproc,
3427 "x.__setslice__(i, j, y) <==> x[i:j]=y"),
3428 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
3429 "x.__delslice__(i, j) <==> del x[i:j]"),
3430 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
3431 "x.__contains__(y) <==> y in x"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003432 SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat,
Guido van Rossum6d204072001-10-21 00:44:31 +00003433 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003434 SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat,
Guido van Rossum6d204072001-10-21 00:44:31 +00003435 wrap_intargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003436
Guido van Rossum6d204072001-10-21 00:44:31 +00003437 MPSLOT("__len__", mp_length, slot_mp_length, wrap_inquiry,
3438 "x.__len__() <==> len(x)"),
Guido van Rossumfd38f8e2001-10-09 20:17:57 +00003439 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003440 wrap_binaryfunc,
3441 "x.__getitem__(y) <==> x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003442 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003443 wrap_objobjargproc,
3444 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003445 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003446 wrap_delitem,
3447 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003448
Guido van Rossum6d204072001-10-21 00:44:31 +00003449 BINSLOT("__add__", nb_add, slot_nb_add,
3450 "+"),
3451 RBINSLOT("__radd__", nb_add, slot_nb_add,
3452 "+"),
3453 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
3454 "-"),
3455 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
3456 "-"),
3457 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
3458 "*"),
3459 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
3460 "*"),
3461 BINSLOT("__div__", nb_divide, slot_nb_divide,
3462 "/"),
3463 RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
3464 "/"),
3465 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
3466 "%"),
3467 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
3468 "%"),
3469 BINSLOT("__divmod__", nb_divmod, slot_nb_divmod,
3470 "divmod(x, y)"),
3471 RBINSLOT("__rdivmod__", nb_divmod, slot_nb_divmod,
3472 "divmod(y, x)"),
3473 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
3474 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
3475 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
3476 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
3477 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
3478 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
3479 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
3480 "abs(x)"),
3481 UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_unaryfunc,
3482 "x != 0"),
3483 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
3484 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
3485 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
3486 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
3487 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
3488 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
3489 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
3490 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
3491 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
3492 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
3493 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
3494 NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
3495 "x.__coerce__(y) <==> coerce(x, y)"),
3496 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
3497 "int(x)"),
3498 UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
3499 "long(x)"),
3500 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
3501 "float(x)"),
3502 UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
3503 "oct(x)"),
3504 UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
3505 "hex(x)"),
3506 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
3507 wrap_binaryfunc, "+"),
3508 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
3509 wrap_binaryfunc, "-"),
3510 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
3511 wrap_binaryfunc, "*"),
3512 IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
3513 wrap_binaryfunc, "/"),
3514 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
3515 wrap_binaryfunc, "%"),
3516 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
3517 wrap_ternaryfunc, "**"),
3518 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
3519 wrap_binaryfunc, "<<"),
3520 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
3521 wrap_binaryfunc, ">>"),
3522 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
3523 wrap_binaryfunc, "&"),
3524 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
3525 wrap_binaryfunc, "^"),
3526 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
3527 wrap_binaryfunc, "|"),
3528 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
3529 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
3530 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
3531 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
3532 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
3533 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
3534 IBSLOT("__itruediv__", nb_inplace_true_divide,
3535 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003536
Guido van Rossum6d204072001-10-21 00:44:31 +00003537 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
3538 "x.__str__() <==> str(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00003539 TPSLOT("__str__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00003540 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
3541 "x.__repr__() <==> repr(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00003542 TPSLOT("__repr__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00003543 TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
3544 "x.__cmp__(y) <==> cmp(x,y)"),
3545 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
3546 "x.__hash__() <==> hash(x)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00003547 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
3548 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003549 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
Guido van Rossum6d204072001-10-21 00:44:31 +00003550 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
3551 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
3552 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
3553 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
3554 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
3555 "x.__setattr__('name', value) <==> x.name = value"),
3556 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
3557 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
3558 "x.__delattr__('name') <==> del x.name"),
3559 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
3560 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
3561 "x.__lt__(y) <==> x<y"),
3562 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
3563 "x.__le__(y) <==> x<=y"),
3564 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
3565 "x.__eq__(y) <==> x==y"),
3566 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
3567 "x.__ne__(y) <==> x!=y"),
3568 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
3569 "x.__gt__(y) <==> x>y"),
3570 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
3571 "x.__ge__(y) <==> x>=y"),
3572 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
3573 "x.__iter__() <==> iter(x)"),
3574 TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
3575 "x.next() -> the next value, or raise StopIteration"),
3576 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
3577 "descr.__get__(obj[, type]) -> value"),
3578 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
3579 "descr.__set__(obj, value)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00003580 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
Guido van Rossum6d204072001-10-21 00:44:31 +00003581 "x.__init__(...) initializes x; "
Guido van Rossumc8e56452001-10-22 00:43:43 +00003582 "see x.__class__.__doc__ for signature",
3583 PyWrapperFlag_KEYWORDS),
3584 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003585 {NULL}
3586};
3587
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003588static void **
3589slotptr(PyTypeObject *type, int offset)
3590{
3591 char *ptr;
3592
3593 assert(offset >= 0);
3594 assert(offset < offsetof(etype, as_buffer));
3595 if (offset >= offsetof(etype, as_mapping)) {
3596 ptr = (void *)type->tp_as_mapping;
3597 offset -= offsetof(etype, as_mapping);
3598 }
3599 else if (offset >= offsetof(etype, as_sequence)) {
3600 ptr = (void *)type->tp_as_sequence;
3601 offset -= offsetof(etype, as_sequence);
3602 }
3603 else if (offset >= offsetof(etype, as_number)) {
3604 ptr = (void *)type->tp_as_number;
3605 offset -= offsetof(etype, as_number);
3606 }
3607 else {
3608 ptr = (void *)type;
3609 }
3610 if (ptr != NULL)
3611 ptr += offset;
3612 return (void **)ptr;
3613}
Guido van Rossumf040ede2001-08-07 16:40:56 +00003614
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003615staticforward int recurse_down_subclasses(PyTypeObject *type,
3616 slotdef **pp, PyObject *name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003617
3618static int
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003619update_these_slots(PyTypeObject *type, slotdef **pp0, PyObject *name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003620{
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003621 slotdef **pp;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003622
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003623 for (pp = pp0; *pp; pp++) {
3624 slotdef *p = *pp;
3625 PyObject *descr;
3626 PyWrapperDescrObject *d;
3627 void *generic = NULL, *specific = NULL;
3628 int use_generic = 0;
3629 int offset = p->offset;
3630 void **ptr = slotptr(type, offset);
3631 if (ptr == NULL)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003632 continue;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003633 do {
3634 descr = _PyType_Lookup(type, p->name_strobj);
3635 if (descr == NULL)
3636 continue;
3637 generic = p->function;
3638 if (descr->ob_type == &PyWrapperDescr_Type) {
3639 d = (PyWrapperDescrObject *)descr;
3640 if (d->d_base->wrapper == p->wrapper &&
3641 PyType_IsSubtype(type, d->d_type)) {
3642 if (specific == NULL ||
3643 specific == d->d_wrapped)
3644 specific = d->d_wrapped;
3645 else
3646 use_generic = 1;
3647 }
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003648 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003649 else
3650 use_generic = 1;
3651 } while ((++p)->offset == offset);
3652 if (specific && !use_generic)
3653 *ptr = specific;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003654 else
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003655 *ptr = generic;
3656 }
3657 return recurse_down_subclasses(type, pp0, name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003658}
3659
3660static int
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003661recurse_down_subclasses(PyTypeObject *type, slotdef **pp, PyObject *name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003662{
3663 PyTypeObject *subclass;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003664 PyObject *ref, *subclasses, *dict;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003665 int i, n;
3666
3667 subclasses = type->tp_subclasses;
3668 if (subclasses == NULL)
3669 return 0;
3670 assert(PyList_Check(subclasses));
3671 n = PyList_GET_SIZE(subclasses);
3672 for (i = 0; i < n; i++) {
3673 ref = PyList_GET_ITEM(subclasses, i);
3674 assert(PyWeakref_CheckRef(ref));
3675 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
3676 if (subclass == NULL)
3677 continue;
3678 assert(PyType_Check(subclass));
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003679 /* Avoid recursing down into unaffected classes */
3680 dict = subclass->tp_dict;
3681 if (dict != NULL && PyDict_Check(dict) &&
3682 PyDict_GetItem(dict, name) != NULL)
3683 continue;
3684 if (update_these_slots(subclass, pp, name) < 0)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003685 return -1;
3686 }
3687 return 0;
3688}
3689
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003690static int
3691slotdef_cmp(const void *aa, const void *bb)
3692{
3693 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
3694 int c = a->offset - b->offset;
3695 if (c != 0)
3696 return c;
3697 else
3698 return a - b;
3699}
3700
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003701static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003702init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003703{
3704 slotdef *p;
3705 static int initialized = 0;
3706
3707 if (initialized)
3708 return;
3709 for (p = slotdefs; p->name; p++) {
3710 p->name_strobj = PyString_InternFromString(p->name);
3711 if (!p->name_strobj)
3712 Py_FatalError("XXX ouch");
3713 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003714 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
3715 slotdef_cmp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003716 initialized = 1;
3717}
3718
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003719static int
3720update_slot(PyTypeObject *type, PyObject *name)
3721{
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003722 slotdef *ptrs[10];
3723 slotdef *p;
3724 slotdef **pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003725 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003726
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003727 init_slotdefs();
3728 pp = ptrs;
3729 for (p = slotdefs; p->name; p++) {
3730 /* XXX assume name is interned! */
3731 if (p->name_strobj == name)
3732 *pp++ = p;
3733 }
3734 *pp = NULL;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003735 for (pp = ptrs; *pp; pp++) {
3736 p = *pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003737 offset = p->offset;
3738 while (p > slotdefs && (p-1)->offset == offset)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003739 --p;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003740 *pp = p;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003741 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00003742 return update_these_slots(type, ptrs, name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00003743}
3744
Tim Peters6d6c1a32001-08-02 04:15:00 +00003745static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003746fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003747{
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003748 slotdef *p;
3749 PyObject *mro, *descr;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003750 PyWrapperDescrObject *d;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003751 int i, n, offset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003752 void **ptr;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003753 void *generic, *specific;
3754 int use_generic;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003755
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003756 init_slotdefs();
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003757 mro = type->tp_mro;
3758 assert(PyTuple_Check(mro));
3759 n = PyTuple_GET_SIZE(mro);
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003760 for (p = slotdefs; p->name; ) {
3761 offset = p->offset;
3762 ptr = slotptr(type, offset);
3763 if (!ptr) {
3764 do {
3765 ++p;
3766 } while (p->offset == offset);
3767 continue;
3768 }
3769 generic = specific = NULL;
3770 use_generic = 0;
3771 do {
3772 descr = NULL;
3773 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003774 PyObject *b = PyTuple_GET_ITEM(mro, i);
3775 PyObject *dict = NULL;
3776 if (PyType_Check(b))
3777 dict = ((PyTypeObject *)b)->tp_dict;
3778 else if (PyClass_Check(b))
3779 dict = ((PyClassObject *)b)->cl_dict;
3780 if (dict != NULL) {
3781 descr = PyDict_GetItem(
3782 dict, p->name_strobj);
3783 if (descr != NULL)
3784 break;
3785 }
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003786 }
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003787 if (descr == NULL)
3788 continue;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003789 generic = p->function;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003790 if (descr->ob_type == &PyWrapperDescr_Type) {
3791 d = (PyWrapperDescrObject *)descr;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003792 if (d->d_base->wrapper == p->wrapper &&
Guido van Rossumcaf59042001-10-17 07:15:43 +00003793 PyType_IsSubtype(type, d->d_type))
3794 {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003795 if (specific == NULL ||
Guido van Rossumcaf59042001-10-17 07:15:43 +00003796 specific == d->d_wrapped)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003797 specific = d->d_wrapped;
3798 else
3799 use_generic = 1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003800 }
3801 }
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003802 else
3803 use_generic = 1;
3804 } while ((++p)->offset == offset);
3805 if (specific && !use_generic)
3806 *ptr = specific;
3807 else
3808 *ptr = generic;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003809 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003810}
Guido van Rossum705f0f52001-08-24 16:47:00 +00003811
Guido van Rossum6d204072001-10-21 00:44:31 +00003812/* This function is called by PyType_Ready() to populate the type's
3813 dictionary with method descriptors for function slots. For each
3814 function slot (like tp_repr) that's defined in the type, one or
3815 more corresponding descriptors are added in the type's tp_dict
3816 dictionary under the appropriate name (like __repr__). Some
3817 function slots cause more than one descriptor to be added (for
3818 example, the nb_add slot adds both __add__ and __radd__
3819 descriptors) and some function slots compete for the same
3820 descriptor (for example both sq_item and mp_subscript generate a
3821 __getitem__ descriptor). This only adds new descriptors and
3822 doesn't overwrite entries in tp_dict that were previously
3823 defined. The descriptors contain a reference to the C function
3824 they must call, so that it's safe if they are copied into a
3825 subtype's __dict__ and the subtype has a different C function in
3826 its slot -- calling the method defined by the descriptor will call
3827 the C function that was used to create it, rather than the C
3828 function present in the slot when it is called. (This is important
3829 because a subtype may have a C function in the slot that calls the
3830 method from the dictionary, and we want to avoid infinite recursion
3831 here.) */
3832
3833static int
3834add_operators(PyTypeObject *type)
3835{
3836 PyObject *dict = type->tp_dict;
3837 slotdef *p;
3838 PyObject *descr;
3839 void **ptr;
3840
3841 init_slotdefs();
3842 for (p = slotdefs; p->name; p++) {
3843 if (p->wrapper == NULL)
3844 continue;
3845 ptr = slotptr(type, p->offset);
3846 if (!ptr || !*ptr)
3847 continue;
3848 if (PyDict_GetItem(dict, p->name_strobj))
3849 continue;
3850 descr = PyDescr_NewWrapper(type, p, *ptr);
3851 if (descr == NULL)
3852 return -1;
3853 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
3854 return -1;
3855 Py_DECREF(descr);
3856 }
3857 if (type->tp_new != NULL) {
3858 if (add_tp_new_wrapper(type) < 0)
3859 return -1;
3860 }
3861 return 0;
3862}
3863
Guido van Rossum705f0f52001-08-24 16:47:00 +00003864
3865/* Cooperative 'super' */
3866
3867typedef struct {
3868 PyObject_HEAD
Guido van Rossume705ef12001-08-29 15:47:06 +00003869 PyTypeObject *type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00003870 PyObject *obj;
3871} superobject;
3872
Guido van Rossum6f799372001-09-20 20:46:19 +00003873static PyMemberDef super_members[] = {
3874 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
3875 "the class invoking super()"},
3876 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
3877 "the instance invoking super(); may be None"},
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003878 {0}
3879};
3880
Guido van Rossum705f0f52001-08-24 16:47:00 +00003881static void
3882super_dealloc(PyObject *self)
3883{
3884 superobject *su = (superobject *)self;
3885
Guido van Rossum048eb752001-10-02 21:24:57 +00003886 _PyObject_GC_UNTRACK(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00003887 Py_XDECREF(su->obj);
3888 Py_XDECREF(su->type);
3889 self->ob_type->tp_free(self);
3890}
3891
3892static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003893super_repr(PyObject *self)
3894{
3895 superobject *su = (superobject *)self;
3896
3897 if (su->obj)
3898 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00003899 "<super: <class '%s'>, <%s object>>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003900 su->type ? su->type->tp_name : "NULL",
3901 su->obj->ob_type->tp_name);
3902 else
3903 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00003904 "<super: <class '%s'>, NULL>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003905 su->type ? su->type->tp_name : "NULL");
3906}
3907
3908static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00003909super_getattro(PyObject *self, PyObject *name)
3910{
3911 superobject *su = (superobject *)self;
3912
3913 if (su->obj != NULL) {
Tim Petersa91e9642001-11-14 23:32:33 +00003914 PyObject *mro, *res, *tmp, *dict;
Guido van Rossum705f0f52001-08-24 16:47:00 +00003915 descrgetfunc f;
3916 int i, n;
3917
Guido van Rossume705ef12001-08-29 15:47:06 +00003918 mro = su->obj->ob_type->tp_mro;
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003919 if (mro == NULL)
3920 n = 0;
3921 else {
3922 assert(PyTuple_Check(mro));
3923 n = PyTuple_GET_SIZE(mro);
3924 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00003925 for (i = 0; i < n; i++) {
Guido van Rossume705ef12001-08-29 15:47:06 +00003926 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
Guido van Rossum705f0f52001-08-24 16:47:00 +00003927 break;
3928 }
Guido van Rossume705ef12001-08-29 15:47:06 +00003929 if (i >= n && PyType_Check(su->obj)) {
3930 mro = ((PyTypeObject *)(su->obj))->tp_mro;
Guido van Rossum41eb14d2001-08-30 23:13:11 +00003931 if (mro == NULL)
3932 n = 0;
3933 else {
3934 assert(PyTuple_Check(mro));
3935 n = PyTuple_GET_SIZE(mro);
3936 }
Guido van Rossume705ef12001-08-29 15:47:06 +00003937 for (i = 0; i < n; i++) {
3938 if ((PyObject *)(su->type) ==
3939 PyTuple_GET_ITEM(mro, i))
3940 break;
3941 }
Guido van Rossume705ef12001-08-29 15:47:06 +00003942 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00003943 i++;
3944 res = NULL;
3945 for (; i < n; i++) {
3946 tmp = PyTuple_GET_ITEM(mro, i);
Tim Petersa91e9642001-11-14 23:32:33 +00003947 if (PyType_Check(tmp))
3948 dict = ((PyTypeObject *)tmp)->tp_dict;
3949 else if (PyClass_Check(tmp))
3950 dict = ((PyClassObject *)tmp)->cl_dict;
3951 else
3952 continue;
3953 res = PyDict_GetItem(dict, name);
Guido van Rossum5b443c62001-12-03 15:38:28 +00003954 if (res != NULL && !PyDescr_IsData(res)) {
Guido van Rossum705f0f52001-08-24 16:47:00 +00003955 Py_INCREF(res);
3956 f = res->ob_type->tp_descr_get;
3957 if (f != NULL) {
3958 tmp = f(res, su->obj, res);
3959 Py_DECREF(res);
3960 res = tmp;
3961 }
3962 return res;
3963 }
3964 }
3965 }
3966 return PyObject_GenericGetAttr(self, name);
3967}
3968
Guido van Rossum5b443c62001-12-03 15:38:28 +00003969static int
3970supercheck(PyTypeObject *type, PyObject *obj)
3971{
3972 if (!PyType_IsSubtype(obj->ob_type, type) &&
3973 !(PyType_Check(obj) &&
3974 PyType_IsSubtype((PyTypeObject *)obj, type))) {
3975 PyErr_SetString(PyExc_TypeError,
3976 "super(type, obj): "
3977 "obj must be an instance or subtype of type");
3978 return -1;
3979 }
3980 else
3981 return 0;
3982}
3983
Guido van Rossum705f0f52001-08-24 16:47:00 +00003984static PyObject *
3985super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
3986{
3987 superobject *su = (superobject *)self;
3988 superobject *new;
3989
3990 if (obj == NULL || obj == Py_None || su->obj != NULL) {
3991 /* Not binding to an object, or already bound */
3992 Py_INCREF(self);
3993 return self;
3994 }
Guido van Rossum5b443c62001-12-03 15:38:28 +00003995 if (su->ob_type != &PySuper_Type)
3996 /* If su is an instance of a subclass of super,
3997 call its type */
3998 return PyObject_CallFunction((PyObject *)su->ob_type,
3999 "OO", su->type, obj);
4000 else {
4001 /* Inline the common case */
4002 if (supercheck(su->type, obj) < 0)
4003 return NULL;
4004 new = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
4005 NULL, NULL);
4006 if (new == NULL)
4007 return NULL;
4008 Py_INCREF(su->type);
4009 Py_INCREF(obj);
4010 new->type = su->type;
4011 new->obj = obj;
4012 return (PyObject *)new;
4013 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00004014}
4015
4016static int
4017super_init(PyObject *self, PyObject *args, PyObject *kwds)
4018{
4019 superobject *su = (superobject *)self;
Guido van Rossume705ef12001-08-29 15:47:06 +00004020 PyTypeObject *type;
4021 PyObject *obj = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004022
4023 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
4024 return -1;
4025 if (obj == Py_None)
4026 obj = NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00004027 if (obj != NULL && supercheck(type, obj) < 0)
Guido van Rossum705f0f52001-08-24 16:47:00 +00004028 return -1;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004029 Py_INCREF(type);
4030 Py_XINCREF(obj);
4031 su->type = type;
4032 su->obj = obj;
4033 return 0;
4034}
4035
4036static char super_doc[] =
4037"super(type) -> unbound super object\n"
4038"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00004039"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00004040"Typical use to call a cooperative superclass method:\n"
4041"class C(B):\n"
4042" def meth(self, arg):\n"
4043" super(C, self).meth(arg)";
4044
Guido van Rossum048eb752001-10-02 21:24:57 +00004045static int
4046super_traverse(PyObject *self, visitproc visit, void *arg)
4047{
4048 superobject *su = (superobject *)self;
4049 int err;
4050
4051#define VISIT(SLOT) \
4052 if (SLOT) { \
4053 err = visit((PyObject *)(SLOT), arg); \
4054 if (err) \
4055 return err; \
4056 }
4057
4058 VISIT(su->obj);
4059 VISIT(su->type);
4060
4061#undef VISIT
4062
4063 return 0;
4064}
4065
Guido van Rossum705f0f52001-08-24 16:47:00 +00004066PyTypeObject PySuper_Type = {
4067 PyObject_HEAD_INIT(&PyType_Type)
4068 0, /* ob_size */
4069 "super", /* tp_name */
4070 sizeof(superobject), /* tp_basicsize */
4071 0, /* tp_itemsize */
4072 /* methods */
4073 super_dealloc, /* tp_dealloc */
4074 0, /* tp_print */
4075 0, /* tp_getattr */
4076 0, /* tp_setattr */
4077 0, /* tp_compare */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004078 super_repr, /* tp_repr */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004079 0, /* tp_as_number */
4080 0, /* tp_as_sequence */
4081 0, /* tp_as_mapping */
4082 0, /* tp_hash */
4083 0, /* tp_call */
4084 0, /* tp_str */
4085 super_getattro, /* tp_getattro */
4086 0, /* tp_setattro */
4087 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00004088 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
4089 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004090 super_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00004091 super_traverse, /* tp_traverse */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004092 0, /* tp_clear */
4093 0, /* tp_richcompare */
4094 0, /* tp_weaklistoffset */
4095 0, /* tp_iter */
4096 0, /* tp_iternext */
4097 0, /* tp_methods */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004098 super_members, /* tp_members */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004099 0, /* tp_getset */
4100 0, /* tp_base */
4101 0, /* tp_dict */
4102 super_descr_get, /* tp_descr_get */
4103 0, /* tp_descr_set */
4104 0, /* tp_dictoffset */
4105 super_init, /* tp_init */
4106 PyType_GenericAlloc, /* tp_alloc */
4107 PyType_GenericNew, /* tp_new */
Guido van Rossum048eb752001-10-02 21:24:57 +00004108 _PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004109};