blob: 6bd2b7a366c56f70c74f808cce4cd1cade634b03 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Type object implementation */
2
Guido van Rossumc0b618a1997-05-02 03:12:38 +00003#include "Python.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00004#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00005
Guido van Rossum9923ffe2002-06-04 19:52:53 +00006#include <ctype.h>
7
8/* The *real* layout of a type object when allocated on the heap */
9/* XXX Should we publish this in a header file? */
10typedef struct {
Guido van Rossum09638c12002-06-13 19:17:46 +000011 /* Note: there's a dependency on the order of these members
12 in slotptr() below. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +000013 PyTypeObject type;
14 PyNumberMethods as_number;
Guido van Rossum9923ffe2002-06-04 19:52:53 +000015 PyMappingMethods as_mapping;
Guido van Rossum09638c12002-06-13 19:17:46 +000016 PySequenceMethods as_sequence; /* as_sequence comes after as_mapping,
17 so that the mapping wins when both
18 the mapping and the sequence define
19 a given operator (e.g. __getitem__).
20 see add_operators() below. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +000021 PyBufferProcs as_buffer;
22 PyObject *name, *slots;
23 PyMemberDef members[1];
24} etype;
25
Guido van Rossum6f799372001-09-20 20:46:19 +000026static PyMemberDef type_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +000027 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
28 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
29 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
Guido van Rossum9676b222001-08-17 20:32:36 +000030 {"__weakrefoffset__", T_LONG,
Tim Peters6d6c1a32001-08-02 04:15:00 +000031 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
32 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
33 {"__dictoffset__", T_LONG,
34 offsetof(PyTypeObject, tp_dictoffset), READONLY},
35 {"__bases__", T_OBJECT, offsetof(PyTypeObject, tp_bases), READONLY},
36 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
37 {0}
38};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossumc0b618a1997-05-02 03:12:38 +000040static PyObject *
Guido van Rossumc3542212001-08-16 09:18:56 +000041type_name(PyTypeObject *type, void *context)
42{
43 char *s;
44
45 s = strrchr(type->tp_name, '.');
46 if (s == NULL)
47 s = type->tp_name;
48 else
49 s++;
50 return PyString_FromString(s);
51}
52
53static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000054type_module(PyTypeObject *type, void *context)
Guido van Rossum29ca26e1995-01-07 11:58:15 +000055{
Guido van Rossumc3542212001-08-16 09:18:56 +000056 PyObject *mod;
57 char *s;
58
59 s = strrchr(type->tp_name, '.');
60 if (s != NULL)
61 return PyString_FromStringAndSize(type->tp_name,
62 (int)(s - type->tp_name));
63 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
64 return PyString_FromString("__builtin__");
Guido van Rossum687ae002001-10-15 22:03:32 +000065 mod = PyDict_GetItemString(type->tp_dict, "__module__");
Guido van Rossumc3542212001-08-16 09:18:56 +000066 if (mod != NULL && PyString_Check(mod)) {
67 Py_INCREF(mod);
68 return mod;
69 }
70 PyErr_SetString(PyExc_AttributeError, "__module__");
71 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +000072}
73
Guido van Rossum3926a632001-09-25 16:25:58 +000074static int
75type_set_module(PyTypeObject *type, PyObject *value, void *context)
76{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +000077 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
Guido van Rossum3926a632001-09-25 16:25:58 +000078 strrchr(type->tp_name, '.')) {
79 PyErr_Format(PyExc_TypeError,
80 "can't set %s.__module__", type->tp_name);
81 return -1;
82 }
83 if (!value) {
84 PyErr_Format(PyExc_TypeError,
85 "can't delete %s.__module__", type->tp_name);
86 return -1;
87 }
88 return PyDict_SetItemString(type->tp_dict, "__module__", value);
89}
90
Tim Peters6d6c1a32001-08-02 04:15:00 +000091static PyObject *
92type_dict(PyTypeObject *type, void *context)
93{
94 if (type->tp_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 Py_INCREF(Py_None);
96 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +000097 }
Tim Peters6d6c1a32001-08-02 04:15:00 +000098 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +000099}
100
Tim Peters24008312002-03-17 18:56:20 +0000101static PyObject *
102type_get_doc(PyTypeObject *type, void *context)
103{
104 PyObject *result;
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000105 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
Tim Peters24008312002-03-17 18:56:20 +0000106 return PyString_FromString(type->tp_doc);
Tim Peters24008312002-03-17 18:56:20 +0000107 result = PyDict_GetItemString(type->tp_dict, "__doc__");
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000108 if (result == NULL) {
109 result = Py_None;
110 Py_INCREF(result);
111 }
112 else if (result->ob_type->tp_descr_get) {
Tim Peters2b858972002-04-18 04:12:28 +0000113 result = result->ob_type->tp_descr_get(result, NULL,
114 (PyObject *)type);
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000115 }
116 else {
117 Py_INCREF(result);
118 }
Tim Peters24008312002-03-17 18:56:20 +0000119 return result;
120}
121
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000122static PyGetSetDef type_getsets[] = {
Guido van Rossumc3542212001-08-16 09:18:56 +0000123 {"__name__", (getter)type_name, NULL, NULL},
Guido van Rossum3926a632001-09-25 16:25:58 +0000124 {"__module__", (getter)type_module, (setter)type_set_module, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000125 {"__dict__", (getter)type_dict, NULL, NULL},
Tim Peters24008312002-03-17 18:56:20 +0000126 {"__doc__", (getter)type_get_doc, NULL, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000127 {0}
128};
129
Martin v. Löwis0163d6d2001-06-09 07:34:05 +0000130static int
131type_compare(PyObject *v, PyObject *w)
132{
133 /* This is called with type objects only. So we
134 can just compare the addresses. */
135 Py_uintptr_t vv = (Py_uintptr_t)v;
136 Py_uintptr_t ww = (Py_uintptr_t)w;
137 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
138}
139
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000141type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000142{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000143 PyObject *mod, *name, *rtn;
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000144 char *kind;
Guido van Rossumc3542212001-08-16 09:18:56 +0000145
146 mod = type_module(type, NULL);
147 if (mod == NULL)
148 PyErr_Clear();
149 else if (!PyString_Check(mod)) {
150 Py_DECREF(mod);
151 mod = NULL;
152 }
153 name = type_name(type, NULL);
154 if (name == NULL)
155 return NULL;
Barry Warsaw7ce36942001-08-24 18:34:26 +0000156
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000157 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
158 kind = "class";
159 else
160 kind = "type";
161
Barry Warsaw7ce36942001-08-24 18:34:26 +0000162 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000163 rtn = PyString_FromFormat("<%s '%s.%s'>",
164 kind,
Barry Warsaw7ce36942001-08-24 18:34:26 +0000165 PyString_AS_STRING(mod),
166 PyString_AS_STRING(name));
167 }
Guido van Rossumc3542212001-08-16 09:18:56 +0000168 else
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000169 rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000170
Guido van Rossumc3542212001-08-16 09:18:56 +0000171 Py_XDECREF(mod);
172 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000173 return rtn;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000174}
175
Tim Peters6d6c1a32001-08-02 04:15:00 +0000176static PyObject *
177type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
178{
179 PyObject *obj;
180
181 if (type->tp_new == NULL) {
182 PyErr_Format(PyExc_TypeError,
183 "cannot create '%.100s' instances",
184 type->tp_name);
185 return NULL;
186 }
187
Tim Peters3f996e72001-09-13 19:18:27 +0000188 obj = type->tp_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000189 if (obj != NULL) {
Guido van Rossumf76de622001-10-18 15:49:21 +0000190 /* Ugly exception: when the call was type(something),
191 don't call tp_init on the result. */
192 if (type == &PyType_Type &&
193 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
194 (kwds == NULL ||
195 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
196 return obj;
Guido van Rossum8ace1ab2002-04-06 01:05:01 +0000197 /* If the returned object is not an instance of type,
198 it won't be initialized. */
199 if (!PyType_IsSubtype(obj->ob_type, type))
200 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000201 type = obj->ob_type;
Jeremy Hylton719841e2002-07-16 19:39:38 +0000202 if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) &&
203 type->tp_init != NULL &&
Tim Peters6d6c1a32001-08-02 04:15:00 +0000204 type->tp_init(obj, args, kwds) < 0) {
205 Py_DECREF(obj);
206 obj = NULL;
207 }
208 }
209 return obj;
210}
211
212PyObject *
213PyType_GenericAlloc(PyTypeObject *type, int nitems)
214{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000215 PyObject *obj;
Tim Petersf2a67da2001-10-07 03:54:51 +0000216 const size_t size = _PyObject_VAR_SIZE(type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000217
218 if (PyType_IS_GC(type))
Neil Schemenauer09a2ae52002-04-12 03:06:53 +0000219 obj = _PyObject_GC_Malloc(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000220 else
Neil Schemenauerc806c882001-08-29 23:54:54 +0000221 obj = PyObject_MALLOC(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000222
Neil Schemenauerc806c882001-08-29 23:54:54 +0000223 if (obj == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000224 return PyErr_NoMemory();
Tim Peters406fe3b2001-10-06 19:04:01 +0000225
Neil Schemenauerc806c882001-08-29 23:54:54 +0000226 memset(obj, '\0', size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000227
Tim Peters6d6c1a32001-08-02 04:15:00 +0000228 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
229 Py_INCREF(type);
Tim Peters406fe3b2001-10-06 19:04:01 +0000230
Tim Peters6d6c1a32001-08-02 04:15:00 +0000231 if (type->tp_itemsize == 0)
232 PyObject_INIT(obj, type);
233 else
234 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000235
Tim Peters6d6c1a32001-08-02 04:15:00 +0000236 if (PyType_IS_GC(type))
Neil Schemenauerc806c882001-08-29 23:54:54 +0000237 _PyObject_GC_TRACK(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000238 return obj;
239}
240
241PyObject *
242PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
243{
244 return type->tp_alloc(type, 0);
245}
246
Guido van Rossum9475a232001-10-05 20:51:39 +0000247/* Helpers for subtyping */
248
249static int
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000250traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
251{
252 int i, n;
253 PyMemberDef *mp;
254
255 n = type->ob_size;
256 mp = ((etype *)type)->members;
257 for (i = 0; i < n; i++, mp++) {
258 if (mp->type == T_OBJECT_EX) {
259 char *addr = (char *)self + mp->offset;
260 PyObject *obj = *(PyObject **)addr;
261 if (obj != NULL) {
262 int err = visit(obj, arg);
263 if (err)
264 return err;
265 }
266 }
267 }
268 return 0;
269}
270
271static int
Guido van Rossum9475a232001-10-05 20:51:39 +0000272subtype_traverse(PyObject *self, visitproc visit, void *arg)
273{
274 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000275 traverseproc basetraverse;
Guido van Rossum9475a232001-10-05 20:51:39 +0000276
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000277 /* Find the nearest base with a different tp_traverse,
278 and traverse slots while we're at it */
Guido van Rossum9475a232001-10-05 20:51:39 +0000279 type = self->ob_type;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000280 base = type;
281 while ((basetraverse = base->tp_traverse) == subtype_traverse) {
282 if (base->ob_size) {
283 int err = traverse_slots(base, self, visit, arg);
284 if (err)
285 return err;
286 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000287 base = base->tp_base;
288 assert(base);
289 }
290
291 if (type->tp_dictoffset != base->tp_dictoffset) {
292 PyObject **dictptr = _PyObject_GetDictPtr(self);
293 if (dictptr && *dictptr) {
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000294 int err = visit(*dictptr, arg);
Guido van Rossum9475a232001-10-05 20:51:39 +0000295 if (err)
296 return err;
297 }
298 }
299
Guido van Rossuma3862092002-06-10 15:24:42 +0000300 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
301 /* For a heaptype, the instances count as references
302 to the type. Traverse the type so the collector
303 can find cycles involving this link. */
304 int err = visit((PyObject *)type, arg);
305 if (err)
306 return err;
307 }
308
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000309 if (basetraverse)
310 return basetraverse(self, visit, arg);
311 return 0;
312}
313
314static void
315clear_slots(PyTypeObject *type, PyObject *self)
316{
317 int i, n;
318 PyMemberDef *mp;
319
320 n = type->ob_size;
321 mp = ((etype *)type)->members;
322 for (i = 0; i < n; i++, mp++) {
323 if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
324 char *addr = (char *)self + mp->offset;
325 PyObject *obj = *(PyObject **)addr;
326 if (obj != NULL) {
327 Py_DECREF(obj);
328 *(PyObject **)addr = NULL;
329 }
330 }
331 }
332}
333
334static int
335subtype_clear(PyObject *self)
336{
337 PyTypeObject *type, *base;
338 inquiry baseclear;
339
340 /* Find the nearest base with a different tp_clear
341 and clear slots while we're at it */
342 type = self->ob_type;
343 base = type;
344 while ((baseclear = base->tp_clear) == subtype_clear) {
345 if (base->ob_size)
346 clear_slots(base, self);
347 base = base->tp_base;
348 assert(base);
349 }
350
Guido van Rossuma3862092002-06-10 15:24:42 +0000351 /* There's no need to clear the instance dict (if any);
352 the collector will call its tp_clear handler. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000353
354 if (baseclear)
355 return baseclear(self);
Guido van Rossum9475a232001-10-05 20:51:39 +0000356 return 0;
357}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000358
Jeremy Hylton938ace62002-07-17 16:30:39 +0000359static PyObject *lookup_maybe(PyObject *, char *, PyObject **);
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000360
361static int
362call_finalizer(PyObject *self)
363{
364 static PyObject *del_str = NULL;
365 PyObject *del, *res;
366 PyObject *error_type, *error_value, *error_traceback;
367
368 /* Temporarily resurrect the object. */
Tim Peters34592512002-07-11 06:23:50 +0000369 assert(self->ob_refcnt == 0);
370 self->ob_refcnt = 1;
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000371
372 /* Save the current exception, if any. */
373 PyErr_Fetch(&error_type, &error_value, &error_traceback);
374
375 /* Execute __del__ method, if any. */
376 del = lookup_maybe(self, "__del__", &del_str);
377 if (del != NULL) {
378 res = PyEval_CallObject(del, NULL);
379 if (res == NULL)
380 PyErr_WriteUnraisable(del);
381 else
382 Py_DECREF(res);
383 Py_DECREF(del);
384 }
385
386 /* Restore the saved exception. */
387 PyErr_Restore(error_type, error_value, error_traceback);
388
389 /* Undo the temporary resurrection; can't use DECREF here, it would
390 * cause a recursive call.
391 */
Tim Peters34592512002-07-11 06:23:50 +0000392 assert(self->ob_refcnt > 0);
393 if (--self->ob_refcnt == 0)
394 return 0; /* this is the normal path out */
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000395
Tim Peters34592512002-07-11 06:23:50 +0000396 /* __del__ resurrected it! Make it look like the original Py_DECREF
397 * never happened.
398 */
399 {
400 int refcnt = self->ob_refcnt;
401 _Py_NewReference(self);
402 self->ob_refcnt = refcnt;
403 }
404 assert(_Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
405 /* If Py_REF_DEBUG, the original decref dropped _Py_RefTotal, but
406 * _Py_NewReference bumped it again, so that's a wash.
407 * If Py_TRACE_REFS, _Py_NewReference re-added self to the object
408 * chain, so no more to do there either.
409 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
410 * _Py_NewReference bumped tp_allocs: both of those need to be
411 * undone.
412 */
413#ifdef COUNT_ALLOCS
414 --self->ob_type->tp_frees;
415 --self->ob_type->tp_allocs;
416#endif
417 return -1; /* __del__ added a reference; don't delete now */
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000418}
419
Tim Peters6d6c1a32001-08-02 04:15:00 +0000420static void
421subtype_dealloc(PyObject *self)
422{
Guido van Rossum14227b42001-12-06 02:35:58 +0000423 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000424 destructor basedealloc;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000425
426 /* This exists so we can DECREF self->ob_type */
427
Guido van Rossum7ad2d1e2001-10-29 22:11:00 +0000428 if (call_finalizer(self) < 0)
429 return;
430
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000431 /* Find the nearest base with a different tp_dealloc
432 and clear slots while we're at it */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000433 type = self->ob_type;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000434 base = type;
435 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
436 if (base->ob_size)
437 clear_slots(base, self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000438 base = base->tp_base;
439 assert(base);
Guido van Rossum14227b42001-12-06 02:35:58 +0000440 }
441
Tim Peters6d6c1a32001-08-02 04:15:00 +0000442 /* If we added a dict, DECREF it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000443 if (type->tp_dictoffset && !base->tp_dictoffset) {
444 PyObject **dictptr = _PyObject_GetDictPtr(self);
445 if (dictptr != NULL) {
446 PyObject *dict = *dictptr;
447 if (dict != NULL) {
448 Py_DECREF(dict);
449 *dictptr = NULL;
450 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000451 }
452 }
453
Guido van Rossum9676b222001-08-17 20:32:36 +0000454 /* If we added weaklist, we clear it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000455 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
Guido van Rossum9676b222001-08-17 20:32:36 +0000456 PyObject_ClearWeakRefs(self);
457
Tim Peters6d6c1a32001-08-02 04:15:00 +0000458 /* Finalize GC if the base doesn't do GC and we do */
459 if (PyType_IS_GC(type) && !PyType_IS_GC(base))
Guido van Rossum048eb752001-10-02 21:24:57 +0000460 _PyObject_GC_UNTRACK(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461
462 /* Call the base tp_dealloc() */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000463 assert(basedealloc);
464 basedealloc(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000465
466 /* Can't reference self beyond this point */
467 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
468 Py_DECREF(type);
469 }
470}
471
Jeremy Hylton938ace62002-07-17 16:30:39 +0000472static PyTypeObject *solid_base(PyTypeObject *type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473
Tim Peters6d6c1a32001-08-02 04:15:00 +0000474/* type test with subclassing support */
475
476int
477PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
478{
479 PyObject *mro;
480
Guido van Rossum9478d072001-09-07 18:52:13 +0000481 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
482 return b == a || b == &PyBaseObject_Type;
483
Tim Peters6d6c1a32001-08-02 04:15:00 +0000484 mro = a->tp_mro;
485 if (mro != NULL) {
486 /* Deal with multiple inheritance without recursion
487 by walking the MRO tuple */
488 int i, n;
489 assert(PyTuple_Check(mro));
490 n = PyTuple_GET_SIZE(mro);
491 for (i = 0; i < n; i++) {
492 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
493 return 1;
494 }
495 return 0;
496 }
497 else {
498 /* a is not completely initilized yet; follow tp_base */
499 do {
500 if (a == b)
501 return 1;
502 a = a->tp_base;
503 } while (a != NULL);
504 return b == &PyBaseObject_Type;
505 }
506}
507
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000508/* Internal routines to do a method lookup in the type
Guido van Rossum60718732001-08-28 17:47:51 +0000509 without looking in the instance dictionary
510 (so we can't use PyObject_GetAttr) but still binding
511 it to the instance. The arguments are the object,
512 the method name as a C string, and the address of a
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000513 static variable used to cache the interned Python string.
514
515 Two variants:
516
517 - lookup_maybe() returns NULL without raising an exception
518 when the _PyType_Lookup() call fails;
519
520 - lookup_method() always raises an exception upon errors.
521*/
Guido van Rossum60718732001-08-28 17:47:51 +0000522
523static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000524lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
Guido van Rossum60718732001-08-28 17:47:51 +0000525{
526 PyObject *res;
527
528 if (*attrobj == NULL) {
529 *attrobj = PyString_InternFromString(attrstr);
530 if (*attrobj == NULL)
531 return NULL;
532 }
533 res = _PyType_Lookup(self->ob_type, *attrobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000534 if (res != NULL) {
Guido van Rossum60718732001-08-28 17:47:51 +0000535 descrgetfunc f;
536 if ((f = res->ob_type->tp_descr_get) == NULL)
537 Py_INCREF(res);
538 else
539 res = f(res, self, (PyObject *)(self->ob_type));
540 }
541 return res;
542}
543
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000544static PyObject *
545lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
546{
547 PyObject *res = lookup_maybe(self, attrstr, attrobj);
548 if (res == NULL && !PyErr_Occurred())
549 PyErr_SetObject(PyExc_AttributeError, *attrobj);
550 return res;
551}
552
Guido van Rossum2730b132001-08-28 18:22:14 +0000553/* A variation of PyObject_CallMethod that uses lookup_method()
554 instead of PyObject_GetAttrString(). This uses the same convention
555 as lookup_method to cache the interned name string object. */
556
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000557static PyObject *
Guido van Rossum2730b132001-08-28 18:22:14 +0000558call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
559{
560 va_list va;
561 PyObject *args, *func = 0, *retval;
Guido van Rossum2730b132001-08-28 18:22:14 +0000562 va_start(va, format);
563
Guido van Rossumda21c012001-10-03 00:50:18 +0000564 func = lookup_maybe(o, name, nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000565 if (func == NULL) {
566 va_end(va);
567 if (!PyErr_Occurred())
Guido van Rossumda21c012001-10-03 00:50:18 +0000568 PyErr_SetObject(PyExc_AttributeError, *nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000569 return NULL;
570 }
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000571
572 if (format && *format)
573 args = Py_VaBuildValue(format, va);
574 else
575 args = PyTuple_New(0);
576
577 va_end(va);
578
579 if (args == NULL)
580 return NULL;
581
582 assert(PyTuple_Check(args));
583 retval = PyObject_Call(func, args, NULL);
584
585 Py_DECREF(args);
586 Py_DECREF(func);
587
588 return retval;
589}
590
591/* Clone of call_method() that returns NotImplemented when the lookup fails. */
592
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000593static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000594call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
595{
596 va_list va;
597 PyObject *args, *func = 0, *retval;
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000598 va_start(va, format);
599
Guido van Rossumda21c012001-10-03 00:50:18 +0000600 func = lookup_maybe(o, name, nameobj);
Guido van Rossum2730b132001-08-28 18:22:14 +0000601 if (func == NULL) {
602 va_end(va);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000603 if (!PyErr_Occurred()) {
604 Py_INCREF(Py_NotImplemented);
605 return Py_NotImplemented;
606 }
Guido van Rossum717ce002001-09-14 16:58:08 +0000607 return NULL;
Guido van Rossum2730b132001-08-28 18:22:14 +0000608 }
609
610 if (format && *format)
611 args = Py_VaBuildValue(format, va);
612 else
613 args = PyTuple_New(0);
614
615 va_end(va);
616
Guido van Rossum717ce002001-09-14 16:58:08 +0000617 if (args == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +0000618 return NULL;
619
Guido van Rossum717ce002001-09-14 16:58:08 +0000620 assert(PyTuple_Check(args));
621 retval = PyObject_Call(func, args, NULL);
Guido van Rossum2730b132001-08-28 18:22:14 +0000622
623 Py_DECREF(args);
624 Py_DECREF(func);
625
626 return retval;
627}
628
Tim Peters6d6c1a32001-08-02 04:15:00 +0000629/* Method resolution order algorithm from "Putting Metaclasses to Work"
630 by Forman and Danforth (Addison-Wesley 1999). */
631
632static int
633conservative_merge(PyObject *left, PyObject *right)
634{
635 int left_size;
636 int right_size;
637 int i, j, r, ok;
638 PyObject *temp, *rr;
639
640 assert(PyList_Check(left));
641 assert(PyList_Check(right));
642
643 again:
644 left_size = PyList_GET_SIZE(left);
645 right_size = PyList_GET_SIZE(right);
646 for (i = 0; i < left_size; i++) {
647 for (j = 0; j < right_size; j++) {
648 if (PyList_GET_ITEM(left, i) ==
649 PyList_GET_ITEM(right, j)) {
650 /* found a merge point */
651 temp = PyList_New(0);
652 if (temp == NULL)
653 return -1;
654 for (r = 0; r < j; r++) {
655 rr = PyList_GET_ITEM(right, r);
656 ok = PySequence_Contains(left, rr);
657 if (ok < 0) {
658 Py_DECREF(temp);
659 return -1;
660 }
661 if (!ok) {
662 ok = PyList_Append(temp, rr);
663 if (ok < 0) {
664 Py_DECREF(temp);
665 return -1;
666 }
667 }
668 }
669 ok = PyList_SetSlice(left, i, i, temp);
670 Py_DECREF(temp);
671 if (ok < 0)
672 return -1;
673 ok = PyList_SetSlice(right, 0, j+1, NULL);
674 if (ok < 0)
675 return -1;
676 goto again;
677 }
678 }
679 }
680 return PyList_SetSlice(left, left_size, left_size, right);
681}
682
683static int
684serious_order_disagreements(PyObject *left, PyObject *right)
685{
686 return 0; /* XXX later -- for now, we cheat: "don't do that" */
687}
688
Tim Petersa91e9642001-11-14 23:32:33 +0000689static int
690fill_classic_mro(PyObject *mro, PyObject *cls)
691{
692 PyObject *bases, *base;
693 int i, n;
694
695 assert(PyList_Check(mro));
696 assert(PyClass_Check(cls));
697 i = PySequence_Contains(mro, cls);
698 if (i < 0)
699 return -1;
700 if (!i) {
701 if (PyList_Append(mro, cls) < 0)
702 return -1;
703 }
704 bases = ((PyClassObject *)cls)->cl_bases;
705 assert(bases && PyTuple_Check(bases));
706 n = PyTuple_GET_SIZE(bases);
707 for (i = 0; i < n; i++) {
708 base = PyTuple_GET_ITEM(bases, i);
709 if (fill_classic_mro(mro, base) < 0)
710 return -1;
711 }
712 return 0;
713}
714
715static PyObject *
716classic_mro(PyObject *cls)
717{
718 PyObject *mro;
719
720 assert(PyClass_Check(cls));
721 mro = PyList_New(0);
722 if (mro != NULL) {
723 if (fill_classic_mro(mro, cls) == 0)
724 return mro;
725 Py_DECREF(mro);
726 }
727 return NULL;
728}
729
Tim Peters6d6c1a32001-08-02 04:15:00 +0000730static PyObject *
731mro_implementation(PyTypeObject *type)
732{
733 int i, n, ok;
734 PyObject *bases, *result;
735
Guido van Rossum63517572002-06-18 16:44:57 +0000736 if(type->tp_dict == NULL) {
737 if(PyType_Ready(type) < 0)
738 return NULL;
739 }
740
Tim Peters6d6c1a32001-08-02 04:15:00 +0000741 bases = type->tp_bases;
742 n = PyTuple_GET_SIZE(bases);
743 result = Py_BuildValue("[O]", (PyObject *)type);
744 if (result == NULL)
745 return NULL;
746 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +0000747 PyObject *base = PyTuple_GET_ITEM(bases, i);
748 PyObject *parentMRO;
749 if (PyType_Check(base))
750 parentMRO = PySequence_List(
751 ((PyTypeObject*)base)->tp_mro);
752 else
753 parentMRO = classic_mro(base);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000754 if (parentMRO == NULL) {
755 Py_DECREF(result);
756 return NULL;
757 }
758 if (serious_order_disagreements(result, parentMRO)) {
759 Py_DECREF(result);
760 return NULL;
761 }
762 ok = conservative_merge(result, parentMRO);
763 Py_DECREF(parentMRO);
764 if (ok < 0) {
765 Py_DECREF(result);
766 return NULL;
767 }
768 }
769 return result;
770}
771
772static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000773mro_external(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000774{
775 PyTypeObject *type = (PyTypeObject *)self;
776
Tim Peters6d6c1a32001-08-02 04:15:00 +0000777 return mro_implementation(type);
778}
779
780static int
781mro_internal(PyTypeObject *type)
782{
783 PyObject *mro, *result, *tuple;
784
785 if (type->ob_type == &PyType_Type) {
786 result = mro_implementation(type);
787 }
788 else {
Guido van Rossum60718732001-08-28 17:47:51 +0000789 static PyObject *mro_str;
790 mro = lookup_method((PyObject *)type, "mro", &mro_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000791 if (mro == NULL)
792 return -1;
793 result = PyObject_CallObject(mro, NULL);
794 Py_DECREF(mro);
795 }
796 if (result == NULL)
797 return -1;
798 tuple = PySequence_Tuple(result);
799 Py_DECREF(result);
800 type->tp_mro = tuple;
801 return 0;
802}
803
804
805/* Calculate the best base amongst multiple base classes.
806 This is the first one that's on the path to the "solid base". */
807
808static PyTypeObject *
809best_base(PyObject *bases)
810{
811 int i, n;
812 PyTypeObject *base, *winner, *candidate, *base_i;
Tim Petersa91e9642001-11-14 23:32:33 +0000813 PyObject *base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814
815 assert(PyTuple_Check(bases));
816 n = PyTuple_GET_SIZE(bases);
817 assert(n > 0);
Tim Petersa91e9642001-11-14 23:32:33 +0000818 base = NULL;
819 winner = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000820 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +0000821 base_proto = PyTuple_GET_ITEM(bases, i);
822 if (PyClass_Check(base_proto))
823 continue;
824 if (!PyType_Check(base_proto)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 PyErr_SetString(
826 PyExc_TypeError,
827 "bases must be types");
828 return NULL;
829 }
Tim Petersa91e9642001-11-14 23:32:33 +0000830 base_i = (PyTypeObject *)base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831 if (base_i->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +0000832 if (PyType_Ready(base_i) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000833 return NULL;
834 }
835 candidate = solid_base(base_i);
Tim Petersa91e9642001-11-14 23:32:33 +0000836 if (winner == NULL) {
837 winner = candidate;
838 base = base_i;
839 }
840 else if (PyType_IsSubtype(winner, candidate))
Tim Peters6d6c1a32001-08-02 04:15:00 +0000841 ;
842 else if (PyType_IsSubtype(candidate, winner)) {
843 winner = candidate;
844 base = base_i;
845 }
846 else {
847 PyErr_SetString(
848 PyExc_TypeError,
849 "multiple bases have "
850 "instance lay-out conflict");
851 return NULL;
852 }
853 }
Guido van Rossume54616c2001-12-14 04:19:56 +0000854 if (base == NULL)
855 PyErr_SetString(PyExc_TypeError,
856 "a new-style class can't have only classic bases");
Tim Peters6d6c1a32001-08-02 04:15:00 +0000857 return base;
858}
859
860static int
861extra_ivars(PyTypeObject *type, PyTypeObject *base)
862{
Neil Schemenauerc806c882001-08-29 23:54:54 +0000863 size_t t_size = type->tp_basicsize;
864 size_t b_size = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000865
Guido van Rossum9676b222001-08-17 20:32:36 +0000866 assert(t_size >= b_size); /* Else type smaller than base! */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000867 if (type->tp_itemsize || base->tp_itemsize) {
868 /* If itemsize is involved, stricter rules */
869 return t_size != b_size ||
870 type->tp_itemsize != base->tp_itemsize;
871 }
Guido van Rossum9676b222001-08-17 20:32:36 +0000872 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
873 type->tp_weaklistoffset + sizeof(PyObject *) == t_size)
874 t_size -= sizeof(PyObject *);
875 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
876 type->tp_dictoffset + sizeof(PyObject *) == t_size)
877 t_size -= sizeof(PyObject *);
878
879 return t_size != b_size;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000880}
881
882static PyTypeObject *
883solid_base(PyTypeObject *type)
884{
885 PyTypeObject *base;
886
887 if (type->tp_base)
888 base = solid_base(type->tp_base);
889 else
890 base = &PyBaseObject_Type;
891 if (extra_ivars(type, base))
892 return type;
893 else
894 return base;
895}
896
Jeremy Hylton938ace62002-07-17 16:30:39 +0000897static void object_dealloc(PyObject *);
898static int object_init(PyObject *, PyObject *, PyObject *);
899static int update_slot(PyTypeObject *, PyObject *);
900static void fixup_slot_dispatchers(PyTypeObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000901
902static PyObject *
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000903subtype_dict(PyObject *obj, void *context)
904{
905 PyObject **dictptr = _PyObject_GetDictPtr(obj);
906 PyObject *dict;
907
908 if (dictptr == NULL) {
909 PyErr_SetString(PyExc_AttributeError,
910 "This object has no __dict__");
911 return NULL;
912 }
913 dict = *dictptr;
Guido van Rossum3926a632001-09-25 16:25:58 +0000914 if (dict == NULL)
915 *dictptr = dict = PyDict_New();
916 Py_XINCREF(dict);
917 return dict;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000918}
919
Guido van Rossum6661be32001-10-26 04:26:12 +0000920static int
921subtype_setdict(PyObject *obj, PyObject *value, void *context)
922{
923 PyObject **dictptr = _PyObject_GetDictPtr(obj);
924 PyObject *dict;
925
926 if (dictptr == NULL) {
927 PyErr_SetString(PyExc_AttributeError,
928 "This object has no __dict__");
929 return -1;
930 }
Guido van Rossumd331cb52001-12-05 19:46:42 +0000931 if (value != NULL && !PyDict_Check(value)) {
Guido van Rossum6661be32001-10-26 04:26:12 +0000932 PyErr_SetString(PyExc_TypeError,
933 "__dict__ must be set to a dictionary");
934 return -1;
935 }
936 dict = *dictptr;
Guido van Rossumd331cb52001-12-05 19:46:42 +0000937 Py_XINCREF(value);
Guido van Rossum6661be32001-10-26 04:26:12 +0000938 *dictptr = value;
939 Py_XDECREF(dict);
940 return 0;
941}
942
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000943static PyGetSetDef subtype_getsets[] = {
Guido van Rossum6661be32001-10-26 04:26:12 +0000944 {"__dict__", subtype_dict, subtype_setdict, NULL},
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000945 {0},
946};
947
Guido van Rossum0628dcf2002-03-14 23:03:14 +0000948/* bozo: __getstate__ that raises TypeError */
949
950static PyObject *
951bozo_func(PyObject *self, PyObject *args)
952{
953 PyErr_SetString(PyExc_TypeError,
954 "a class that defines __slots__ without "
955 "defining __getstate__ cannot be pickled");
956 return NULL;
957}
958
Neal Norwitz93c1e232002-03-31 16:06:11 +0000959static PyMethodDef bozo_ml = {"__getstate__", bozo_func, METH_VARARGS};
Guido van Rossum0628dcf2002-03-14 23:03:14 +0000960
961static PyObject *bozo_obj = NULL;
962
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000963static int
964valid_identifier(PyObject *s)
965{
Guido van Rossum03013a02002-07-16 14:30:28 +0000966 unsigned char *p;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000967 int i, n;
968
969 if (!PyString_Check(s)) {
970 PyErr_SetString(PyExc_TypeError,
971 "__slots__ must be strings");
972 return 0;
973 }
Guido van Rossum03013a02002-07-16 14:30:28 +0000974 p = (unsigned char *) PyString_AS_STRING(s);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000975 n = PyString_GET_SIZE(s);
976 /* We must reject an empty name. As a hack, we bump the
977 length to 1 so that the loop will balk on the trailing \0. */
978 if (n == 0)
979 n = 1;
980 for (i = 0; i < n; i++, p++) {
981 if (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_') {
982 PyErr_SetString(PyExc_TypeError,
983 "__slots__ must be identifiers");
984 return 0;
985 }
986 }
987 return 1;
988}
989
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000990static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000991type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
992{
993 PyObject *name, *bases, *dict;
994 static char *kwlist[] = {"name", "bases", "dict", 0};
Raymond Hettinger0ae0c072002-06-20 22:23:15 +0000995 static char buffer[256];
996 PyObject *slots, *tmp, *newslots;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +0000997 PyTypeObject *type, *base, *tmptype, *winner;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000998 etype *et;
Guido van Rossum6f799372001-09-20 20:46:19 +0000999 PyMemberDef *mp;
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001000 int i, nbases, nslots, slotoffset, add_dict, add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001001
Tim Peters3abca122001-10-27 19:37:48 +00001002 assert(args != NULL && PyTuple_Check(args));
1003 assert(kwds == NULL || PyDict_Check(kwds));
1004
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001005 /* Special case: type(x) should return x->ob_type */
Tim Peters3abca122001-10-27 19:37:48 +00001006 {
1007 const int nargs = PyTuple_GET_SIZE(args);
1008 const int nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
1009
1010 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
1011 PyObject *x = PyTuple_GET_ITEM(args, 0);
1012 Py_INCREF(x->ob_type);
1013 return (PyObject *) x->ob_type;
1014 }
1015
1016 /* SF bug 475327 -- if that didn't trigger, we need 3
1017 arguments. but PyArg_ParseTupleAndKeywords below may give
1018 a msg saying type() needs exactly 3. */
1019 if (nargs + nkwds != 3) {
1020 PyErr_SetString(PyExc_TypeError,
1021 "type() takes 1 or 3 arguments");
1022 return NULL;
1023 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001024 }
1025
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001026 /* Check arguments: (name, bases, dict) */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001027 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
1028 &name,
1029 &PyTuple_Type, &bases,
1030 &PyDict_Type, &dict))
1031 return NULL;
1032
1033 /* Determine the proper metatype to deal with this,
1034 and check for metatype conflicts while we're at it.
1035 Note that if some other metatype wins to contract,
1036 it's possible that its instances are not types. */
1037 nbases = PyTuple_GET_SIZE(bases);
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001038 winner = metatype;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001039 for (i = 0; i < nbases; i++) {
1040 tmp = PyTuple_GET_ITEM(bases, i);
1041 tmptype = tmp->ob_type;
Tim Petersa91e9642001-11-14 23:32:33 +00001042 if (tmptype == &PyClass_Type)
1043 continue; /* Special case classic classes */
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001044 if (PyType_IsSubtype(winner, tmptype))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001045 continue;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001046 if (PyType_IsSubtype(tmptype, winner)) {
1047 winner = tmptype;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001048 continue;
1049 }
1050 PyErr_SetString(PyExc_TypeError,
1051 "metatype conflict among bases");
1052 return NULL;
1053 }
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001054 if (winner != metatype) {
1055 if (winner->tp_new != type_new) /* Pass it to the winner */
1056 return winner->tp_new(winner, args, kwds);
1057 metatype = winner;
1058 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001059
1060 /* Adjust for empty tuple bases */
1061 if (nbases == 0) {
1062 bases = Py_BuildValue("(O)", &PyBaseObject_Type);
1063 if (bases == NULL)
1064 return NULL;
1065 nbases = 1;
1066 }
1067 else
1068 Py_INCREF(bases);
1069
1070 /* XXX From here until type is allocated, "return NULL" leaks bases! */
1071
1072 /* Calculate best base, and check that all bases are type objects */
1073 base = best_base(bases);
1074 if (base == NULL)
1075 return NULL;
1076 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
1077 PyErr_Format(PyExc_TypeError,
1078 "type '%.100s' is not an acceptable base type",
1079 base->tp_name);
1080 return NULL;
1081 }
1082
Tim Peters6d6c1a32001-08-02 04:15:00 +00001083 /* Check for a __slots__ sequence variable in dict, and count it */
1084 slots = PyDict_GetItemString(dict, "__slots__");
1085 nslots = 0;
Guido van Rossum9676b222001-08-17 20:32:36 +00001086 add_dict = 0;
1087 add_weak = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001088 if (slots != NULL) {
1089 /* Make it into a tuple */
1090 if (PyString_Check(slots))
1091 slots = Py_BuildValue("(O)", slots);
1092 else
1093 slots = PySequence_Tuple(slots);
1094 if (slots == NULL)
1095 return NULL;
1096 nslots = PyTuple_GET_SIZE(slots);
Guido van Rossumc4141872001-08-30 04:43:35 +00001097 if (nslots > 0 && base->tp_itemsize != 0) {
1098 PyErr_Format(PyExc_TypeError,
1099 "nonempty __slots__ "
1100 "not supported for subtype of '%s'",
1101 base->tp_name);
1102 return NULL;
1103 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001104 for (i = 0; i < nslots; i++) {
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001105 if (!valid_identifier(PyTuple_GET_ITEM(slots, i))) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001106 Py_DECREF(slots);
1107 return NULL;
1108 }
1109 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001110
1111 newslots = PyTuple_New(nslots);
1112 if (newslots == NULL)
1113 return NULL;
1114 for (i = 0; i < nslots; i++) {
1115 tmp = PyTuple_GET_ITEM(slots, i);
1116 if (_Py_Mangle(PyString_AS_STRING(name),
1117 PyString_AS_STRING(tmp),
1118 buffer, sizeof(buffer)))
1119 {
1120 tmp = PyString_FromString(buffer);
1121 } else {
1122 Py_INCREF(tmp);
1123 }
1124 PyTuple_SET_ITEM(newslots, i, tmp);
1125 }
1126 Py_DECREF(slots);
1127 slots = newslots;
1128
Tim Peters6d6c1a32001-08-02 04:15:00 +00001129 }
Guido van Rossum0628dcf2002-03-14 23:03:14 +00001130 if (slots != NULL) {
1131 /* See if *this* class defines __getstate__ */
1132 PyObject *getstate = PyDict_GetItemString(dict,
1133 "__getstate__");
1134 if (getstate == NULL) {
1135 /* If not, provide a bozo that raises TypeError */
1136 if (bozo_obj == NULL) {
1137 bozo_obj = PyCFunction_New(&bozo_ml, NULL);
1138 if (bozo_obj == NULL) {
1139 /* XXX decref various things */
1140 return NULL;
1141 }
1142 }
1143 if (PyDict_SetItemString(dict,
1144 "__getstate__",
1145 bozo_obj) < 0) {
1146 /* XXX decref various things */
1147 return NULL;
1148 }
1149 }
1150 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001151 if (slots == NULL && base->tp_dictoffset == 0 &&
1152 (base->tp_setattro == PyObject_GenericSetAttr ||
Guido van Rossum9676b222001-08-17 20:32:36 +00001153 base->tp_setattro == NULL)) {
Guido van Rossum9676b222001-08-17 20:32:36 +00001154 add_dict++;
1155 }
Guido van Rossumc4141872001-08-30 04:43:35 +00001156 if (slots == NULL && base->tp_weaklistoffset == 0 &&
1157 base->tp_itemsize == 0) {
Guido van Rossum9676b222001-08-17 20:32:36 +00001158 nslots++;
1159 add_weak++;
1160 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001161
1162 /* XXX From here until type is safely allocated,
1163 "return NULL" may leak slots! */
1164
1165 /* Allocate the type object */
1166 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
1167 if (type == NULL)
1168 return NULL;
1169
1170 /* Keep name and slots alive in the extended type object */
1171 et = (etype *)type;
1172 Py_INCREF(name);
1173 et->name = name;
1174 et->slots = slots;
1175
Guido van Rossumdc91b992001-08-08 22:26:22 +00001176 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001177 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
1178 Py_TPFLAGS_BASETYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00001179 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
1180 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00001181
1182 /* It's a new-style number unless it specifically inherits any
1183 old-style numeric behavior */
1184 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
1185 (base->tp_as_number == NULL))
1186 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
1187
1188 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001189 type->tp_as_number = &et->as_number;
1190 type->tp_as_sequence = &et->as_sequence;
1191 type->tp_as_mapping = &et->as_mapping;
1192 type->tp_as_buffer = &et->as_buffer;
1193 type->tp_name = PyString_AS_STRING(name);
1194
1195 /* Set tp_base and tp_bases */
1196 type->tp_bases = bases;
1197 Py_INCREF(base);
1198 type->tp_base = base;
1199
Guido van Rossum687ae002001-10-15 22:03:32 +00001200 /* Initialize tp_dict from passed-in dict */
1201 type->tp_dict = dict = PyDict_Copy(dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001202 if (dict == NULL) {
1203 Py_DECREF(type);
1204 return NULL;
1205 }
1206
Guido van Rossumc3542212001-08-16 09:18:56 +00001207 /* Set __module__ in the dict */
1208 if (PyDict_GetItemString(dict, "__module__") == NULL) {
1209 tmp = PyEval_GetGlobals();
1210 if (tmp != NULL) {
1211 tmp = PyDict_GetItemString(tmp, "__name__");
1212 if (tmp != NULL) {
1213 if (PyDict_SetItemString(dict, "__module__",
1214 tmp) < 0)
1215 return NULL;
1216 }
1217 }
1218 }
1219
Tim Peters2f93e282001-10-04 05:27:00 +00001220 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
Tim Peters24008312002-03-17 18:56:20 +00001221 and is a string. The __doc__ accessor will first look for tp_doc;
1222 if that fails, it will still look into __dict__.
Tim Peters2f93e282001-10-04 05:27:00 +00001223 */
1224 {
1225 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
1226 if (doc != NULL && PyString_Check(doc)) {
1227 const size_t n = (size_t)PyString_GET_SIZE(doc);
Tim Peters59f809d2001-10-04 05:43:02 +00001228 type->tp_doc = (char *)PyObject_MALLOC(n+1);
Tim Peters2f93e282001-10-04 05:27:00 +00001229 if (type->tp_doc == NULL) {
1230 Py_DECREF(type);
1231 return NULL;
1232 }
1233 memcpy(type->tp_doc, PyString_AS_STRING(doc), n+1);
1234 }
1235 }
1236
Tim Peters6d6c1a32001-08-02 04:15:00 +00001237 /* Special-case __new__: if it's a plain function,
1238 make it a static function */
1239 tmp = PyDict_GetItemString(dict, "__new__");
1240 if (tmp != NULL && PyFunction_Check(tmp)) {
1241 tmp = PyStaticMethod_New(tmp);
1242 if (tmp == NULL) {
1243 Py_DECREF(type);
1244 return NULL;
1245 }
1246 PyDict_SetItemString(dict, "__new__", tmp);
1247 Py_DECREF(tmp);
1248 }
1249
1250 /* Add descriptors for custom slots from __slots__, or for __dict__ */
1251 mp = et->members;
Neil Schemenauerc806c882001-08-29 23:54:54 +00001252 slotoffset = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 if (slots != NULL) {
1254 for (i = 0; i < nslots; i++, mp++) {
1255 mp->name = PyString_AS_STRING(
1256 PyTuple_GET_ITEM(slots, i));
Guido van Rossum64b206c2001-12-04 17:13:22 +00001257 mp->type = T_OBJECT_EX;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001258 mp->offset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00001259 if (base->tp_weaklistoffset == 0 &&
Guido van Rossum64b206c2001-12-04 17:13:22 +00001260 strcmp(mp->name, "__weakref__") == 0) {
1261 mp->type = T_OBJECT;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001262 mp->flags = READONLY;
Guido van Rossum9676b222001-08-17 20:32:36 +00001263 type->tp_weaklistoffset = slotoffset;
Guido van Rossum64b206c2001-12-04 17:13:22 +00001264 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001265 slotoffset += sizeof(PyObject *);
1266 }
1267 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001268 else {
1269 if (add_dict) {
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001270 if (base->tp_itemsize)
Guido van Rossum048eb752001-10-02 21:24:57 +00001271 type->tp_dictoffset =
1272 -(long)sizeof(PyObject *);
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001273 else
1274 type->tp_dictoffset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00001275 slotoffset += sizeof(PyObject *);
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001276 type->tp_getset = subtype_getsets;
Guido van Rossum9676b222001-08-17 20:32:36 +00001277 }
1278 if (add_weak) {
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001279 assert(!base->tp_itemsize);
Guido van Rossum9676b222001-08-17 20:32:36 +00001280 type->tp_weaklistoffset = slotoffset;
1281 mp->name = "__weakref__";
1282 mp->type = T_OBJECT;
1283 mp->offset = slotoffset;
Tim Peters26f68f52001-09-18 00:23:33 +00001284 mp->flags = READONLY;
Guido van Rossum9676b222001-08-17 20:32:36 +00001285 mp++;
1286 slotoffset += sizeof(PyObject *);
1287 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001288 }
1289 type->tp_basicsize = slotoffset;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001290 type->tp_itemsize = base->tp_itemsize;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001291 type->tp_members = et->members;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001292
1293 /* Special case some slots */
1294 if (type->tp_dictoffset != 0 || nslots > 0) {
1295 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
1296 type->tp_getattro = PyObject_GenericGetAttr;
1297 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
1298 type->tp_setattro = PyObject_GenericSetAttr;
1299 }
1300 type->tp_dealloc = subtype_dealloc;
1301
Guido van Rossum9475a232001-10-05 20:51:39 +00001302 /* Enable GC unless there are really no instance variables possible */
1303 if (!(type->tp_basicsize == sizeof(PyObject) &&
1304 type->tp_itemsize == 0))
1305 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
1306
Tim Peters6d6c1a32001-08-02 04:15:00 +00001307 /* Always override allocation strategy to use regular heap */
1308 type->tp_alloc = PyType_GenericAlloc;
Guido van Rossum048eb752001-10-02 21:24:57 +00001309 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001310 type->tp_free = PyObject_GC_Del;
Guido van Rossum9475a232001-10-05 20:51:39 +00001311 type->tp_traverse = subtype_traverse;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001312 type->tp_clear = subtype_clear;
Guido van Rossum048eb752001-10-02 21:24:57 +00001313 }
1314 else
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001315 type->tp_free = PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001316
1317 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001318 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001319 Py_DECREF(type);
1320 return NULL;
1321 }
1322
Guido van Rossum7b9144b2001-10-09 19:39:46 +00001323 /* Put the proper slots in place */
1324 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00001325
Tim Peters6d6c1a32001-08-02 04:15:00 +00001326 return (PyObject *)type;
1327}
1328
1329/* Internal API to look for a name through the MRO.
1330 This returns a borrowed reference, and doesn't set an exception! */
1331PyObject *
1332_PyType_Lookup(PyTypeObject *type, PyObject *name)
1333{
1334 int i, n;
Tim Petersa91e9642001-11-14 23:32:33 +00001335 PyObject *mro, *res, *base, *dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001336
Guido van Rossum687ae002001-10-15 22:03:32 +00001337 /* Look in tp_dict of types in MRO */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001338 mro = type->tp_mro;
Guido van Rossum23094982002-06-10 14:30:43 +00001339
1340 /* If mro is NULL, the type is either not yet initialized
1341 by PyType_Ready(), or already cleared by type_clear().
1342 Either way the safest thing to do is to return NULL. */
1343 if (mro == NULL)
1344 return NULL;
1345
Tim Peters6d6c1a32001-08-02 04:15:00 +00001346 assert(PyTuple_Check(mro));
1347 n = PyTuple_GET_SIZE(mro);
1348 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001349 base = PyTuple_GET_ITEM(mro, i);
1350 if (PyClass_Check(base))
1351 dict = ((PyClassObject *)base)->cl_dict;
1352 else {
1353 assert(PyType_Check(base));
1354 dict = ((PyTypeObject *)base)->tp_dict;
1355 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001356 assert(dict && PyDict_Check(dict));
1357 res = PyDict_GetItem(dict, name);
1358 if (res != NULL)
1359 return res;
1360 }
1361 return NULL;
1362}
1363
1364/* This is similar to PyObject_GenericGetAttr(),
1365 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
1366static PyObject *
1367type_getattro(PyTypeObject *type, PyObject *name)
1368{
1369 PyTypeObject *metatype = type->ob_type;
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001370 PyObject *meta_attribute, *attribute;
1371 descrgetfunc meta_get;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001372
1373 /* Initialize this type (we'll assume the metatype is initialized) */
1374 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001375 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001376 return NULL;
1377 }
1378
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001379 /* No readable descriptor found yet */
1380 meta_get = NULL;
Tim Peters34592512002-07-11 06:23:50 +00001381
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001382 /* Look for the attribute in the metatype */
1383 meta_attribute = _PyType_Lookup(metatype, name);
1384
1385 if (meta_attribute != NULL) {
1386 meta_get = meta_attribute->ob_type->tp_descr_get;
Tim Peters34592512002-07-11 06:23:50 +00001387
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001388 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
1389 /* Data descriptors implement tp_descr_set to intercept
1390 * writes. Assume the attribute is not overridden in
1391 * type's tp_dict (and bases): call the descriptor now.
1392 */
1393 return meta_get(meta_attribute, (PyObject *)type,
1394 (PyObject *)metatype);
1395 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001396 }
1397
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001398 /* No data descriptor found on metatype. Look in tp_dict of this
1399 * type and its bases */
1400 attribute = _PyType_Lookup(type, name);
1401 if (attribute != NULL) {
1402 /* Implement descriptor functionality, if any */
1403 descrgetfunc local_get = attribute->ob_type->tp_descr_get;
1404 if (local_get != NULL) {
1405 /* NULL 2nd argument indicates the descriptor was
1406 * found on the target object itself (or a base) */
1407 return local_get(attribute, (PyObject *)NULL,
1408 (PyObject *)type);
1409 }
Tim Peters34592512002-07-11 06:23:50 +00001410
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001411 Py_INCREF(attribute);
1412 return attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001413 }
1414
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001415 /* No attribute found in local __dict__ (or bases): use the
1416 * descriptor from the metatype, if any */
1417 if (meta_get != NULL)
1418 return meta_get(meta_attribute, (PyObject *)type,
1419 (PyObject *)metatype);
1420
1421 /* If an ordinary attribute was found on the metatype, return it now */
1422 if (meta_attribute != NULL) {
1423 Py_INCREF(meta_attribute);
1424 return meta_attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001425 }
1426
1427 /* Give up */
1428 PyErr_Format(PyExc_AttributeError,
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00001429 "type object '%.50s' has no attribute '%.400s'",
1430 type->tp_name, PyString_AS_STRING(name));
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431 return NULL;
1432}
1433
1434static int
1435type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
1436{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001437 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
1438 PyErr_Format(
1439 PyExc_TypeError,
1440 "can't set attributes of built-in/extension type '%s'",
1441 type->tp_name);
1442 return -1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00001443 }
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00001444 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
1445 return -1;
1446 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001447}
1448
1449static void
1450type_dealloc(PyTypeObject *type)
1451{
1452 etype *et;
1453
1454 /* Assert this is a heap-allocated type object */
1455 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00001456 _PyObject_GC_UNTRACK(type);
Guido van Rossum1c450732001-10-08 15:18:27 +00001457 PyObject_ClearWeakRefs((PyObject *)type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001458 et = (etype *)type;
1459 Py_XDECREF(type->tp_base);
1460 Py_XDECREF(type->tp_dict);
1461 Py_XDECREF(type->tp_bases);
1462 Py_XDECREF(type->tp_mro);
Guido van Rossum687ae002001-10-15 22:03:32 +00001463 Py_XDECREF(type->tp_cache);
Guido van Rossum1c450732001-10-08 15:18:27 +00001464 Py_XDECREF(type->tp_subclasses);
Neal Norwitzcee5ca02002-07-30 00:42:06 +00001465 PyObject_Free(type->tp_doc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001466 Py_XDECREF(et->name);
1467 Py_XDECREF(et->slots);
1468 type->ob_type->tp_free((PyObject *)type);
1469}
1470
Guido van Rossum1c450732001-10-08 15:18:27 +00001471static PyObject *
1472type_subclasses(PyTypeObject *type, PyObject *args_ignored)
1473{
1474 PyObject *list, *raw, *ref;
1475 int i, n;
1476
1477 list = PyList_New(0);
1478 if (list == NULL)
1479 return NULL;
1480 raw = type->tp_subclasses;
1481 if (raw == NULL)
1482 return list;
1483 assert(PyList_Check(raw));
1484 n = PyList_GET_SIZE(raw);
1485 for (i = 0; i < n; i++) {
1486 ref = PyList_GET_ITEM(raw, i);
Tim Peters44383382001-10-08 16:49:26 +00001487 assert(PyWeakref_CheckRef(ref));
Guido van Rossum1c450732001-10-08 15:18:27 +00001488 ref = PyWeakref_GET_OBJECT(ref);
1489 if (ref != Py_None) {
1490 if (PyList_Append(list, ref) < 0) {
1491 Py_DECREF(list);
1492 return NULL;
1493 }
1494 }
1495 }
1496 return list;
1497}
1498
Tim Peters6d6c1a32001-08-02 04:15:00 +00001499static PyMethodDef type_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001500 {"mro", (PyCFunction)mro_external, METH_NOARGS,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001501 "mro() -> list\nreturn a type's method resolution order"},
Guido van Rossum1c450732001-10-08 15:18:27 +00001502 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
1503 "__subclasses__() -> list of immediate subclasses"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001504 {0}
1505};
1506
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001507PyDoc_STRVAR(type_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00001508"type(object) -> the object's type\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001509"type(name, bases, dict) -> a new type");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001510
Guido van Rossum048eb752001-10-02 21:24:57 +00001511static int
1512type_traverse(PyTypeObject *type, visitproc visit, void *arg)
1513{
Guido van Rossum048eb752001-10-02 21:24:57 +00001514 int err;
1515
Guido van Rossuma3862092002-06-10 15:24:42 +00001516 /* Because of type_is_gc(), the collector only calls this
1517 for heaptypes. */
1518 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00001519
1520#define VISIT(SLOT) \
1521 if (SLOT) { \
1522 err = visit((PyObject *)(SLOT), arg); \
1523 if (err) \
1524 return err; \
1525 }
1526
1527 VISIT(type->tp_dict);
Guido van Rossum687ae002001-10-15 22:03:32 +00001528 VISIT(type->tp_cache);
Guido van Rossum048eb752001-10-02 21:24:57 +00001529 VISIT(type->tp_mro);
1530 VISIT(type->tp_bases);
1531 VISIT(type->tp_base);
Guido van Rossuma3862092002-06-10 15:24:42 +00001532
1533 /* There's no need to visit type->tp_subclasses or
1534 ((etype *)type)->slots, because they can't be involved
1535 in cycles; tp_subclasses is a list of weak references,
1536 and slots is a tuple of strings. */
Guido van Rossum048eb752001-10-02 21:24:57 +00001537
1538#undef VISIT
1539
1540 return 0;
1541}
1542
1543static int
1544type_clear(PyTypeObject *type)
1545{
Guido van Rossum048eb752001-10-02 21:24:57 +00001546 PyObject *tmp;
1547
Guido van Rossuma3862092002-06-10 15:24:42 +00001548 /* Because of type_is_gc(), the collector only calls this
1549 for heaptypes. */
1550 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00001551
1552#define CLEAR(SLOT) \
1553 if (SLOT) { \
1554 tmp = (PyObject *)(SLOT); \
1555 SLOT = NULL; \
1556 Py_DECREF(tmp); \
1557 }
1558
Guido van Rossuma3862092002-06-10 15:24:42 +00001559 /* The only field we need to clear is tp_mro, which is part of a
1560 hard cycle (its first element is the class itself) that won't
1561 be broken otherwise (it's a tuple and tuples don't have a
1562 tp_clear handler). None of the other fields need to be
1563 cleared, and here's why:
Guido van Rossum048eb752001-10-02 21:24:57 +00001564
Guido van Rossuma3862092002-06-10 15:24:42 +00001565 tp_dict:
1566 It is a dict, so the collector will call its tp_clear.
1567
1568 tp_cache:
1569 Not used; if it were, it would be a dict.
1570
1571 tp_bases, tp_base:
1572 If these are involved in a cycle, there must be at least
1573 one other, mutable object in the cycle, e.g. a base
1574 class's dict; the cycle will be broken that way.
1575
1576 tp_subclasses:
1577 A list of weak references can't be part of a cycle; and
1578 lists have their own tp_clear.
1579
1580 slots (in etype):
1581 A tuple of strings can't be part of a cycle.
1582 */
1583
1584 CLEAR(type->tp_mro);
Tim Peters2f93e282001-10-04 05:27:00 +00001585
Guido van Rossum048eb752001-10-02 21:24:57 +00001586#undef CLEAR
1587
1588 return 0;
1589}
1590
1591static int
1592type_is_gc(PyTypeObject *type)
1593{
1594 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
1595}
1596
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001597PyTypeObject PyType_Type = {
1598 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001599 0, /* ob_size */
1600 "type", /* tp_name */
1601 sizeof(etype), /* tp_basicsize */
Guido van Rossum6f799372001-09-20 20:46:19 +00001602 sizeof(PyMemberDef), /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001603 (destructor)type_dealloc, /* tp_dealloc */
1604 0, /* tp_print */
1605 0, /* tp_getattr */
1606 0, /* tp_setattr */
1607 type_compare, /* tp_compare */
1608 (reprfunc)type_repr, /* tp_repr */
1609 0, /* tp_as_number */
1610 0, /* tp_as_sequence */
1611 0, /* tp_as_mapping */
1612 (hashfunc)_Py_HashPointer, /* tp_hash */
1613 (ternaryfunc)type_call, /* tp_call */
1614 0, /* tp_str */
1615 (getattrofunc)type_getattro, /* tp_getattro */
1616 (setattrofunc)type_setattro, /* tp_setattro */
1617 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00001618 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
1619 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001620 type_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00001621 (traverseproc)type_traverse, /* tp_traverse */
1622 (inquiry)type_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001623 0, /* tp_richcompare */
Guido van Rossum1c450732001-10-08 15:18:27 +00001624 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001625 0, /* tp_iter */
1626 0, /* tp_iternext */
1627 type_methods, /* tp_methods */
1628 type_members, /* tp_members */
1629 type_getsets, /* tp_getset */
1630 0, /* tp_base */
1631 0, /* tp_dict */
1632 0, /* tp_descr_get */
1633 0, /* tp_descr_set */
1634 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
1635 0, /* tp_init */
1636 0, /* tp_alloc */
1637 type_new, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001638 PyObject_GC_Del, /* tp_free */
Guido van Rossum048eb752001-10-02 21:24:57 +00001639 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001640};
Tim Peters6d6c1a32001-08-02 04:15:00 +00001641
1642
1643/* The base type of all types (eventually)... except itself. */
1644
1645static int
1646object_init(PyObject *self, PyObject *args, PyObject *kwds)
1647{
1648 return 0;
1649}
1650
1651static void
1652object_dealloc(PyObject *self)
1653{
1654 self->ob_type->tp_free(self);
1655}
1656
Guido van Rossum8e248182001-08-12 05:17:56 +00001657static PyObject *
1658object_repr(PyObject *self)
1659{
Guido van Rossum76e69632001-08-16 18:52:43 +00001660 PyTypeObject *type;
Barry Warsaw7ce36942001-08-24 18:34:26 +00001661 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00001662
Guido van Rossum76e69632001-08-16 18:52:43 +00001663 type = self->ob_type;
1664 mod = type_module(type, NULL);
1665 if (mod == NULL)
1666 PyErr_Clear();
1667 else if (!PyString_Check(mod)) {
1668 Py_DECREF(mod);
1669 mod = NULL;
1670 }
1671 name = type_name(type, NULL);
1672 if (name == NULL)
1673 return NULL;
1674 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001675 rtn = PyString_FromFormat("<%s.%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00001676 PyString_AS_STRING(mod),
1677 PyString_AS_STRING(name),
1678 self);
Guido van Rossum76e69632001-08-16 18:52:43 +00001679 else
Guido van Rossumff0e6d62001-09-24 16:03:59 +00001680 rtn = PyString_FromFormat("<%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00001681 type->tp_name, self);
Guido van Rossum76e69632001-08-16 18:52:43 +00001682 Py_XDECREF(mod);
1683 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +00001684 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00001685}
1686
Guido van Rossumb8f63662001-08-15 23:57:02 +00001687static PyObject *
1688object_str(PyObject *self)
1689{
1690 unaryfunc f;
1691
1692 f = self->ob_type->tp_repr;
1693 if (f == NULL)
1694 f = object_repr;
1695 return f(self);
1696}
1697
Guido van Rossum8e248182001-08-12 05:17:56 +00001698static long
1699object_hash(PyObject *self)
1700{
1701 return _Py_HashPointer(self);
1702}
Guido van Rossum8e248182001-08-12 05:17:56 +00001703
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001704static PyObject *
1705object_get_class(PyObject *self, void *closure)
1706{
1707 Py_INCREF(self->ob_type);
1708 return (PyObject *)(self->ob_type);
1709}
1710
1711static int
1712equiv_structs(PyTypeObject *a, PyTypeObject *b)
1713{
1714 return a == b ||
1715 (a != NULL &&
1716 b != NULL &&
1717 a->tp_basicsize == b->tp_basicsize &&
1718 a->tp_itemsize == b->tp_itemsize &&
1719 a->tp_dictoffset == b->tp_dictoffset &&
1720 a->tp_weaklistoffset == b->tp_weaklistoffset &&
1721 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
1722 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
1723}
1724
1725static int
1726same_slots_added(PyTypeObject *a, PyTypeObject *b)
1727{
1728 PyTypeObject *base = a->tp_base;
1729 int size;
1730
1731 if (base != b->tp_base)
1732 return 0;
1733 if (equiv_structs(a, base) && equiv_structs(b, base))
1734 return 1;
1735 size = base->tp_basicsize;
1736 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
1737 size += sizeof(PyObject *);
1738 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
1739 size += sizeof(PyObject *);
1740 return size == a->tp_basicsize && size == b->tp_basicsize;
1741}
1742
1743static int
1744object_set_class(PyObject *self, PyObject *value, void *closure)
1745{
1746 PyTypeObject *old = self->ob_type;
1747 PyTypeObject *new, *newbase, *oldbase;
1748
Guido van Rossumb6b89422002-04-15 01:03:30 +00001749 if (value == NULL) {
1750 PyErr_SetString(PyExc_TypeError,
1751 "can't delete __class__ attribute");
1752 return -1;
1753 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001754 if (!PyType_Check(value)) {
1755 PyErr_Format(PyExc_TypeError,
1756 "__class__ must be set to new-style class, not '%s' object",
1757 value->ob_type->tp_name);
1758 return -1;
1759 }
1760 new = (PyTypeObject *)value;
Guido van Rossum9ee4b942002-05-24 18:47:47 +00001761 if (new->tp_dealloc != old->tp_dealloc ||
1762 new->tp_free != old->tp_free)
1763 {
1764 PyErr_Format(PyExc_TypeError,
1765 "__class__ assignment: "
1766 "'%s' deallocator differs from '%s'",
1767 new->tp_name,
1768 old->tp_name);
1769 return -1;
1770 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001771 newbase = new;
1772 oldbase = old;
1773 while (equiv_structs(newbase, newbase->tp_base))
1774 newbase = newbase->tp_base;
1775 while (equiv_structs(oldbase, oldbase->tp_base))
1776 oldbase = oldbase->tp_base;
1777 if (newbase != oldbase &&
1778 (newbase->tp_base != oldbase->tp_base ||
1779 !same_slots_added(newbase, oldbase))) {
1780 PyErr_Format(PyExc_TypeError,
1781 "__class__ assignment: "
1782 "'%s' object layout differs from '%s'",
Tim Peters2f93e282001-10-04 05:27:00 +00001783 new->tp_name,
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001784 old->tp_name);
1785 return -1;
1786 }
1787 if (new->tp_flags & Py_TPFLAGS_HEAPTYPE) {
1788 Py_INCREF(new);
1789 }
1790 self->ob_type = new;
1791 if (old->tp_flags & Py_TPFLAGS_HEAPTYPE) {
1792 Py_DECREF(old);
1793 }
1794 return 0;
1795}
1796
1797static PyGetSetDef object_getsets[] = {
1798 {"__class__", object_get_class, object_set_class,
1799 "the object's class"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00001800 {0}
1801};
1802
Guido van Rossum3926a632001-09-25 16:25:58 +00001803static PyObject *
1804object_reduce(PyObject *self, PyObject *args)
1805{
1806 /* Call copy_reg._reduce(self) */
1807 static PyObject *copy_reg_str;
1808 PyObject *copy_reg, *res;
1809
1810 if (!copy_reg_str) {
1811 copy_reg_str = PyString_InternFromString("copy_reg");
1812 if (copy_reg_str == NULL)
1813 return NULL;
1814 }
1815 copy_reg = PyImport_Import(copy_reg_str);
1816 if (!copy_reg)
1817 return NULL;
1818 res = PyEval_CallMethod(copy_reg, "_reduce", "(O)", self);
1819 Py_DECREF(copy_reg);
1820 return res;
1821}
1822
1823static PyMethodDef object_methods[] = {
1824 {"__reduce__", object_reduce, METH_NOARGS, "helper for pickle"},
1825 {0}
1826};
1827
Tim Peters6d6c1a32001-08-02 04:15:00 +00001828PyTypeObject PyBaseObject_Type = {
1829 PyObject_HEAD_INIT(&PyType_Type)
1830 0, /* ob_size */
1831 "object", /* tp_name */
1832 sizeof(PyObject), /* tp_basicsize */
1833 0, /* tp_itemsize */
1834 (destructor)object_dealloc, /* tp_dealloc */
1835 0, /* tp_print */
1836 0, /* tp_getattr */
1837 0, /* tp_setattr */
1838 0, /* tp_compare */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001839 object_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001840 0, /* tp_as_number */
1841 0, /* tp_as_sequence */
1842 0, /* tp_as_mapping */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001843 object_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001844 0, /* tp_call */
Guido van Rossumb8f63662001-08-15 23:57:02 +00001845 object_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001846 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +00001847 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001848 0, /* tp_as_buffer */
1849 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
1850 "The most base type", /* tp_doc */
1851 0, /* tp_traverse */
1852 0, /* tp_clear */
1853 0, /* tp_richcompare */
1854 0, /* tp_weaklistoffset */
1855 0, /* tp_iter */
1856 0, /* tp_iternext */
Guido van Rossum3926a632001-09-25 16:25:58 +00001857 object_methods, /* tp_methods */
Guido van Rossum5c294fb2001-09-25 03:43:42 +00001858 0, /* tp_members */
1859 object_getsets, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001860 0, /* tp_base */
1861 0, /* tp_dict */
1862 0, /* tp_descr_get */
1863 0, /* tp_descr_set */
1864 0, /* tp_dictoffset */
1865 object_init, /* tp_init */
1866 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossumc11e1922001-08-09 19:38:15 +00001867 PyType_GenericNew, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001868 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001869};
1870
1871
1872/* Initialize the __dict__ in a type object */
1873
Fred Drake7bf97152002-03-28 05:33:33 +00001874static PyObject *
1875create_specialmethod(PyMethodDef *meth, PyObject *(*func)(PyObject *))
1876{
1877 PyObject *cfunc;
1878 PyObject *result;
1879
1880 cfunc = PyCFunction_New(meth, NULL);
1881 if (cfunc == NULL)
1882 return NULL;
1883 result = func(cfunc);
1884 Py_DECREF(cfunc);
1885 return result;
1886}
1887
Tim Peters6d6c1a32001-08-02 04:15:00 +00001888static int
1889add_methods(PyTypeObject *type, PyMethodDef *meth)
1890{
Guido van Rossum687ae002001-10-15 22:03:32 +00001891 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001892
1893 for (; meth->ml_name != NULL; meth++) {
1894 PyObject *descr;
1895 if (PyDict_GetItemString(dict, meth->ml_name))
1896 continue;
Fred Drake7bf97152002-03-28 05:33:33 +00001897 if (meth->ml_flags & METH_CLASS) {
1898 if (meth->ml_flags & METH_STATIC) {
1899 PyErr_SetString(PyExc_ValueError,
1900 "method cannot be both class and static");
1901 return -1;
1902 }
1903 descr = create_specialmethod(meth, PyClassMethod_New);
1904 }
1905 else if (meth->ml_flags & METH_STATIC) {
1906 descr = create_specialmethod(meth, PyStaticMethod_New);
1907 }
1908 else {
1909 descr = PyDescr_NewMethod(type, meth);
1910 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911 if (descr == NULL)
1912 return -1;
Fred Drake7bf97152002-03-28 05:33:33 +00001913 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001914 return -1;
1915 Py_DECREF(descr);
1916 }
1917 return 0;
1918}
1919
1920static int
Guido van Rossum6f799372001-09-20 20:46:19 +00001921add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001922{
Guido van Rossum687ae002001-10-15 22:03:32 +00001923 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001924
1925 for (; memb->name != NULL; memb++) {
1926 PyObject *descr;
1927 if (PyDict_GetItemString(dict, memb->name))
1928 continue;
1929 descr = PyDescr_NewMember(type, memb);
1930 if (descr == NULL)
1931 return -1;
1932 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
1933 return -1;
1934 Py_DECREF(descr);
1935 }
1936 return 0;
1937}
1938
1939static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00001940add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001941{
Guido van Rossum687ae002001-10-15 22:03:32 +00001942 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001943
1944 for (; gsp->name != NULL; gsp++) {
1945 PyObject *descr;
1946 if (PyDict_GetItemString(dict, gsp->name))
1947 continue;
1948 descr = PyDescr_NewGetSet(type, gsp);
1949
1950 if (descr == NULL)
1951 return -1;
1952 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
1953 return -1;
1954 Py_DECREF(descr);
1955 }
1956 return 0;
1957}
1958
Guido van Rossum13d52f02001-08-10 21:24:08 +00001959static void
1960inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001961{
1962 int oldsize, newsize;
1963
Guido van Rossum13d52f02001-08-10 21:24:08 +00001964 /* Special flag magic */
1965 if (!type->tp_as_buffer && base->tp_as_buffer) {
1966 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
1967 type->tp_flags |=
1968 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
1969 }
1970 if (!type->tp_as_sequence && base->tp_as_sequence) {
1971 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
1972 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
1973 }
1974 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
1975 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
1976 if ((!type->tp_as_number && base->tp_as_number) ||
1977 (!type->tp_as_sequence && base->tp_as_sequence)) {
1978 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
1979 if (!type->tp_as_number && !type->tp_as_sequence) {
1980 type->tp_flags |= base->tp_flags &
1981 Py_TPFLAGS_HAVE_INPLACEOPS;
1982 }
1983 }
1984 /* Wow */
1985 }
1986 if (!type->tp_as_number && base->tp_as_number) {
1987 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
1988 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
1989 }
1990
1991 /* Copying basicsize is connected to the GC flags */
Neil Schemenauerc806c882001-08-29 23:54:54 +00001992 oldsize = base->tp_basicsize;
1993 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
1994 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
1995 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
Guido van Rossum13d52f02001-08-10 21:24:08 +00001996 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
1997 (!type->tp_traverse && !type->tp_clear)) {
Neil Schemenauerc806c882001-08-29 23:54:54 +00001998 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum13d52f02001-08-10 21:24:08 +00001999 if (type->tp_traverse == NULL)
2000 type->tp_traverse = base->tp_traverse;
2001 if (type->tp_clear == NULL)
2002 type->tp_clear = base->tp_clear;
2003 }
2004 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
Guido van Rossumf884b742001-12-17 17:14:22 +00002005 /* The condition below could use some explanation.
2006 It appears that tp_new is not inherited for static types
2007 whose base class is 'object'; this seems to be a precaution
2008 so that old extension types don't suddenly become
2009 callable (object.__new__ wouldn't insure the invariants
2010 that the extension type's own factory function ensures).
2011 Heap types, of course, are under our control, so they do
2012 inherit tp_new; static extension types that specify some
2013 other built-in type as the default are considered
2014 new-style-aware so they also inherit object.__new__. */
Guido van Rossum13d52f02001-08-10 21:24:08 +00002015 if (base != &PyBaseObject_Type ||
2016 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2017 if (type->tp_new == NULL)
2018 type->tp_new = base->tp_new;
2019 }
2020 }
Neil Schemenauerc806c882001-08-29 23:54:54 +00002021 type->tp_basicsize = newsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002022
2023 /* Copy other non-function slots */
2024
2025#undef COPYVAL
2026#define COPYVAL(SLOT) \
2027 if (type->SLOT == 0) type->SLOT = base->SLOT
2028
2029 COPYVAL(tp_itemsize);
2030 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
2031 COPYVAL(tp_weaklistoffset);
2032 }
2033 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
2034 COPYVAL(tp_dictoffset);
2035 }
Guido van Rossum13d52f02001-08-10 21:24:08 +00002036}
2037
2038static void
2039inherit_slots(PyTypeObject *type, PyTypeObject *base)
2040{
2041 PyTypeObject *basebase;
2042
2043#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00002044#undef COPYSLOT
2045#undef COPYNUM
2046#undef COPYSEQ
2047#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00002048#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00002049
2050#define SLOTDEFINED(SLOT) \
2051 (base->SLOT != 0 && \
2052 (basebase == NULL || base->SLOT != basebase->SLOT))
2053
Tim Peters6d6c1a32001-08-02 04:15:00 +00002054#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00002055 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00002056
2057#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
2058#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
2059#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00002060#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002061
Guido van Rossum13d52f02001-08-10 21:24:08 +00002062 /* This won't inherit indirect slots (from tp_as_number etc.)
2063 if type doesn't provide the space. */
2064
2065 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
2066 basebase = base->tp_base;
2067 if (basebase->tp_as_number == NULL)
2068 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002069 COPYNUM(nb_add);
2070 COPYNUM(nb_subtract);
2071 COPYNUM(nb_multiply);
2072 COPYNUM(nb_divide);
2073 COPYNUM(nb_remainder);
2074 COPYNUM(nb_divmod);
2075 COPYNUM(nb_power);
2076 COPYNUM(nb_negative);
2077 COPYNUM(nb_positive);
2078 COPYNUM(nb_absolute);
2079 COPYNUM(nb_nonzero);
2080 COPYNUM(nb_invert);
2081 COPYNUM(nb_lshift);
2082 COPYNUM(nb_rshift);
2083 COPYNUM(nb_and);
2084 COPYNUM(nb_xor);
2085 COPYNUM(nb_or);
2086 COPYNUM(nb_coerce);
2087 COPYNUM(nb_int);
2088 COPYNUM(nb_long);
2089 COPYNUM(nb_float);
2090 COPYNUM(nb_oct);
2091 COPYNUM(nb_hex);
2092 COPYNUM(nb_inplace_add);
2093 COPYNUM(nb_inplace_subtract);
2094 COPYNUM(nb_inplace_multiply);
2095 COPYNUM(nb_inplace_divide);
2096 COPYNUM(nb_inplace_remainder);
2097 COPYNUM(nb_inplace_power);
2098 COPYNUM(nb_inplace_lshift);
2099 COPYNUM(nb_inplace_rshift);
2100 COPYNUM(nb_inplace_and);
2101 COPYNUM(nb_inplace_xor);
2102 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00002103 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
2104 COPYNUM(nb_true_divide);
2105 COPYNUM(nb_floor_divide);
2106 COPYNUM(nb_inplace_true_divide);
2107 COPYNUM(nb_inplace_floor_divide);
2108 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002109 }
2110
Guido van Rossum13d52f02001-08-10 21:24:08 +00002111 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
2112 basebase = base->tp_base;
2113 if (basebase->tp_as_sequence == NULL)
2114 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002115 COPYSEQ(sq_length);
2116 COPYSEQ(sq_concat);
2117 COPYSEQ(sq_repeat);
2118 COPYSEQ(sq_item);
2119 COPYSEQ(sq_slice);
2120 COPYSEQ(sq_ass_item);
2121 COPYSEQ(sq_ass_slice);
2122 COPYSEQ(sq_contains);
2123 COPYSEQ(sq_inplace_concat);
2124 COPYSEQ(sq_inplace_repeat);
2125 }
2126
Guido van Rossum13d52f02001-08-10 21:24:08 +00002127 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
2128 basebase = base->tp_base;
2129 if (basebase->tp_as_mapping == NULL)
2130 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002131 COPYMAP(mp_length);
2132 COPYMAP(mp_subscript);
2133 COPYMAP(mp_ass_subscript);
2134 }
2135
Tim Petersfc57ccb2001-10-12 02:38:24 +00002136 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
2137 basebase = base->tp_base;
2138 if (basebase->tp_as_buffer == NULL)
2139 basebase = NULL;
2140 COPYBUF(bf_getreadbuffer);
2141 COPYBUF(bf_getwritebuffer);
2142 COPYBUF(bf_getsegcount);
2143 COPYBUF(bf_getcharbuffer);
2144 }
2145
Guido van Rossum13d52f02001-08-10 21:24:08 +00002146 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002147
Tim Peters6d6c1a32001-08-02 04:15:00 +00002148 COPYSLOT(tp_dealloc);
2149 COPYSLOT(tp_print);
2150 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
2151 type->tp_getattr = base->tp_getattr;
2152 type->tp_getattro = base->tp_getattro;
2153 }
2154 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
2155 type->tp_setattr = base->tp_setattr;
2156 type->tp_setattro = base->tp_setattro;
2157 }
2158 /* tp_compare see tp_richcompare */
2159 COPYSLOT(tp_repr);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002160 /* tp_hash see tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002161 COPYSLOT(tp_call);
2162 COPYSLOT(tp_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002163 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00002164 if (type->tp_compare == NULL &&
2165 type->tp_richcompare == NULL &&
2166 type->tp_hash == NULL)
2167 {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002168 type->tp_compare = base->tp_compare;
2169 type->tp_richcompare = base->tp_richcompare;
Guido van Rossumb8f63662001-08-15 23:57:02 +00002170 type->tp_hash = base->tp_hash;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002171 }
2172 }
2173 else {
2174 COPYSLOT(tp_compare);
2175 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002176 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
2177 COPYSLOT(tp_iter);
2178 COPYSLOT(tp_iternext);
2179 }
2180 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
2181 COPYSLOT(tp_descr_get);
2182 COPYSLOT(tp_descr_set);
2183 COPYSLOT(tp_dictoffset);
2184 COPYSLOT(tp_init);
2185 COPYSLOT(tp_alloc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002186 COPYSLOT(tp_free);
Guido van Rossumcc8fe042002-04-05 17:10:16 +00002187 COPYSLOT(tp_is_gc);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002188 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002189}
2190
Jeremy Hylton938ace62002-07-17 16:30:39 +00002191static int add_operators(PyTypeObject *);
2192static int add_subclass(PyTypeObject *base, PyTypeObject *type);
Guido van Rossum13d52f02001-08-10 21:24:08 +00002193
Tim Peters6d6c1a32001-08-02 04:15:00 +00002194int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002195PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002196{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002197 PyObject *dict, *bases;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002198 PyTypeObject *base;
2199 int i, n;
2200
Guido van Rossumcab05802002-06-10 15:29:03 +00002201 if (type->tp_flags & Py_TPFLAGS_READY) {
2202 assert(type->tp_dict != NULL);
Guido van Rossumd614f972001-08-10 17:39:49 +00002203 return 0;
Guido van Rossumcab05802002-06-10 15:29:03 +00002204 }
Guido van Rossumd614f972001-08-10 17:39:49 +00002205 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00002206
2207 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002208
2209 /* Initialize tp_base (defaults to BaseObject unless that's us) */
2210 base = type->tp_base;
2211 if (base == NULL && type != &PyBaseObject_Type)
2212 base = type->tp_base = &PyBaseObject_Type;
2213
Guido van Rossum0986d822002-04-08 01:38:42 +00002214 /* Initialize ob_type if NULL. This means extensions that want to be
2215 compilable separately on Windows can call PyType_Ready() instead of
2216 initializing the ob_type field of their type objects. */
2217 if (type->ob_type == NULL)
2218 type->ob_type = base->ob_type;
2219
Tim Peters6d6c1a32001-08-02 04:15:00 +00002220 /* Initialize tp_bases */
2221 bases = type->tp_bases;
2222 if (bases == NULL) {
2223 if (base == NULL)
2224 bases = PyTuple_New(0);
2225 else
2226 bases = Py_BuildValue("(O)", base);
2227 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00002228 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002229 type->tp_bases = bases;
2230 }
2231
2232 /* Initialize the base class */
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002233 if (base && base->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002234 if (PyType_Ready(base) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00002235 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002236 }
2237
Guido van Rossum687ae002001-10-15 22:03:32 +00002238 /* Initialize tp_dict */
2239 dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002240 if (dict == NULL) {
2241 dict = PyDict_New();
2242 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00002243 goto error;
Guido van Rossum687ae002001-10-15 22:03:32 +00002244 type->tp_dict = dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002245 }
2246
Guido van Rossum687ae002001-10-15 22:03:32 +00002247 /* Add type-specific descriptors to tp_dict */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002248 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00002249 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002250 if (type->tp_methods != NULL) {
2251 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00002252 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002253 }
2254 if (type->tp_members != NULL) {
2255 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00002256 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002257 }
2258 if (type->tp_getset != NULL) {
2259 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00002260 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002261 }
2262
Tim Peters6d6c1a32001-08-02 04:15:00 +00002263 /* Calculate method resolution order */
2264 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00002265 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266 }
2267
Guido van Rossum13d52f02001-08-10 21:24:08 +00002268 /* Inherit special flags from dominant base */
2269 if (type->tp_base != NULL)
2270 inherit_special(type, type->tp_base);
2271
Tim Peters6d6c1a32001-08-02 04:15:00 +00002272 /* Initialize tp_dict properly */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002273 bases = type->tp_mro;
2274 assert(bases != NULL);
2275 assert(PyTuple_Check(bases));
2276 n = PyTuple_GET_SIZE(bases);
2277 for (i = 1; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002278 PyObject *b = PyTuple_GET_ITEM(bases, i);
2279 if (PyType_Check(b))
2280 inherit_slots(type, (PyTypeObject *)b);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002281 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002282
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00002283 /* if the type dictionary doesn't contain a __doc__, set it from
2284 the tp_doc slot.
2285 */
2286 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
2287 if (type->tp_doc != NULL) {
2288 PyObject *doc = PyString_FromString(type->tp_doc);
2289 PyDict_SetItemString(type->tp_dict, "__doc__", doc);
2290 Py_DECREF(doc);
2291 } else {
Guido van Rossumd4641072002-04-03 02:13:37 +00002292 PyDict_SetItemString(type->tp_dict,
2293 "__doc__", Py_None);
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00002294 }
2295 }
2296
Guido van Rossum13d52f02001-08-10 21:24:08 +00002297 /* Some more special stuff */
2298 base = type->tp_base;
2299 if (base != NULL) {
2300 if (type->tp_as_number == NULL)
2301 type->tp_as_number = base->tp_as_number;
2302 if (type->tp_as_sequence == NULL)
2303 type->tp_as_sequence = base->tp_as_sequence;
2304 if (type->tp_as_mapping == NULL)
2305 type->tp_as_mapping = base->tp_as_mapping;
2306 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002307
Guido van Rossum1c450732001-10-08 15:18:27 +00002308 /* Link into each base class's list of subclasses */
2309 bases = type->tp_bases;
2310 n = PyTuple_GET_SIZE(bases);
2311 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002312 PyObject *b = PyTuple_GET_ITEM(bases, i);
2313 if (PyType_Check(b) &&
2314 add_subclass((PyTypeObject *)b, type) < 0)
Guido van Rossum1c450732001-10-08 15:18:27 +00002315 goto error;
2316 }
2317
Guido van Rossum13d52f02001-08-10 21:24:08 +00002318 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00002319 assert(type->tp_dict != NULL);
2320 type->tp_flags =
2321 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002322 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00002323
2324 error:
2325 type->tp_flags &= ~Py_TPFLAGS_READYING;
2326 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002327}
2328
Guido van Rossum1c450732001-10-08 15:18:27 +00002329static int
2330add_subclass(PyTypeObject *base, PyTypeObject *type)
2331{
2332 int i;
2333 PyObject *list, *ref, *new;
2334
2335 list = base->tp_subclasses;
2336 if (list == NULL) {
2337 base->tp_subclasses = list = PyList_New(0);
2338 if (list == NULL)
2339 return -1;
2340 }
2341 assert(PyList_Check(list));
2342 new = PyWeakref_NewRef((PyObject *)type, NULL);
2343 i = PyList_GET_SIZE(list);
2344 while (--i >= 0) {
2345 ref = PyList_GET_ITEM(list, i);
2346 assert(PyWeakref_CheckRef(ref));
2347 if (PyWeakref_GET_OBJECT(ref) == Py_None)
2348 return PyList_SetItem(list, i, new);
2349 }
2350 i = PyList_Append(list, new);
2351 Py_DECREF(new);
2352 return i;
2353}
2354
Tim Peters6d6c1a32001-08-02 04:15:00 +00002355
2356/* Generic wrappers for overloadable 'operators' such as __getitem__ */
2357
2358/* There's a wrapper *function* for each distinct function typedef used
2359 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
2360 wrapper *table* for each distinct operation (e.g. __len__, __add__).
2361 Most tables have only one entry; the tables for binary operators have two
2362 entries, one regular and one with reversed arguments. */
2363
2364static PyObject *
2365wrap_inquiry(PyObject *self, PyObject *args, void *wrapped)
2366{
2367 inquiry func = (inquiry)wrapped;
2368 int res;
2369
2370 if (!PyArg_ParseTuple(args, ""))
2371 return NULL;
2372 res = (*func)(self);
2373 if (res == -1 && PyErr_Occurred())
2374 return NULL;
2375 return PyInt_FromLong((long)res);
2376}
2377
Tim Peters6d6c1a32001-08-02 04:15:00 +00002378static PyObject *
2379wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
2380{
2381 binaryfunc func = (binaryfunc)wrapped;
2382 PyObject *other;
2383
2384 if (!PyArg_ParseTuple(args, "O", &other))
2385 return NULL;
2386 return (*func)(self, other);
2387}
2388
2389static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002390wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
2391{
2392 binaryfunc func = (binaryfunc)wrapped;
2393 PyObject *other;
2394
2395 if (!PyArg_ParseTuple(args, "O", &other))
2396 return NULL;
2397 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002398 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002399 Py_INCREF(Py_NotImplemented);
2400 return Py_NotImplemented;
2401 }
2402 return (*func)(self, other);
2403}
2404
2405static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00002406wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
2407{
2408 binaryfunc func = (binaryfunc)wrapped;
2409 PyObject *other;
2410
2411 if (!PyArg_ParseTuple(args, "O", &other))
2412 return NULL;
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002413 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002414 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00002415 Py_INCREF(Py_NotImplemented);
2416 return Py_NotImplemented;
2417 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002418 return (*func)(other, self);
2419}
2420
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00002421static PyObject *
2422wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
2423{
2424 coercion func = (coercion)wrapped;
2425 PyObject *other, *res;
2426 int ok;
2427
2428 if (!PyArg_ParseTuple(args, "O", &other))
2429 return NULL;
2430 ok = func(&self, &other);
2431 if (ok < 0)
2432 return NULL;
2433 if (ok > 0) {
2434 Py_INCREF(Py_NotImplemented);
2435 return Py_NotImplemented;
2436 }
2437 res = PyTuple_New(2);
2438 if (res == NULL) {
2439 Py_DECREF(self);
2440 Py_DECREF(other);
2441 return NULL;
2442 }
2443 PyTuple_SET_ITEM(res, 0, self);
2444 PyTuple_SET_ITEM(res, 1, other);
2445 return res;
2446}
2447
Tim Peters6d6c1a32001-08-02 04:15:00 +00002448static PyObject *
2449wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
2450{
2451 ternaryfunc func = (ternaryfunc)wrapped;
2452 PyObject *other;
2453 PyObject *third = Py_None;
2454
2455 /* Note: This wrapper only works for __pow__() */
2456
2457 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
2458 return NULL;
2459 return (*func)(self, other, third);
2460}
2461
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00002462static PyObject *
2463wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
2464{
2465 ternaryfunc func = (ternaryfunc)wrapped;
2466 PyObject *other;
2467 PyObject *third = Py_None;
2468
2469 /* Note: This wrapper only works for __pow__() */
2470
2471 if (!PyArg_ParseTuple(args, "O|O", &other, &third))
2472 return NULL;
2473 return (*func)(other, self, third);
2474}
2475
Tim Peters6d6c1a32001-08-02 04:15:00 +00002476static PyObject *
2477wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
2478{
2479 unaryfunc func = (unaryfunc)wrapped;
2480
2481 if (!PyArg_ParseTuple(args, ""))
2482 return NULL;
2483 return (*func)(self);
2484}
2485
Tim Peters6d6c1a32001-08-02 04:15:00 +00002486static PyObject *
2487wrap_intargfunc(PyObject *self, PyObject *args, void *wrapped)
2488{
2489 intargfunc func = (intargfunc)wrapped;
2490 int i;
2491
2492 if (!PyArg_ParseTuple(args, "i", &i))
2493 return NULL;
2494 return (*func)(self, i);
2495}
2496
Guido van Rossum5d815f32001-08-17 21:57:47 +00002497static int
2498getindex(PyObject *self, PyObject *arg)
2499{
2500 int i;
2501
2502 i = PyInt_AsLong(arg);
2503 if (i == -1 && PyErr_Occurred())
2504 return -1;
2505 if (i < 0) {
2506 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
2507 if (sq && sq->sq_length) {
2508 int n = (*sq->sq_length)(self);
2509 if (n < 0)
2510 return -1;
2511 i += n;
2512 }
2513 }
2514 return i;
2515}
2516
2517static PyObject *
2518wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
2519{
2520 intargfunc func = (intargfunc)wrapped;
2521 PyObject *arg;
2522 int i;
2523
Guido van Rossumf4593e02001-10-03 12:09:30 +00002524 if (PyTuple_GET_SIZE(args) == 1) {
2525 arg = PyTuple_GET_ITEM(args, 0);
2526 i = getindex(self, arg);
2527 if (i == -1 && PyErr_Occurred())
2528 return NULL;
2529 return (*func)(self, i);
2530 }
2531 PyArg_ParseTuple(args, "O", &arg);
2532 assert(PyErr_Occurred());
2533 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002534}
2535
Tim Peters6d6c1a32001-08-02 04:15:00 +00002536static PyObject *
2537wrap_intintargfunc(PyObject *self, PyObject *args, void *wrapped)
2538{
2539 intintargfunc func = (intintargfunc)wrapped;
2540 int i, j;
2541
2542 if (!PyArg_ParseTuple(args, "ii", &i, &j))
2543 return NULL;
2544 return (*func)(self, i, j);
2545}
2546
Tim Peters6d6c1a32001-08-02 04:15:00 +00002547static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00002548wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002549{
2550 intobjargproc func = (intobjargproc)wrapped;
2551 int i, res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002552 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002553
Guido van Rossum5d815f32001-08-17 21:57:47 +00002554 if (!PyArg_ParseTuple(args, "OO", &arg, &value))
2555 return NULL;
2556 i = getindex(self, arg);
2557 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00002558 return NULL;
2559 res = (*func)(self, i, value);
2560 if (res == -1 && PyErr_Occurred())
2561 return NULL;
2562 Py_INCREF(Py_None);
2563 return Py_None;
2564}
2565
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002566static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00002567wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002568{
2569 intobjargproc func = (intobjargproc)wrapped;
2570 int i, res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00002571 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002572
Guido van Rossum5d815f32001-08-17 21:57:47 +00002573 if (!PyArg_ParseTuple(args, "O", &arg))
2574 return NULL;
2575 i = getindex(self, arg);
2576 if (i == -1 && PyErr_Occurred())
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002577 return NULL;
2578 res = (*func)(self, i, NULL);
2579 if (res == -1 && PyErr_Occurred())
2580 return NULL;
2581 Py_INCREF(Py_None);
2582 return Py_None;
2583}
2584
Tim Peters6d6c1a32001-08-02 04:15:00 +00002585static PyObject *
2586wrap_intintobjargproc(PyObject *self, PyObject *args, void *wrapped)
2587{
2588 intintobjargproc func = (intintobjargproc)wrapped;
2589 int i, j, res;
2590 PyObject *value;
2591
2592 if (!PyArg_ParseTuple(args, "iiO", &i, &j, &value))
2593 return NULL;
2594 res = (*func)(self, i, j, value);
2595 if (res == -1 && PyErr_Occurred())
2596 return NULL;
2597 Py_INCREF(Py_None);
2598 return Py_None;
2599}
2600
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002601static PyObject *
2602wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
2603{
2604 intintobjargproc func = (intintobjargproc)wrapped;
2605 int i, j, res;
2606
2607 if (!PyArg_ParseTuple(args, "ii", &i, &j))
2608 return NULL;
2609 res = (*func)(self, i, j, NULL);
2610 if (res == -1 && PyErr_Occurred())
2611 return NULL;
2612 Py_INCREF(Py_None);
2613 return Py_None;
2614}
2615
Tim Peters6d6c1a32001-08-02 04:15:00 +00002616/* XXX objobjproc is a misnomer; should be objargpred */
2617static PyObject *
2618wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
2619{
2620 objobjproc func = (objobjproc)wrapped;
2621 int res;
2622 PyObject *value;
2623
2624 if (!PyArg_ParseTuple(args, "O", &value))
2625 return NULL;
2626 res = (*func)(self, value);
2627 if (res == -1 && PyErr_Occurred())
2628 return NULL;
2629 return PyInt_FromLong((long)res);
2630}
2631
Tim Peters6d6c1a32001-08-02 04:15:00 +00002632static PyObject *
2633wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
2634{
2635 objobjargproc func = (objobjargproc)wrapped;
2636 int res;
2637 PyObject *key, *value;
2638
2639 if (!PyArg_ParseTuple(args, "OO", &key, &value))
2640 return NULL;
2641 res = (*func)(self, key, value);
2642 if (res == -1 && PyErr_Occurred())
2643 return NULL;
2644 Py_INCREF(Py_None);
2645 return Py_None;
2646}
2647
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00002648static PyObject *
2649wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
2650{
2651 objobjargproc func = (objobjargproc)wrapped;
2652 int res;
2653 PyObject *key;
2654
2655 if (!PyArg_ParseTuple(args, "O", &key))
2656 return NULL;
2657 res = (*func)(self, key, NULL);
2658 if (res == -1 && PyErr_Occurred())
2659 return NULL;
2660 Py_INCREF(Py_None);
2661 return Py_None;
2662}
2663
Tim Peters6d6c1a32001-08-02 04:15:00 +00002664static PyObject *
2665wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
2666{
2667 cmpfunc func = (cmpfunc)wrapped;
2668 int res;
2669 PyObject *other;
2670
2671 if (!PyArg_ParseTuple(args, "O", &other))
2672 return NULL;
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00002673 if (other->ob_type->tp_compare != func &&
2674 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossumceccae52001-09-18 20:03:57 +00002675 PyErr_Format(
2676 PyExc_TypeError,
2677 "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
2678 self->ob_type->tp_name,
2679 self->ob_type->tp_name,
2680 other->ob_type->tp_name);
2681 return NULL;
2682 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002683 res = (*func)(self, other);
2684 if (PyErr_Occurred())
2685 return NULL;
2686 return PyInt_FromLong((long)res);
2687}
2688
Tim Peters6d6c1a32001-08-02 04:15:00 +00002689static PyObject *
2690wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
2691{
2692 setattrofunc func = (setattrofunc)wrapped;
2693 int res;
2694 PyObject *name, *value;
2695
2696 if (!PyArg_ParseTuple(args, "OO", &name, &value))
2697 return NULL;
2698 res = (*func)(self, name, value);
2699 if (res < 0)
2700 return NULL;
2701 Py_INCREF(Py_None);
2702 return Py_None;
2703}
2704
2705static PyObject *
2706wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
2707{
2708 setattrofunc func = (setattrofunc)wrapped;
2709 int res;
2710 PyObject *name;
2711
2712 if (!PyArg_ParseTuple(args, "O", &name))
2713 return NULL;
2714 res = (*func)(self, name, NULL);
2715 if (res < 0)
2716 return NULL;
2717 Py_INCREF(Py_None);
2718 return Py_None;
2719}
2720
Tim Peters6d6c1a32001-08-02 04:15:00 +00002721static PyObject *
2722wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
2723{
2724 hashfunc func = (hashfunc)wrapped;
2725 long res;
2726
2727 if (!PyArg_ParseTuple(args, ""))
2728 return NULL;
2729 res = (*func)(self);
2730 if (res == -1 && PyErr_Occurred())
2731 return NULL;
2732 return PyInt_FromLong(res);
2733}
2734
Tim Peters6d6c1a32001-08-02 04:15:00 +00002735static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00002736wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002737{
2738 ternaryfunc func = (ternaryfunc)wrapped;
2739
Guido van Rossumc8e56452001-10-22 00:43:43 +00002740 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002741}
2742
Tim Peters6d6c1a32001-08-02 04:15:00 +00002743static PyObject *
2744wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
2745{
2746 richcmpfunc func = (richcmpfunc)wrapped;
2747 PyObject *other;
2748
2749 if (!PyArg_ParseTuple(args, "O", &other))
2750 return NULL;
2751 return (*func)(self, other, op);
2752}
2753
2754#undef RICHCMP_WRAPPER
2755#define RICHCMP_WRAPPER(NAME, OP) \
2756static PyObject * \
2757richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
2758{ \
2759 return wrap_richcmpfunc(self, args, wrapped, OP); \
2760}
2761
Jack Jansen8e938b42001-08-08 15:29:49 +00002762RICHCMP_WRAPPER(lt, Py_LT)
2763RICHCMP_WRAPPER(le, Py_LE)
2764RICHCMP_WRAPPER(eq, Py_EQ)
2765RICHCMP_WRAPPER(ne, Py_NE)
2766RICHCMP_WRAPPER(gt, Py_GT)
2767RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002768
Tim Peters6d6c1a32001-08-02 04:15:00 +00002769static PyObject *
2770wrap_next(PyObject *self, PyObject *args, void *wrapped)
2771{
2772 unaryfunc func = (unaryfunc)wrapped;
2773 PyObject *res;
2774
2775 if (!PyArg_ParseTuple(args, ""))
2776 return NULL;
2777 res = (*func)(self);
2778 if (res == NULL && !PyErr_Occurred())
2779 PyErr_SetNone(PyExc_StopIteration);
2780 return res;
2781}
2782
Tim Peters6d6c1a32001-08-02 04:15:00 +00002783static PyObject *
2784wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
2785{
2786 descrgetfunc func = (descrgetfunc)wrapped;
2787 PyObject *obj;
2788 PyObject *type = NULL;
2789
2790 if (!PyArg_ParseTuple(args, "O|O", &obj, &type))
2791 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002792 return (*func)(self, obj, type);
2793}
2794
Tim Peters6d6c1a32001-08-02 04:15:00 +00002795static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002796wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002797{
2798 descrsetfunc func = (descrsetfunc)wrapped;
2799 PyObject *obj, *value;
2800 int ret;
2801
2802 if (!PyArg_ParseTuple(args, "OO", &obj, &value))
2803 return NULL;
2804 ret = (*func)(self, obj, value);
2805 if (ret < 0)
2806 return NULL;
2807 Py_INCREF(Py_None);
2808 return Py_None;
2809}
2810
Tim Peters6d6c1a32001-08-02 04:15:00 +00002811static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00002812wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002813{
2814 initproc func = (initproc)wrapped;
2815
Guido van Rossumc8e56452001-10-22 00:43:43 +00002816 if (func(self, args, kwds) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002817 return NULL;
2818 Py_INCREF(Py_None);
2819 return Py_None;
2820}
2821
Tim Peters6d6c1a32001-08-02 04:15:00 +00002822static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002823tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002824{
Barry Warsaw60f01882001-08-22 19:24:42 +00002825 PyTypeObject *type, *subtype, *staticbase;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002826 PyObject *arg0, *res;
2827
2828 if (self == NULL || !PyType_Check(self))
2829 Py_FatalError("__new__() called with non-type 'self'");
2830 type = (PyTypeObject *)self;
2831 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002832 PyErr_Format(PyExc_TypeError,
2833 "%s.__new__(): not enough arguments",
2834 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002835 return NULL;
2836 }
2837 arg0 = PyTuple_GET_ITEM(args, 0);
2838 if (!PyType_Check(arg0)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002839 PyErr_Format(PyExc_TypeError,
2840 "%s.__new__(X): X is not a type object (%s)",
2841 type->tp_name,
2842 arg0->ob_type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002843 return NULL;
2844 }
2845 subtype = (PyTypeObject *)arg0;
2846 if (!PyType_IsSubtype(subtype, type)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002847 PyErr_Format(PyExc_TypeError,
2848 "%s.__new__(%s): %s is not a subtype of %s",
2849 type->tp_name,
2850 subtype->tp_name,
2851 subtype->tp_name,
2852 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002853 return NULL;
2854 }
Barry Warsaw60f01882001-08-22 19:24:42 +00002855
2856 /* Check that the use doesn't do something silly and unsafe like
Tim Petersa427a2b2001-10-29 22:25:45 +00002857 object.__new__(dict). To do this, we check that the
Barry Warsaw60f01882001-08-22 19:24:42 +00002858 most derived base that's not a heap type is this type. */
2859 staticbase = subtype;
2860 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
2861 staticbase = staticbase->tp_base;
Guido van Rossuma8c60f42001-09-14 19:43:36 +00002862 if (staticbase->tp_new != type->tp_new) {
Barry Warsaw60f01882001-08-22 19:24:42 +00002863 PyErr_Format(PyExc_TypeError,
2864 "%s.__new__(%s) is not safe, use %s.__new__()",
2865 type->tp_name,
2866 subtype->tp_name,
2867 staticbase == NULL ? "?" : staticbase->tp_name);
2868 return NULL;
2869 }
2870
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002871 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
2872 if (args == NULL)
2873 return NULL;
2874 res = type->tp_new(subtype, args, kwds);
2875 Py_DECREF(args);
2876 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002877}
2878
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002879static struct PyMethodDef tp_new_methoddef[] = {
2880 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
2881 "T.__new__(S, ...) -> a new object with type S, a subtype of T"},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002882 {0}
2883};
2884
2885static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002886add_tp_new_wrapper(PyTypeObject *type)
2887{
Guido van Rossumf040ede2001-08-07 16:40:56 +00002888 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002889
Guido van Rossum687ae002001-10-15 22:03:32 +00002890 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
Guido van Rossumf040ede2001-08-07 16:40:56 +00002891 return 0;
2892 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002893 if (func == NULL)
2894 return -1;
Guido van Rossum687ae002001-10-15 22:03:32 +00002895 return PyDict_SetItemString(type->tp_dict, "__new__", func);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00002896}
2897
Guido van Rossumf040ede2001-08-07 16:40:56 +00002898/* Slot wrappers that call the corresponding __foo__ slot. See comments
2899 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002900
Guido van Rossumdc91b992001-08-08 22:26:22 +00002901#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002902static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002903FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002904{ \
Guido van Rossum5592e4d2001-08-28 18:28:21 +00002905 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002906 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002907}
2908
Guido van Rossumdc91b992001-08-08 22:26:22 +00002909#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002910static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002911FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002912{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002913 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002914 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002915}
2916
Guido van Rossumdc91b992001-08-08 22:26:22 +00002917
2918#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002919static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002920FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002921{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002922 static PyObject *cache_str, *rcache_str; \
Guido van Rossum55f20992001-10-01 17:18:22 +00002923 int do_other = self->ob_type != other->ob_type && \
2924 other->ob_type->tp_as_number != NULL && \
2925 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002926 if (self->ob_type->tp_as_number != NULL && \
2927 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
2928 PyObject *r; \
Guido van Rossum55f20992001-10-01 17:18:22 +00002929 if (do_other && \
2930 PyType_IsSubtype(other->ob_type, self->ob_type)) { \
2931 r = call_maybe( \
2932 other, ROPSTR, &rcache_str, "(O)", self); \
2933 if (r != Py_NotImplemented) \
2934 return r; \
2935 Py_DECREF(r); \
2936 do_other = 0; \
2937 } \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00002938 r = call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00002939 self, OPSTR, &cache_str, "(O)", other); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002940 if (r != Py_NotImplemented || \
2941 other->ob_type == self->ob_type) \
2942 return r; \
2943 Py_DECREF(r); \
2944 } \
Guido van Rossum55f20992001-10-01 17:18:22 +00002945 if (do_other) { \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00002946 return call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00002947 other, ROPSTR, &rcache_str, "(O)", self); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00002948 } \
2949 Py_INCREF(Py_NotImplemented); \
2950 return Py_NotImplemented; \
2951}
2952
2953#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
2954 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
2955
2956#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
2957static PyObject * \
2958FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
2959{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00002960 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00002961 return call_method(self, OPSTR, &cache_str, \
2962 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00002963}
2964
2965static int
2966slot_sq_length(PyObject *self)
2967{
Guido van Rossum2730b132001-08-28 18:22:14 +00002968 static PyObject *len_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00002969 PyObject *res = call_method(self, "__len__", &len_str, "()");
Guido van Rossum26111622001-10-01 16:42:49 +00002970 int len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002971
2972 if (res == NULL)
2973 return -1;
Guido van Rossum26111622001-10-01 16:42:49 +00002974 len = (int)PyInt_AsLong(res);
2975 Py_DECREF(res);
Jeremy Hylton73a088e2002-07-25 16:43:29 +00002976 if (len == -1 && PyErr_Occurred())
2977 return -1;
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00002978 if (len < 0) {
2979 PyErr_SetString(PyExc_ValueError,
2980 "__len__() should return >= 0");
2981 return -1;
2982 }
Guido van Rossum26111622001-10-01 16:42:49 +00002983 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002984}
2985
Guido van Rossumdc91b992001-08-08 22:26:22 +00002986SLOT1(slot_sq_concat, "__add__", PyObject *, "O")
2987SLOT1(slot_sq_repeat, "__mul__", int, "i")
Guido van Rossumf4593e02001-10-03 12:09:30 +00002988
2989/* Super-optimized version of slot_sq_item.
2990 Other slots could do the same... */
2991static PyObject *
2992slot_sq_item(PyObject *self, int i)
2993{
2994 static PyObject *getitem_str;
2995 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
2996 descrgetfunc f;
2997
2998 if (getitem_str == NULL) {
2999 getitem_str = PyString_InternFromString("__getitem__");
3000 if (getitem_str == NULL)
3001 return NULL;
3002 }
3003 func = _PyType_Lookup(self->ob_type, getitem_str);
3004 if (func != NULL) {
Guido van Rossumf4593e02001-10-03 12:09:30 +00003005 if ((f = func->ob_type->tp_descr_get) == NULL)
3006 Py_INCREF(func);
3007 else
3008 func = f(func, self, (PyObject *)(self->ob_type));
3009 ival = PyInt_FromLong(i);
3010 if (ival != NULL) {
3011 args = PyTuple_New(1);
3012 if (args != NULL) {
3013 PyTuple_SET_ITEM(args, 0, ival);
3014 retval = PyObject_Call(func, args, NULL);
3015 Py_XDECREF(args);
3016 Py_XDECREF(func);
3017 return retval;
3018 }
3019 }
3020 }
3021 else {
3022 PyErr_SetObject(PyExc_AttributeError, getitem_str);
3023 }
3024 Py_XDECREF(args);
3025 Py_XDECREF(ival);
3026 Py_XDECREF(func);
3027 return NULL;
3028}
3029
Guido van Rossumdc91b992001-08-08 22:26:22 +00003030SLOT2(slot_sq_slice, "__getslice__", int, int, "ii")
Tim Peters6d6c1a32001-08-02 04:15:00 +00003031
3032static int
3033slot_sq_ass_item(PyObject *self, int index, PyObject *value)
3034{
3035 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003036 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003037
3038 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00003039 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003040 "(i)", index);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003041 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003042 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003043 "(iO)", index, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003044 if (res == NULL)
3045 return -1;
3046 Py_DECREF(res);
3047 return 0;
3048}
3049
3050static int
3051slot_sq_ass_slice(PyObject *self, int i, int j, PyObject *value)
3052{
3053 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003054 static PyObject *delslice_str, *setslice_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003055
3056 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00003057 res = call_method(self, "__delslice__", &delslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003058 "(ii)", i, j);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003059 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003060 res = call_method(self, "__setslice__", &setslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003061 "(iiO)", i, j, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003062 if (res == NULL)
3063 return -1;
3064 Py_DECREF(res);
3065 return 0;
3066}
3067
3068static int
3069slot_sq_contains(PyObject *self, PyObject *value)
3070{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003071 PyObject *func, *res, *args;
Guido van Rossum60718732001-08-28 17:47:51 +00003072 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003073
Guido van Rossum55f20992001-10-01 17:18:22 +00003074 func = lookup_maybe(self, "__contains__", &contains_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003075
3076 if (func != NULL) {
3077 args = Py_BuildValue("(O)", value);
3078 if (args == NULL)
3079 res = NULL;
3080 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00003081 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003082 Py_DECREF(args);
3083 }
3084 Py_DECREF(func);
3085 if (res == NULL)
3086 return -1;
3087 return PyObject_IsTrue(res);
3088 }
Guido van Rossum55f20992001-10-01 17:18:22 +00003089 else if (PyErr_Occurred())
3090 return -1;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003091 else {
Tim Peters16a77ad2001-09-08 04:00:12 +00003092 return _PySequence_IterSearch(self, value,
3093 PY_ITERSEARCH_CONTAINS);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003094 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003095}
3096
Guido van Rossumdc91b992001-08-08 22:26:22 +00003097SLOT1(slot_sq_inplace_concat, "__iadd__", PyObject *, "O")
3098SLOT1(slot_sq_inplace_repeat, "__imul__", int, "i")
Tim Peters6d6c1a32001-08-02 04:15:00 +00003099
3100#define slot_mp_length slot_sq_length
3101
Guido van Rossumdc91b992001-08-08 22:26:22 +00003102SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00003103
3104static int
3105slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
3106{
3107 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003108 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003109
3110 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00003111 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003112 "(O)", key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003113 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003114 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003115 "(OO)", key, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003116 if (res == NULL)
3117 return -1;
3118 Py_DECREF(res);
3119 return 0;
3120}
3121
Guido van Rossumdc91b992001-08-08 22:26:22 +00003122SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
3123SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
3124SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
3125SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
3126SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
3127SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
3128
Jeremy Hylton938ace62002-07-17 16:30:39 +00003129static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00003130
3131SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
3132 nb_power, "__pow__", "__rpow__")
3133
3134static PyObject *
3135slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
3136{
Guido van Rossum2730b132001-08-28 18:22:14 +00003137 static PyObject *pow_str;
3138
Guido van Rossumdc91b992001-08-08 22:26:22 +00003139 if (modulus == Py_None)
3140 return slot_nb_power_binary(self, other);
Guido van Rossum23094982002-06-10 14:30:43 +00003141 /* Three-arg power doesn't use __rpow__. But ternary_op
3142 can call this when the second argument's type uses
3143 slot_nb_power, so check before calling self.__pow__. */
3144 if (self->ob_type->tp_as_number != NULL &&
3145 self->ob_type->tp_as_number->nb_power == slot_nb_power) {
3146 return call_method(self, "__pow__", &pow_str,
3147 "(OO)", other, modulus);
3148 }
3149 Py_INCREF(Py_NotImplemented);
3150 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00003151}
3152
3153SLOT0(slot_nb_negative, "__neg__")
3154SLOT0(slot_nb_positive, "__pos__")
3155SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156
3157static int
3158slot_nb_nonzero(PyObject *self)
3159{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003160 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003161 static PyObject *nonzero_str, *len_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003162
Guido van Rossum55f20992001-10-01 17:18:22 +00003163 func = lookup_maybe(self, "__nonzero__", &nonzero_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003164 if (func == NULL) {
Guido van Rossum55f20992001-10-01 17:18:22 +00003165 if (PyErr_Occurred())
Guido van Rossumb8f63662001-08-15 23:57:02 +00003166 return -1;
Guido van Rossum55f20992001-10-01 17:18:22 +00003167 func = lookup_maybe(self, "__len__", &len_str);
3168 if (func == NULL) {
3169 if (PyErr_Occurred())
3170 return -1;
3171 else
3172 return 1;
3173 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00003174 }
Guido van Rossum55f20992001-10-01 17:18:22 +00003175 res = PyObject_CallObject(func, NULL);
3176 Py_DECREF(func);
3177 if (res == NULL)
3178 return -1;
3179 return PyObject_IsTrue(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180}
3181
Guido van Rossumdc91b992001-08-08 22:26:22 +00003182SLOT0(slot_nb_invert, "__invert__")
3183SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
3184SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
3185SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
3186SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
3187SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003188
3189static int
3190slot_nb_coerce(PyObject **a, PyObject **b)
3191{
3192 static PyObject *coerce_str;
3193 PyObject *self = *a, *other = *b;
3194
3195 if (self->ob_type->tp_as_number != NULL &&
3196 self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
3197 PyObject *r;
3198 r = call_maybe(
3199 self, "__coerce__", &coerce_str, "(O)", other);
3200 if (r == NULL)
3201 return -1;
3202 if (r == Py_NotImplemented) {
3203 Py_DECREF(r);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003204 }
Guido van Rossum55f20992001-10-01 17:18:22 +00003205 else {
3206 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
3207 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003208 "__coerce__ didn't return a 2-tuple");
Guido van Rossum55f20992001-10-01 17:18:22 +00003209 Py_DECREF(r);
3210 return -1;
3211 }
3212 *a = PyTuple_GET_ITEM(r, 0);
3213 Py_INCREF(*a);
3214 *b = PyTuple_GET_ITEM(r, 1);
3215 Py_INCREF(*b);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003216 Py_DECREF(r);
Guido van Rossum55f20992001-10-01 17:18:22 +00003217 return 0;
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003218 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003219 }
3220 if (other->ob_type->tp_as_number != NULL &&
3221 other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
3222 PyObject *r;
3223 r = call_maybe(
3224 other, "__coerce__", &coerce_str, "(O)", self);
3225 if (r == NULL)
3226 return -1;
3227 if (r == Py_NotImplemented) {
3228 Py_DECREF(r);
3229 return 1;
3230 }
3231 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
3232 PyErr_SetString(PyExc_TypeError,
3233 "__coerce__ didn't return a 2-tuple");
3234 Py_DECREF(r);
3235 return -1;
3236 }
3237 *a = PyTuple_GET_ITEM(r, 1);
3238 Py_INCREF(*a);
3239 *b = PyTuple_GET_ITEM(r, 0);
3240 Py_INCREF(*b);
3241 Py_DECREF(r);
3242 return 0;
3243 }
3244 return 1;
3245}
3246
Guido van Rossumdc91b992001-08-08 22:26:22 +00003247SLOT0(slot_nb_int, "__int__")
3248SLOT0(slot_nb_long, "__long__")
3249SLOT0(slot_nb_float, "__float__")
3250SLOT0(slot_nb_oct, "__oct__")
3251SLOT0(slot_nb_hex, "__hex__")
3252SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
3253SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
3254SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
3255SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
3256SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
3257SLOT2(slot_nb_inplace_power, "__ipow__", PyObject *, PyObject *, "OO")
3258SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
3259SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
3260SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
3261SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
3262SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
3263SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
3264 "__floordiv__", "__rfloordiv__")
3265SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
3266SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
3267SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00003268
3269static int
Guido van Rossumb8f63662001-08-15 23:57:02 +00003270half_compare(PyObject *self, PyObject *other)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003271{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003272 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003273 static PyObject *cmp_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003274 int c;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003275
Guido van Rossum60718732001-08-28 17:47:51 +00003276 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003277 if (func == NULL) {
3278 PyErr_Clear();
3279 }
3280 else {
3281 args = Py_BuildValue("(O)", other);
3282 if (args == NULL)
3283 res = NULL;
3284 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00003285 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003286 Py_DECREF(args);
3287 }
Raymond Hettingerab5dae32002-06-24 13:08:16 +00003288 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003289 if (res != Py_NotImplemented) {
3290 if (res == NULL)
3291 return -2;
3292 c = PyInt_AsLong(res);
3293 Py_DECREF(res);
3294 if (c == -1 && PyErr_Occurred())
3295 return -2;
3296 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
3297 }
3298 Py_DECREF(res);
3299 }
3300 return 2;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003301}
3302
Guido van Rossumab3b0342001-09-18 20:38:53 +00003303/* This slot is published for the benefit of try_3way_compare in object.c */
3304int
3305_PyObject_SlotCompare(PyObject *self, PyObject *other)
Guido van Rossumb8f63662001-08-15 23:57:02 +00003306{
3307 int c;
3308
Guido van Rossumab3b0342001-09-18 20:38:53 +00003309 if (self->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003310 c = half_compare(self, other);
3311 if (c <= 1)
3312 return c;
3313 }
Guido van Rossumab3b0342001-09-18 20:38:53 +00003314 if (other->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003315 c = half_compare(other, self);
3316 if (c < -1)
3317 return -2;
3318 if (c <= 1)
3319 return -c;
3320 }
3321 return (void *)self < (void *)other ? -1 :
3322 (void *)self > (void *)other ? 1 : 0;
3323}
3324
3325static PyObject *
3326slot_tp_repr(PyObject *self)
3327{
3328 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003329 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003330
Guido van Rossum60718732001-08-28 17:47:51 +00003331 func = lookup_method(self, "__repr__", &repr_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003332 if (func != NULL) {
3333 res = PyEval_CallObject(func, NULL);
3334 Py_DECREF(func);
3335 return res;
3336 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00003337 PyErr_Clear();
3338 return PyString_FromFormat("<%s object at %p>",
3339 self->ob_type->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003340}
3341
3342static PyObject *
3343slot_tp_str(PyObject *self)
3344{
3345 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003346 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003347
Guido van Rossum60718732001-08-28 17:47:51 +00003348 func = lookup_method(self, "__str__", &str_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003349 if (func != NULL) {
3350 res = PyEval_CallObject(func, NULL);
3351 Py_DECREF(func);
3352 return res;
3353 }
3354 else {
3355 PyErr_Clear();
3356 return slot_tp_repr(self);
3357 }
3358}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003359
3360static long
3361slot_tp_hash(PyObject *self)
3362{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003363 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003364 static PyObject *hash_str, *eq_str, *cmp_str;
3365
Tim Peters6d6c1a32001-08-02 04:15:00 +00003366 long h;
3367
Guido van Rossum60718732001-08-28 17:47:51 +00003368 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003369
3370 if (func != NULL) {
3371 res = PyEval_CallObject(func, NULL);
3372 Py_DECREF(func);
3373 if (res == NULL)
3374 return -1;
3375 h = PyInt_AsLong(res);
3376 }
3377 else {
3378 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003379 func = lookup_method(self, "__eq__", &eq_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003380 if (func == NULL) {
3381 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003382 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003383 }
3384 if (func != NULL) {
3385 Py_DECREF(func);
3386 PyErr_SetString(PyExc_TypeError, "unhashable type");
3387 return -1;
3388 }
3389 PyErr_Clear();
3390 h = _Py_HashPointer((void *)self);
3391 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003392 if (h == -1 && !PyErr_Occurred())
3393 h = -2;
3394 return h;
3395}
3396
3397static PyObject *
3398slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
3399{
Guido van Rossum60718732001-08-28 17:47:51 +00003400 static PyObject *call_str;
3401 PyObject *meth = lookup_method(self, "__call__", &call_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003402 PyObject *res;
3403
3404 if (meth == NULL)
3405 return NULL;
3406 res = PyObject_Call(meth, args, kwds);
3407 Py_DECREF(meth);
3408 return res;
3409}
3410
Guido van Rossum14a6f832001-10-17 13:59:09 +00003411/* There are two slot dispatch functions for tp_getattro.
3412
3413 - slot_tp_getattro() is used when __getattribute__ is overridden
3414 but no __getattr__ hook is present;
3415
3416 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
3417
Guido van Rossumc334df52002-04-04 23:44:47 +00003418 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
3419 detects the absence of __getattr__ and then installs the simpler slot if
3420 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00003421
Tim Peters6d6c1a32001-08-02 04:15:00 +00003422static PyObject *
3423slot_tp_getattro(PyObject *self, PyObject *name)
3424{
Guido van Rossum14a6f832001-10-17 13:59:09 +00003425 static PyObject *getattribute_str = NULL;
3426 return call_method(self, "__getattribute__", &getattribute_str,
3427 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003428}
3429
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003430static PyObject *
3431slot_tp_getattr_hook(PyObject *self, PyObject *name)
3432{
3433 PyTypeObject *tp = self->ob_type;
3434 PyObject *getattr, *getattribute, *res;
3435 static PyObject *getattribute_str = NULL;
3436 static PyObject *getattr_str = NULL;
3437
3438 if (getattr_str == NULL) {
3439 getattr_str = PyString_InternFromString("__getattr__");
3440 if (getattr_str == NULL)
3441 return NULL;
3442 }
3443 if (getattribute_str == NULL) {
3444 getattribute_str =
3445 PyString_InternFromString("__getattribute__");
3446 if (getattribute_str == NULL)
3447 return NULL;
3448 }
3449 getattr = _PyType_Lookup(tp, getattr_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003450 if (getattr == NULL) {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003451 /* No __getattr__ hook: use a simpler dispatcher */
3452 tp->tp_getattro = slot_tp_getattro;
3453 return slot_tp_getattro(self, name);
3454 }
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003455 getattribute = _PyType_Lookup(tp, getattribute_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003456 if (getattribute == NULL ||
3457 (getattribute->ob_type == &PyWrapperDescr_Type &&
3458 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
3459 (void *)PyObject_GenericGetAttr))
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003460 res = PyObject_GenericGetAttr(self, name);
3461 else
3462 res = PyObject_CallFunction(getattribute, "OO", self, name);
Guido van Rossum14a6f832001-10-17 13:59:09 +00003463 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Guido van Rossum19c1cd52001-09-21 21:24:49 +00003464 PyErr_Clear();
3465 res = PyObject_CallFunction(getattr, "OO", self, name);
3466 }
3467 return res;
3468}
3469
Tim Peters6d6c1a32001-08-02 04:15:00 +00003470static int
3471slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
3472{
3473 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003474 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003475
3476 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00003477 res = call_method(self, "__delattr__", &delattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003478 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003479 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003480 res = call_method(self, "__setattr__", &setattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003481 "(OO)", name, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003482 if (res == NULL)
3483 return -1;
3484 Py_DECREF(res);
3485 return 0;
3486}
3487
3488/* Map rich comparison operators to their __xx__ namesakes */
3489static char *name_op[] = {
3490 "__lt__",
3491 "__le__",
3492 "__eq__",
3493 "__ne__",
3494 "__gt__",
3495 "__ge__",
3496};
3497
3498static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00003499half_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003500{
Guido van Rossumb8f63662001-08-15 23:57:02 +00003501 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003502 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00003503
Guido van Rossum60718732001-08-28 17:47:51 +00003504 func = lookup_method(self, name_op[op], &op_str[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003505 if (func == NULL) {
3506 PyErr_Clear();
3507 Py_INCREF(Py_NotImplemented);
3508 return Py_NotImplemented;
3509 }
3510 args = Py_BuildValue("(O)", other);
3511 if (args == NULL)
3512 res = NULL;
3513 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00003514 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003515 Py_DECREF(args);
3516 }
3517 Py_DECREF(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003518 return res;
3519}
3520
Guido van Rossumb8f63662001-08-15 23:57:02 +00003521/* Map rich comparison operators to their swapped version, e.g. LT --> GT */
3522static int swapped_op[] = {Py_GT, Py_GE, Py_EQ, Py_NE, Py_LT, Py_LE};
3523
3524static PyObject *
3525slot_tp_richcompare(PyObject *self, PyObject *other, int op)
3526{
3527 PyObject *res;
3528
3529 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
3530 res = half_richcompare(self, other, op);
3531 if (res != Py_NotImplemented)
3532 return res;
3533 Py_DECREF(res);
3534 }
3535 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
3536 res = half_richcompare(other, self, swapped_op[op]);
3537 if (res != Py_NotImplemented) {
3538 return res;
3539 }
3540 Py_DECREF(res);
3541 }
3542 Py_INCREF(Py_NotImplemented);
3543 return Py_NotImplemented;
3544}
3545
3546static PyObject *
3547slot_tp_iter(PyObject *self)
3548{
3549 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00003550 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003551
Guido van Rossum60718732001-08-28 17:47:51 +00003552 func = lookup_method(self, "__iter__", &iter_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003553 if (func != NULL) {
3554 res = PyObject_CallObject(func, NULL);
3555 Py_DECREF(func);
3556 return res;
3557 }
3558 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00003559 func = lookup_method(self, "__getitem__", &getitem_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003560 if (func == NULL) {
Guido van Rossumd4641072002-04-03 02:13:37 +00003561 PyErr_SetString(PyExc_TypeError,
3562 "iteration over non-sequence");
Guido van Rossumb8f63662001-08-15 23:57:02 +00003563 return NULL;
3564 }
3565 Py_DECREF(func);
3566 return PySeqIter_New(self);
3567}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003568
3569static PyObject *
3570slot_tp_iternext(PyObject *self)
3571{
Guido van Rossum2730b132001-08-28 18:22:14 +00003572 static PyObject *next_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00003573 return call_method(self, "next", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00003574}
3575
Guido van Rossum1a493502001-08-17 16:47:50 +00003576static PyObject *
3577slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
3578{
3579 PyTypeObject *tp = self->ob_type;
3580 PyObject *get;
3581 static PyObject *get_str = NULL;
3582
3583 if (get_str == NULL) {
3584 get_str = PyString_InternFromString("__get__");
3585 if (get_str == NULL)
3586 return NULL;
3587 }
3588 get = _PyType_Lookup(tp, get_str);
3589 if (get == NULL) {
3590 /* Avoid further slowdowns */
3591 if (tp->tp_descr_get == slot_tp_descr_get)
3592 tp->tp_descr_get = NULL;
3593 Py_INCREF(self);
3594 return self;
3595 }
Guido van Rossum2c252392001-08-24 10:13:31 +00003596 if (obj == NULL)
3597 obj = Py_None;
3598 if (type == NULL)
3599 type = Py_None;
Guido van Rossum1a493502001-08-17 16:47:50 +00003600 return PyObject_CallFunction(get, "OOO", self, obj, type);
3601}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003602
3603static int
3604slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
3605{
Guido van Rossum2c252392001-08-24 10:13:31 +00003606 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00003607 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00003608
3609 if (value == NULL)
Guido van Rossum1d5b3f22001-12-03 00:08:33 +00003610 res = call_method(self, "__delete__", &del_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003611 "(O)", target);
Guido van Rossum2c252392001-08-24 10:13:31 +00003612 else
Guido van Rossum2730b132001-08-28 18:22:14 +00003613 res = call_method(self, "__set__", &set_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00003614 "(OO)", target, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003615 if (res == NULL)
3616 return -1;
3617 Py_DECREF(res);
3618 return 0;
3619}
3620
3621static int
3622slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
3623{
Guido van Rossum60718732001-08-28 17:47:51 +00003624 static PyObject *init_str;
3625 PyObject *meth = lookup_method(self, "__init__", &init_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003626 PyObject *res;
3627
3628 if (meth == NULL)
3629 return -1;
3630 res = PyObject_Call(meth, args, kwds);
3631 Py_DECREF(meth);
3632 if (res == NULL)
3633 return -1;
3634 Py_DECREF(res);
3635 return 0;
3636}
3637
3638static PyObject *
3639slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
3640{
3641 PyObject *func = PyObject_GetAttrString((PyObject *)type, "__new__");
3642 PyObject *newargs, *x;
3643 int i, n;
3644
3645 if (func == NULL)
3646 return NULL;
3647 assert(PyTuple_Check(args));
3648 n = PyTuple_GET_SIZE(args);
3649 newargs = PyTuple_New(n+1);
3650 if (newargs == NULL)
3651 return NULL;
3652 Py_INCREF(type);
3653 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
3654 for (i = 0; i < n; i++) {
3655 x = PyTuple_GET_ITEM(args, i);
3656 Py_INCREF(x);
3657 PyTuple_SET_ITEM(newargs, i+1, x);
3658 }
3659 x = PyObject_Call(func, newargs, kwds);
Guido van Rossum25d18072001-10-01 15:55:28 +00003660 Py_DECREF(newargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003661 Py_DECREF(func);
3662 return x;
3663}
3664
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003665
3666/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
3667 functions. The offsets here are relative to the 'etype' structure, which
3668 incorporates the additional structures used for numbers, sequences and
3669 mappings. Note that multiple names may map to the same slot (e.g. __eq__,
3670 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00003671 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
3672 terminated with an all-zero entry. (This table is further initialized and
3673 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003674
Guido van Rossum6d204072001-10-21 00:44:31 +00003675typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003676
3677#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00003678#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003679#undef ETSLOT
3680#undef SQSLOT
3681#undef MPSLOT
3682#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00003683#undef UNSLOT
3684#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003685#undef BINSLOT
3686#undef RBINSLOT
3687
Guido van Rossum6d204072001-10-21 00:44:31 +00003688#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3689 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, DOC}
Guido van Rossumc8e56452001-10-22 00:43:43 +00003690#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
3691 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
3692 DOC, FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00003693#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3694 {NAME, offsetof(etype, SLOT), (void *)(FUNCTION), WRAPPER, DOC}
3695#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3696 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
3697#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3698 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
3699#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3700 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
3701#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3702 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
3703 "x." NAME "() <==> " DOC)
3704#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
3705 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
3706 "x." NAME "(y) <==> x" DOC "y")
3707#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
3708 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
3709 "x." NAME "(y) <==> x" DOC "y")
3710#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
3711 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
3712 "x." NAME "(y) <==> y" DOC "x")
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003713
3714static slotdef slotdefs[] = {
Guido van Rossum6d204072001-10-21 00:44:31 +00003715 SQSLOT("__len__", sq_length, slot_sq_length, wrap_inquiry,
3716 "x.__len__() <==> len(x)"),
3717 SQSLOT("__add__", sq_concat, slot_sq_concat, wrap_binaryfunc,
3718 "x.__add__(y) <==> x+y"),
3719 SQSLOT("__mul__", sq_repeat, slot_sq_repeat, wrap_intargfunc,
3720 "x.__mul__(n) <==> x*n"),
3721 SQSLOT("__rmul__", sq_repeat, slot_sq_repeat, wrap_intargfunc,
3722 "x.__rmul__(n) <==> n*x"),
3723 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
3724 "x.__getitem__(y) <==> x[y]"),
3725 SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_intintargfunc,
3726 "x.__getslice__(i, j) <==> x[i:j]"),
3727 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
3728 "x.__setitem__(i, y) <==> x[i]=y"),
3729 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
3730 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003731 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
Guido van Rossum6d204072001-10-21 00:44:31 +00003732 wrap_intintobjargproc,
3733 "x.__setslice__(i, j, y) <==> x[i:j]=y"),
3734 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
3735 "x.__delslice__(i, j) <==> del x[i:j]"),
3736 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
3737 "x.__contains__(y) <==> y in x"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003738 SQSLOT("__iadd__", sq_inplace_concat, slot_sq_inplace_concat,
Guido van Rossum6d204072001-10-21 00:44:31 +00003739 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003740 SQSLOT("__imul__", sq_inplace_repeat, slot_sq_inplace_repeat,
Guido van Rossum6d204072001-10-21 00:44:31 +00003741 wrap_intargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003742
Guido van Rossum6d204072001-10-21 00:44:31 +00003743 MPSLOT("__len__", mp_length, slot_mp_length, wrap_inquiry,
3744 "x.__len__() <==> len(x)"),
Guido van Rossumfd38f8e2001-10-09 20:17:57 +00003745 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003746 wrap_binaryfunc,
3747 "x.__getitem__(y) <==> x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003748 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003749 wrap_objobjargproc,
3750 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003751 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00003752 wrap_delitem,
3753 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003754
Guido van Rossum6d204072001-10-21 00:44:31 +00003755 BINSLOT("__add__", nb_add, slot_nb_add,
3756 "+"),
3757 RBINSLOT("__radd__", nb_add, slot_nb_add,
3758 "+"),
3759 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
3760 "-"),
3761 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
3762 "-"),
3763 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
3764 "*"),
3765 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
3766 "*"),
3767 BINSLOT("__div__", nb_divide, slot_nb_divide,
3768 "/"),
3769 RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
3770 "/"),
3771 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
3772 "%"),
3773 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
3774 "%"),
3775 BINSLOT("__divmod__", nb_divmod, slot_nb_divmod,
3776 "divmod(x, y)"),
3777 RBINSLOT("__rdivmod__", nb_divmod, slot_nb_divmod,
3778 "divmod(y, x)"),
3779 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
3780 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
3781 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
3782 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
3783 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
3784 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
3785 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
3786 "abs(x)"),
Guido van Rossumdfce3bf2002-03-10 14:11:16 +00003787 UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquiry,
Guido van Rossum6d204072001-10-21 00:44:31 +00003788 "x != 0"),
3789 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
3790 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
3791 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
3792 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
3793 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
3794 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
3795 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
3796 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
3797 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
3798 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
3799 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
3800 NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
3801 "x.__coerce__(y) <==> coerce(x, y)"),
3802 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
3803 "int(x)"),
3804 UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
3805 "long(x)"),
3806 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
3807 "float(x)"),
3808 UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
3809 "oct(x)"),
3810 UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
3811 "hex(x)"),
3812 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
3813 wrap_binaryfunc, "+"),
3814 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
3815 wrap_binaryfunc, "-"),
3816 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
3817 wrap_binaryfunc, "*"),
3818 IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
3819 wrap_binaryfunc, "/"),
3820 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
3821 wrap_binaryfunc, "%"),
3822 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
3823 wrap_ternaryfunc, "**"),
3824 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
3825 wrap_binaryfunc, "<<"),
3826 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
3827 wrap_binaryfunc, ">>"),
3828 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
3829 wrap_binaryfunc, "&"),
3830 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
3831 wrap_binaryfunc, "^"),
3832 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
3833 wrap_binaryfunc, "|"),
3834 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
3835 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
3836 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
3837 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
3838 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
3839 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
3840 IBSLOT("__itruediv__", nb_inplace_true_divide,
3841 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003842
Guido van Rossum6d204072001-10-21 00:44:31 +00003843 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
3844 "x.__str__() <==> str(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00003845 TPSLOT("__str__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00003846 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
3847 "x.__repr__() <==> repr(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00003848 TPSLOT("__repr__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00003849 TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
3850 "x.__cmp__(y) <==> cmp(x,y)"),
3851 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
3852 "x.__hash__() <==> hash(x)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00003853 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
3854 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
Guido van Rossumd396b9c2001-10-13 20:02:41 +00003855 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
Guido van Rossum6d204072001-10-21 00:44:31 +00003856 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
3857 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
3858 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
3859 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
3860 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
3861 "x.__setattr__('name', value) <==> x.name = value"),
3862 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
3863 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
3864 "x.__delattr__('name') <==> del x.name"),
3865 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
3866 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
3867 "x.__lt__(y) <==> x<y"),
3868 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
3869 "x.__le__(y) <==> x<=y"),
3870 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
3871 "x.__eq__(y) <==> x==y"),
3872 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
3873 "x.__ne__(y) <==> x!=y"),
3874 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
3875 "x.__gt__(y) <==> x>y"),
3876 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
3877 "x.__ge__(y) <==> x>=y"),
3878 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
3879 "x.__iter__() <==> iter(x)"),
3880 TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
3881 "x.next() -> the next value, or raise StopIteration"),
3882 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
3883 "descr.__get__(obj[, type]) -> value"),
3884 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
3885 "descr.__set__(obj, value)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00003886 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
Guido van Rossum6d204072001-10-21 00:44:31 +00003887 "x.__init__(...) initializes x; "
Guido van Rossumc8e56452001-10-22 00:43:43 +00003888 "see x.__class__.__doc__ for signature",
3889 PyWrapperFlag_KEYWORDS),
3890 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003891 {NULL}
3892};
3893
Guido van Rossumc334df52002-04-04 23:44:47 +00003894/* Given a type pointer and an offset gotten from a slotdef entry, return a
3895 pointer to the actual slot. This is not quite the same as simply adding
3896 the offset to the type pointer, since it takes care to indirect through the
3897 proper indirection pointer (as_buffer, etc.); it returns NULL if the
3898 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003899static void **
3900slotptr(PyTypeObject *type, int offset)
3901{
3902 char *ptr;
3903
Guido van Rossum09638c12002-06-13 19:17:46 +00003904 /* Note: this depends on the order of the members of etype! */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003905 assert(offset >= 0);
3906 assert(offset < offsetof(etype, as_buffer));
Guido van Rossum09638c12002-06-13 19:17:46 +00003907 if (offset >= offsetof(etype, as_sequence)) {
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003908 ptr = (void *)type->tp_as_sequence;
3909 offset -= offsetof(etype, as_sequence);
3910 }
Guido van Rossum09638c12002-06-13 19:17:46 +00003911 else if (offset >= offsetof(etype, as_mapping)) {
3912 ptr = (void *)type->tp_as_mapping;
3913 offset -= offsetof(etype, as_mapping);
3914 }
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003915 else if (offset >= offsetof(etype, as_number)) {
3916 ptr = (void *)type->tp_as_number;
3917 offset -= offsetof(etype, as_number);
3918 }
3919 else {
3920 ptr = (void *)type;
3921 }
3922 if (ptr != NULL)
3923 ptr += offset;
3924 return (void **)ptr;
3925}
Guido van Rossumf040ede2001-08-07 16:40:56 +00003926
Guido van Rossumc334df52002-04-04 23:44:47 +00003927/* Length of array of slotdef pointers used to store slots with the
3928 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
3929 the same __name__, for any __name__. Since that's a static property, it is
3930 appropriate to declare fixed-size arrays for this. */
3931#define MAX_EQUIV 10
3932
3933/* Return a slot pointer for a given name, but ONLY if the attribute has
3934 exactly one slot function. The name must be an interned string. */
3935static void **
3936resolve_slotdups(PyTypeObject *type, PyObject *name)
3937{
3938 /* XXX Maybe this could be optimized more -- but is it worth it? */
3939
3940 /* pname and ptrs act as a little cache */
3941 static PyObject *pname;
3942 static slotdef *ptrs[MAX_EQUIV];
3943 slotdef *p, **pp;
3944 void **res, **ptr;
3945
3946 if (pname != name) {
3947 /* Collect all slotdefs that match name into ptrs. */
3948 pname = name;
3949 pp = ptrs;
3950 for (p = slotdefs; p->name_strobj; p++) {
3951 if (p->name_strobj == name)
3952 *pp++ = p;
3953 }
3954 *pp = NULL;
3955 }
3956
3957 /* Look in all matching slots of the type; if exactly one of these has
3958 a filled-in slot, return its value. Otherwise return NULL. */
3959 res = NULL;
3960 for (pp = ptrs; *pp; pp++) {
3961 ptr = slotptr(type, (*pp)->offset);
3962 if (ptr == NULL || *ptr == NULL)
3963 continue;
3964 if (res != NULL)
3965 return NULL;
3966 res = ptr;
3967 }
3968 return res;
3969}
3970
3971/* Common code for update_these_slots() and fixup_slot_dispatchers(). This
3972 does some incredibly complex thinking and then sticks something into the
3973 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
3974 interests, and then stores a generic wrapper or a specific function into
3975 the slot.) Return a pointer to the next slotdef with a different offset,
3976 because that's convenient for fixup_slot_dispatchers(). */
3977static slotdef *
3978update_one_slot(PyTypeObject *type, slotdef *p)
3979{
3980 PyObject *descr;
3981 PyWrapperDescrObject *d;
3982 void *generic = NULL, *specific = NULL;
3983 int use_generic = 0;
3984 int offset = p->offset;
3985 void **ptr = slotptr(type, offset);
3986
3987 if (ptr == NULL) {
3988 do {
3989 ++p;
3990 } while (p->offset == offset);
3991 return p;
3992 }
3993 do {
3994 descr = _PyType_Lookup(type, p->name_strobj);
3995 if (descr == NULL)
3996 continue;
3997 if (descr->ob_type == &PyWrapperDescr_Type) {
3998 void **tptr = resolve_slotdups(type, p->name_strobj);
3999 if (tptr == NULL || tptr == ptr)
4000 generic = p->function;
4001 d = (PyWrapperDescrObject *)descr;
4002 if (d->d_base->wrapper == p->wrapper &&
4003 PyType_IsSubtype(type, d->d_type))
4004 {
4005 if (specific == NULL ||
4006 specific == d->d_wrapped)
4007 specific = d->d_wrapped;
4008 else
4009 use_generic = 1;
4010 }
4011 }
4012 else {
4013 use_generic = 1;
4014 generic = p->function;
4015 }
4016 } while ((++p)->offset == offset);
4017 if (specific && !use_generic)
4018 *ptr = specific;
4019 else
4020 *ptr = generic;
4021 return p;
4022}
4023
Jeremy Hylton938ace62002-07-17 16:30:39 +00004024static int recurse_down_subclasses(PyTypeObject *type, slotdef **pp,
4025 PyObject *name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004026
Guido van Rossumc334df52002-04-04 23:44:47 +00004027/* In the type, update the slots whose slotdefs are gathered in the pp0 array,
4028 and then do the same for all this type's subtypes. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004029static int
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004030update_these_slots(PyTypeObject *type, slotdef **pp0, PyObject *name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004031{
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004032 slotdef **pp;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004033
Guido van Rossumc334df52002-04-04 23:44:47 +00004034 for (pp = pp0; *pp; pp++)
4035 update_one_slot(type, *pp);
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004036 return recurse_down_subclasses(type, pp0, name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004037}
4038
Guido van Rossumc334df52002-04-04 23:44:47 +00004039/* Update the slots whose slotdefs are gathered in the pp array in all (direct
4040 or indirect) subclasses of type. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004041static int
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004042recurse_down_subclasses(PyTypeObject *type, slotdef **pp, PyObject *name)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004043{
4044 PyTypeObject *subclass;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004045 PyObject *ref, *subclasses, *dict;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004046 int i, n;
4047
4048 subclasses = type->tp_subclasses;
4049 if (subclasses == NULL)
4050 return 0;
4051 assert(PyList_Check(subclasses));
4052 n = PyList_GET_SIZE(subclasses);
4053 for (i = 0; i < n; i++) {
4054 ref = PyList_GET_ITEM(subclasses, i);
4055 assert(PyWeakref_CheckRef(ref));
4056 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
Guido van Rossum59e6c532002-06-14 02:27:07 +00004057 assert(subclass != NULL);
4058 if ((PyObject *)subclass == Py_None)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004059 continue;
4060 assert(PyType_Check(subclass));
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004061 /* Avoid recursing down into unaffected classes */
4062 dict = subclass->tp_dict;
4063 if (dict != NULL && PyDict_Check(dict) &&
4064 PyDict_GetItem(dict, name) != NULL)
4065 continue;
4066 if (update_these_slots(subclass, pp, name) < 0)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004067 return -1;
4068 }
4069 return 0;
4070}
4071
Guido van Rossumc334df52002-04-04 23:44:47 +00004072/* Comparison function for qsort() to compare slotdefs by their offset, and
4073 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004074static int
4075slotdef_cmp(const void *aa, const void *bb)
4076{
4077 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
4078 int c = a->offset - b->offset;
4079 if (c != 0)
4080 return c;
4081 else
4082 return a - b;
4083}
4084
Guido van Rossumc334df52002-04-04 23:44:47 +00004085/* Initialize the slotdefs table by adding interned string objects for the
4086 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004087static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004088init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004089{
4090 slotdef *p;
4091 static int initialized = 0;
4092
4093 if (initialized)
4094 return;
4095 for (p = slotdefs; p->name; p++) {
4096 p->name_strobj = PyString_InternFromString(p->name);
4097 if (!p->name_strobj)
Guido van Rossumc334df52002-04-04 23:44:47 +00004098 Py_FatalError("Out of memory interning slotdef names");
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004099 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004100 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
4101 slotdef_cmp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004102 initialized = 1;
4103}
4104
Guido van Rossumc334df52002-04-04 23:44:47 +00004105/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004106static int
4107update_slot(PyTypeObject *type, PyObject *name)
4108{
Guido van Rossumc334df52002-04-04 23:44:47 +00004109 slotdef *ptrs[MAX_EQUIV];
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004110 slotdef *p;
4111 slotdef **pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004112 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004113
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004114 init_slotdefs();
4115 pp = ptrs;
4116 for (p = slotdefs; p->name; p++) {
4117 /* XXX assume name is interned! */
4118 if (p->name_strobj == name)
4119 *pp++ = p;
4120 }
4121 *pp = NULL;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004122 for (pp = ptrs; *pp; pp++) {
4123 p = *pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004124 offset = p->offset;
4125 while (p > slotdefs && (p-1)->offset == offset)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004126 --p;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004127 *pp = p;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004128 }
Guido van Rossumc334df52002-04-04 23:44:47 +00004129 if (ptrs[0] == NULL)
4130 return 0; /* Not an attribute that affects any slots */
Guido van Rossumb85a8b72001-10-16 17:00:48 +00004131 return update_these_slots(type, ptrs, name);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00004132}
4133
Guido van Rossumc334df52002-04-04 23:44:47 +00004134/* Store the proper functions in the slot dispatches at class (type)
4135 definition time, based upon which operations the class overrides in its
4136 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004137static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004138fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004139{
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004140 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004141
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004142 init_slotdefs();
Guido van Rossumc334df52002-04-04 23:44:47 +00004143 for (p = slotdefs; p->name; )
4144 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004145}
Guido van Rossum705f0f52001-08-24 16:47:00 +00004146
Guido van Rossum6d204072001-10-21 00:44:31 +00004147/* This function is called by PyType_Ready() to populate the type's
4148 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00004149 function slot (like tp_repr) that's defined in the type, one or more
4150 corresponding descriptors are added in the type's tp_dict dictionary
4151 under the appropriate name (like __repr__). Some function slots
4152 cause more than one descriptor to be added (for example, the nb_add
4153 slot adds both __add__ and __radd__ descriptors) and some function
4154 slots compete for the same descriptor (for example both sq_item and
4155 mp_subscript generate a __getitem__ descriptor).
4156
4157 In the latter case, the first slotdef entry encoutered wins. Since
4158 slotdef entries are sorted by the offset of the slot in the etype
4159 struct, this gives us some control over disambiguating between
4160 competing slots: the members of struct etype are listed from most
4161 general to least general, so the most general slot is preferred. In
4162 particular, because as_mapping comes before as_sequence, for a type
4163 that defines both mp_subscript and sq_item, mp_subscript wins.
4164
4165 This only adds new descriptors and doesn't overwrite entries in
4166 tp_dict that were previously defined. The descriptors contain a
4167 reference to the C function they must call, so that it's safe if they
4168 are copied into a subtype's __dict__ and the subtype has a different
4169 C function in its slot -- calling the method defined by the
4170 descriptor will call the C function that was used to create it,
4171 rather than the C function present in the slot when it is called.
4172 (This is important because a subtype may have a C function in the
4173 slot that calls the method from the dictionary, and we want to avoid
4174 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00004175
4176static int
4177add_operators(PyTypeObject *type)
4178{
4179 PyObject *dict = type->tp_dict;
4180 slotdef *p;
4181 PyObject *descr;
4182 void **ptr;
4183
4184 init_slotdefs();
4185 for (p = slotdefs; p->name; p++) {
4186 if (p->wrapper == NULL)
4187 continue;
4188 ptr = slotptr(type, p->offset);
4189 if (!ptr || !*ptr)
4190 continue;
4191 if (PyDict_GetItem(dict, p->name_strobj))
4192 continue;
4193 descr = PyDescr_NewWrapper(type, p, *ptr);
4194 if (descr == NULL)
4195 return -1;
4196 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
4197 return -1;
4198 Py_DECREF(descr);
4199 }
4200 if (type->tp_new != NULL) {
4201 if (add_tp_new_wrapper(type) < 0)
4202 return -1;
4203 }
4204 return 0;
4205}
4206
Guido van Rossum705f0f52001-08-24 16:47:00 +00004207
4208/* Cooperative 'super' */
4209
4210typedef struct {
4211 PyObject_HEAD
Guido van Rossume705ef12001-08-29 15:47:06 +00004212 PyTypeObject *type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004213 PyObject *obj;
4214} superobject;
4215
Guido van Rossum6f799372001-09-20 20:46:19 +00004216static PyMemberDef super_members[] = {
4217 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
4218 "the class invoking super()"},
4219 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
4220 "the instance invoking super(); may be None"},
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004221 {0}
4222};
4223
Guido van Rossum705f0f52001-08-24 16:47:00 +00004224static void
4225super_dealloc(PyObject *self)
4226{
4227 superobject *su = (superobject *)self;
4228
Guido van Rossum048eb752001-10-02 21:24:57 +00004229 _PyObject_GC_UNTRACK(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00004230 Py_XDECREF(su->obj);
4231 Py_XDECREF(su->type);
4232 self->ob_type->tp_free(self);
4233}
4234
4235static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004236super_repr(PyObject *self)
4237{
4238 superobject *su = (superobject *)self;
4239
4240 if (su->obj)
4241 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00004242 "<super: <class '%s'>, <%s object>>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004243 su->type ? su->type->tp_name : "NULL",
4244 su->obj->ob_type->tp_name);
4245 else
4246 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00004247 "<super: <class '%s'>, NULL>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004248 su->type ? su->type->tp_name : "NULL");
4249}
4250
4251static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00004252super_getattro(PyObject *self, PyObject *name)
4253{
4254 superobject *su = (superobject *)self;
4255
4256 if (su->obj != NULL) {
Tim Petersa91e9642001-11-14 23:32:33 +00004257 PyObject *mro, *res, *tmp, *dict;
Guido van Rossum155db9a2002-04-02 17:53:47 +00004258 PyTypeObject *starttype;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004259 descrgetfunc f;
4260 int i, n;
4261
Guido van Rossum155db9a2002-04-02 17:53:47 +00004262 starttype = su->obj->ob_type;
4263 mro = starttype->tp_mro;
4264
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004265 if (mro == NULL)
4266 n = 0;
4267 else {
4268 assert(PyTuple_Check(mro));
4269 n = PyTuple_GET_SIZE(mro);
4270 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00004271 for (i = 0; i < n; i++) {
Guido van Rossume705ef12001-08-29 15:47:06 +00004272 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
Guido van Rossum705f0f52001-08-24 16:47:00 +00004273 break;
4274 }
Guido van Rossume705ef12001-08-29 15:47:06 +00004275 if (i >= n && PyType_Check(su->obj)) {
Guido van Rossum155db9a2002-04-02 17:53:47 +00004276 starttype = (PyTypeObject *)(su->obj);
4277 mro = starttype->tp_mro;
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004278 if (mro == NULL)
4279 n = 0;
4280 else {
4281 assert(PyTuple_Check(mro));
4282 n = PyTuple_GET_SIZE(mro);
4283 }
Guido van Rossume705ef12001-08-29 15:47:06 +00004284 for (i = 0; i < n; i++) {
4285 if ((PyObject *)(su->type) ==
4286 PyTuple_GET_ITEM(mro, i))
4287 break;
4288 }
Guido van Rossume705ef12001-08-29 15:47:06 +00004289 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00004290 i++;
4291 res = NULL;
4292 for (; i < n; i++) {
4293 tmp = PyTuple_GET_ITEM(mro, i);
Tim Petersa91e9642001-11-14 23:32:33 +00004294 if (PyType_Check(tmp))
4295 dict = ((PyTypeObject *)tmp)->tp_dict;
4296 else if (PyClass_Check(tmp))
4297 dict = ((PyClassObject *)tmp)->cl_dict;
4298 else
4299 continue;
4300 res = PyDict_GetItem(dict, name);
Guido van Rossum5b443c62001-12-03 15:38:28 +00004301 if (res != NULL && !PyDescr_IsData(res)) {
Guido van Rossum705f0f52001-08-24 16:47:00 +00004302 Py_INCREF(res);
4303 f = res->ob_type->tp_descr_get;
4304 if (f != NULL) {
Guido van Rossumd4641072002-04-03 02:13:37 +00004305 tmp = f(res, su->obj,
4306 (PyObject *)starttype);
Guido van Rossum705f0f52001-08-24 16:47:00 +00004307 Py_DECREF(res);
4308 res = tmp;
4309 }
4310 return res;
4311 }
4312 }
4313 }
4314 return PyObject_GenericGetAttr(self, name);
4315}
4316
Guido van Rossum5b443c62001-12-03 15:38:28 +00004317static int
4318supercheck(PyTypeObject *type, PyObject *obj)
4319{
4320 if (!PyType_IsSubtype(obj->ob_type, type) &&
4321 !(PyType_Check(obj) &&
4322 PyType_IsSubtype((PyTypeObject *)obj, type))) {
4323 PyErr_SetString(PyExc_TypeError,
4324 "super(type, obj): "
4325 "obj must be an instance or subtype of type");
4326 return -1;
4327 }
4328 else
4329 return 0;
4330}
4331
Guido van Rossum705f0f52001-08-24 16:47:00 +00004332static PyObject *
4333super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
4334{
4335 superobject *su = (superobject *)self;
4336 superobject *new;
4337
4338 if (obj == NULL || obj == Py_None || su->obj != NULL) {
4339 /* Not binding to an object, or already bound */
4340 Py_INCREF(self);
4341 return self;
4342 }
Guido van Rossum5b443c62001-12-03 15:38:28 +00004343 if (su->ob_type != &PySuper_Type)
4344 /* If su is an instance of a subclass of super,
4345 call its type */
4346 return PyObject_CallFunction((PyObject *)su->ob_type,
4347 "OO", su->type, obj);
4348 else {
4349 /* Inline the common case */
4350 if (supercheck(su->type, obj) < 0)
4351 return NULL;
4352 new = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
4353 NULL, NULL);
4354 if (new == NULL)
4355 return NULL;
4356 Py_INCREF(su->type);
4357 Py_INCREF(obj);
4358 new->type = su->type;
4359 new->obj = obj;
4360 return (PyObject *)new;
4361 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00004362}
4363
4364static int
4365super_init(PyObject *self, PyObject *args, PyObject *kwds)
4366{
4367 superobject *su = (superobject *)self;
Guido van Rossume705ef12001-08-29 15:47:06 +00004368 PyTypeObject *type;
4369 PyObject *obj = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004370
4371 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
4372 return -1;
4373 if (obj == Py_None)
4374 obj = NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00004375 if (obj != NULL && supercheck(type, obj) < 0)
Guido van Rossum705f0f52001-08-24 16:47:00 +00004376 return -1;
Guido van Rossum705f0f52001-08-24 16:47:00 +00004377 Py_INCREF(type);
4378 Py_XINCREF(obj);
4379 su->type = type;
4380 su->obj = obj;
4381 return 0;
4382}
4383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004384PyDoc_STRVAR(super_doc,
Guido van Rossum705f0f52001-08-24 16:47:00 +00004385"super(type) -> unbound super object\n"
4386"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00004387"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00004388"Typical use to call a cooperative superclass method:\n"
4389"class C(B):\n"
4390" def meth(self, arg):\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00004391" super(C, self).meth(arg)");
Guido van Rossum705f0f52001-08-24 16:47:00 +00004392
Guido van Rossum048eb752001-10-02 21:24:57 +00004393static int
4394super_traverse(PyObject *self, visitproc visit, void *arg)
4395{
4396 superobject *su = (superobject *)self;
4397 int err;
4398
4399#define VISIT(SLOT) \
4400 if (SLOT) { \
4401 err = visit((PyObject *)(SLOT), arg); \
4402 if (err) \
4403 return err; \
4404 }
4405
4406 VISIT(su->obj);
4407 VISIT(su->type);
4408
4409#undef VISIT
4410
4411 return 0;
4412}
4413
Guido van Rossum705f0f52001-08-24 16:47:00 +00004414PyTypeObject PySuper_Type = {
4415 PyObject_HEAD_INIT(&PyType_Type)
4416 0, /* ob_size */
4417 "super", /* tp_name */
4418 sizeof(superobject), /* tp_basicsize */
4419 0, /* tp_itemsize */
4420 /* methods */
4421 super_dealloc, /* tp_dealloc */
4422 0, /* tp_print */
4423 0, /* tp_getattr */
4424 0, /* tp_setattr */
4425 0, /* tp_compare */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004426 super_repr, /* tp_repr */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004427 0, /* tp_as_number */
4428 0, /* tp_as_sequence */
4429 0, /* tp_as_mapping */
4430 0, /* tp_hash */
4431 0, /* tp_call */
4432 0, /* tp_str */
4433 super_getattro, /* tp_getattro */
4434 0, /* tp_setattro */
4435 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00004436 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
4437 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004438 super_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00004439 super_traverse, /* tp_traverse */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004440 0, /* tp_clear */
4441 0, /* tp_richcompare */
4442 0, /* tp_weaklistoffset */
4443 0, /* tp_iter */
4444 0, /* tp_iternext */
4445 0, /* tp_methods */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00004446 super_members, /* tp_members */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004447 0, /* tp_getset */
4448 0, /* tp_base */
4449 0, /* tp_dict */
4450 super_descr_get, /* tp_descr_get */
4451 0, /* tp_descr_set */
4452 0, /* tp_dictoffset */
4453 super_init, /* tp_init */
4454 PyType_GenericAlloc, /* tp_alloc */
4455 PyType_GenericNew, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00004456 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00004457};