blob: 7a59bb22d68d9550aa3374f460bc6dda08270519 [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
Guido van Rossum6f799372001-09-20 20:46:19 +00008static PyMemberDef type_members[] = {
Tim Peters6d6c1a32001-08-02 04:15:00 +00009 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
10 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
11 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
Guido van Rossum9676b222001-08-17 20:32:36 +000012 {"__weakrefoffset__", T_LONG,
Tim Peters6d6c1a32001-08-02 04:15:00 +000013 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
14 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
15 {"__dictoffset__", T_LONG,
16 offsetof(PyTypeObject, tp_dictoffset), READONLY},
Tim Peters6d6c1a32001-08-02 04:15:00 +000017 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
18 {0}
19};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000020
Guido van Rossumc0b618a1997-05-02 03:12:38 +000021static PyObject *
Guido van Rossumc3542212001-08-16 09:18:56 +000022type_name(PyTypeObject *type, void *context)
23{
Jeremy Hyltonaf68c872005-12-10 18:50:16 +000024 const char *s;
Guido van Rossumc3542212001-08-16 09:18:56 +000025
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +000026 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
Guido van Rossume5c691a2003-03-07 15:13:17 +000027 PyHeapTypeObject* et = (PyHeapTypeObject*)type;
Tim Petersea7f75d2002-12-07 21:39:16 +000028
Georg Brandlc255c7b2006-02-20 22:27:28 +000029 Py_INCREF(et->ht_name);
30 return et->ht_name;
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +000031 }
32 else {
33 s = strrchr(type->tp_name, '.');
34 if (s == NULL)
35 s = type->tp_name;
36 else
37 s++;
38 return PyString_FromString(s);
39 }
Guido van Rossumc3542212001-08-16 09:18:56 +000040}
41
Michael W. Hudson98bbc492002-11-26 14:47:27 +000042static int
43type_set_name(PyTypeObject *type, PyObject *value, void *context)
44{
Guido van Rossume5c691a2003-03-07 15:13:17 +000045 PyHeapTypeObject* et;
Michael W. Hudson98bbc492002-11-26 14:47:27 +000046
47 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
48 PyErr_Format(PyExc_TypeError,
49 "can't set %s.__name__", type->tp_name);
50 return -1;
51 }
52 if (!value) {
53 PyErr_Format(PyExc_TypeError,
54 "can't delete %s.__name__", type->tp_name);
55 return -1;
56 }
57 if (!PyString_Check(value)) {
58 PyErr_Format(PyExc_TypeError,
59 "can only assign string to %s.__name__, not '%s'",
60 type->tp_name, value->ob_type->tp_name);
61 return -1;
62 }
Tim Petersea7f75d2002-12-07 21:39:16 +000063 if (strlen(PyString_AS_STRING(value))
Michael W. Hudson98bbc492002-11-26 14:47:27 +000064 != (size_t)PyString_GET_SIZE(value)) {
65 PyErr_Format(PyExc_ValueError,
66 "__name__ must not contain null bytes");
67 return -1;
68 }
69
Guido van Rossume5c691a2003-03-07 15:13:17 +000070 et = (PyHeapTypeObject*)type;
Michael W. Hudson98bbc492002-11-26 14:47:27 +000071
72 Py_INCREF(value);
73
Georg Brandlc255c7b2006-02-20 22:27:28 +000074 Py_DECREF(et->ht_name);
75 et->ht_name = value;
Michael W. Hudson98bbc492002-11-26 14:47:27 +000076
77 type->tp_name = PyString_AS_STRING(value);
78
79 return 0;
80}
81
Guido van Rossumc3542212001-08-16 09:18:56 +000082static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +000083type_module(PyTypeObject *type, void *context)
Guido van Rossum29ca26e1995-01-07 11:58:15 +000084{
Guido van Rossumc3542212001-08-16 09:18:56 +000085 PyObject *mod;
86 char *s;
87
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +000088 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
89 mod = PyDict_GetItemString(type->tp_dict, "__module__");
Anthony Baxter3ecdb252004-06-11 14:41:18 +000090 if (!mod) {
91 PyErr_Format(PyExc_AttributeError, "__module__");
92 return 0;
93 }
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +000094 Py_XINCREF(mod);
Guido van Rossumc3542212001-08-16 09:18:56 +000095 return mod;
96 }
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +000097 else {
98 s = strrchr(type->tp_name, '.');
99 if (s != NULL)
100 return PyString_FromStringAndSize(
101 type->tp_name, (int)(s - type->tp_name));
102 return PyString_FromString("__builtin__");
103 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000104}
105
Guido van Rossum3926a632001-09-25 16:25:58 +0000106static int
107type_set_module(PyTypeObject *type, PyObject *value, void *context)
108{
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000109 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
Guido van Rossum3926a632001-09-25 16:25:58 +0000110 PyErr_Format(PyExc_TypeError,
111 "can't set %s.__module__", type->tp_name);
112 return -1;
113 }
114 if (!value) {
115 PyErr_Format(PyExc_TypeError,
116 "can't delete %s.__module__", type->tp_name);
117 return -1;
118 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000119
Guido van Rossum3926a632001-09-25 16:25:58 +0000120 return PyDict_SetItemString(type->tp_dict, "__module__", value);
121}
122
Tim Peters6d6c1a32001-08-02 04:15:00 +0000123static PyObject *
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000124type_get_bases(PyTypeObject *type, void *context)
125{
126 Py_INCREF(type->tp_bases);
127 return type->tp_bases;
128}
129
130static PyTypeObject *best_base(PyObject *);
131static int mro_internal(PyTypeObject *);
132static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
133static int add_subclass(PyTypeObject*, PyTypeObject*);
134static void remove_subclass(PyTypeObject *, PyTypeObject *);
135static void update_all_slots(PyTypeObject *);
136
Guido van Rossum8d24ee92003-03-24 23:49:49 +0000137typedef int (*update_callback)(PyTypeObject *, void *);
138static int update_subclasses(PyTypeObject *type, PyObject *name,
139 update_callback callback, void *data);
140static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
141 update_callback callback, void *data);
142
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000143static int
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000144mro_subclasses(PyTypeObject *type, PyObject* temp)
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000145{
146 PyTypeObject *subclass;
147 PyObject *ref, *subclasses, *old_mro;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000148 Py_ssize_t i, n;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000149
150 subclasses = type->tp_subclasses;
151 if (subclasses == NULL)
152 return 0;
153 assert(PyList_Check(subclasses));
154 n = PyList_GET_SIZE(subclasses);
155 for (i = 0; i < n; i++) {
156 ref = PyList_GET_ITEM(subclasses, i);
157 assert(PyWeakref_CheckRef(ref));
158 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
159 assert(subclass != NULL);
160 if ((PyObject *)subclass == Py_None)
161 continue;
162 assert(PyType_Check(subclass));
163 old_mro = subclass->tp_mro;
164 if (mro_internal(subclass) < 0) {
165 subclass->tp_mro = old_mro;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000166 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000167 }
168 else {
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000169 PyObject* tuple;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000170 tuple = PyTuple_Pack(2, subclass, old_mro);
Guido van Rossum19a02ba2003-04-15 22:09:45 +0000171 Py_DECREF(old_mro);
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000172 if (!tuple)
173 return -1;
174 if (PyList_Append(temp, tuple) < 0)
175 return -1;
Guido van Rossum19a02ba2003-04-15 22:09:45 +0000176 Py_DECREF(tuple);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000177 }
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000178 if (mro_subclasses(subclass, temp) < 0)
179 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000180 }
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000181 return 0;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000182}
183
184static int
185type_set_bases(PyTypeObject *type, PyObject *value, void *context)
186{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000187 Py_ssize_t i;
188 int r = 0;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000189 PyObject *ob, *temp;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000190 PyTypeObject *new_base, *old_base;
191 PyObject *old_bases, *old_mro;
192
193 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
194 PyErr_Format(PyExc_TypeError,
195 "can't set %s.__bases__", type->tp_name);
196 return -1;
197 }
198 if (!value) {
199 PyErr_Format(PyExc_TypeError,
200 "can't delete %s.__bases__", type->tp_name);
201 return -1;
202 }
203 if (!PyTuple_Check(value)) {
204 PyErr_Format(PyExc_TypeError,
205 "can only assign tuple to %s.__bases__, not %s",
206 type->tp_name, value->ob_type->tp_name);
207 return -1;
208 }
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +0000209 if (PyTuple_GET_SIZE(value) == 0) {
210 PyErr_Format(PyExc_TypeError,
211 "can only assign non-empty tuple to %s.__bases__, not ()",
212 type->tp_name);
213 return -1;
214 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000215 for (i = 0; i < PyTuple_GET_SIZE(value); i++) {
216 ob = PyTuple_GET_ITEM(value, i);
217 if (!PyClass_Check(ob) && !PyType_Check(ob)) {
218 PyErr_Format(
219 PyExc_TypeError,
220 "%s.__bases__ must be tuple of old- or new-style classes, not '%s'",
221 type->tp_name, ob->ob_type->tp_name);
222 return -1;
223 }
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +0000224 if (PyType_Check(ob)) {
225 if (PyType_IsSubtype((PyTypeObject*)ob, type)) {
226 PyErr_SetString(PyExc_TypeError,
227 "a __bases__ item causes an inheritance cycle");
228 return -1;
229 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000230 }
231 }
232
233 new_base = best_base(value);
234
235 if (!new_base) {
236 return -1;
237 }
238
239 if (!compatible_for_assignment(type->tp_base, new_base, "__bases__"))
240 return -1;
241
242 Py_INCREF(new_base);
243 Py_INCREF(value);
244
245 old_bases = type->tp_bases;
246 old_base = type->tp_base;
247 old_mro = type->tp_mro;
248
249 type->tp_bases = value;
250 type->tp_base = new_base;
251
252 if (mro_internal(type) < 0) {
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000253 goto bail;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000254 }
255
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000256 temp = PyList_New(0);
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000257 if (!temp)
258 goto bail;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000259
260 r = mro_subclasses(type, temp);
261
262 if (r < 0) {
263 for (i = 0; i < PyList_Size(temp); i++) {
264 PyTypeObject* cls;
265 PyObject* mro;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000266 PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
267 "", 2, 2, &cls, &mro);
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000268 Py_DECREF(cls->tp_mro);
269 cls->tp_mro = mro;
270 Py_INCREF(cls->tp_mro);
271 }
272 Py_DECREF(temp);
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000273 goto bail;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000274 }
275
276 Py_DECREF(temp);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000277
278 /* any base that was in __bases__ but now isn't, we
Raymond Hettingera8285862002-12-14 17:17:56 +0000279 need to remove |type| from its tp_subclasses.
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000280 conversely, any class now in __bases__ that wasn't
Raymond Hettingera8285862002-12-14 17:17:56 +0000281 needs to have |type| added to its subclasses. */
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000282
283 /* for now, sod that: just remove from all old_bases,
284 add to all new_bases */
285
286 for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) {
287 ob = PyTuple_GET_ITEM(old_bases, i);
288 if (PyType_Check(ob)) {
289 remove_subclass(
290 (PyTypeObject*)ob, type);
291 }
292 }
293
294 for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) {
295 ob = PyTuple_GET_ITEM(value, i);
296 if (PyType_Check(ob)) {
297 if (add_subclass((PyTypeObject*)ob, type) < 0)
298 r = -1;
299 }
300 }
301
302 update_all_slots(type);
303
304 Py_DECREF(old_bases);
305 Py_DECREF(old_base);
306 Py_DECREF(old_mro);
307
308 return r;
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000309
310 bail:
Michael W. Hudsone723e452003-08-07 14:58:10 +0000311 Py_DECREF(type->tp_bases);
312 Py_DECREF(type->tp_base);
313 if (type->tp_mro != old_mro) {
314 Py_DECREF(type->tp_mro);
315 }
316
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000317 type->tp_bases = old_bases;
318 type->tp_base = old_base;
319 type->tp_mro = old_mro;
Tim Petersea7f75d2002-12-07 21:39:16 +0000320
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000321 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000322}
323
324static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000325type_dict(PyTypeObject *type, void *context)
326{
327 if (type->tp_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 Py_INCREF(Py_None);
329 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000330 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000331 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000332}
333
Tim Peters24008312002-03-17 18:56:20 +0000334static PyObject *
335type_get_doc(PyTypeObject *type, void *context)
336{
337 PyObject *result;
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000338 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
Tim Peters24008312002-03-17 18:56:20 +0000339 return PyString_FromString(type->tp_doc);
Tim Peters24008312002-03-17 18:56:20 +0000340 result = PyDict_GetItemString(type->tp_dict, "__doc__");
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000341 if (result == NULL) {
342 result = Py_None;
343 Py_INCREF(result);
344 }
345 else if (result->ob_type->tp_descr_get) {
Tim Peters2b858972002-04-18 04:12:28 +0000346 result = result->ob_type->tp_descr_get(result, NULL,
347 (PyObject *)type);
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000348 }
349 else {
350 Py_INCREF(result);
351 }
Tim Peters24008312002-03-17 18:56:20 +0000352 return result;
353}
354
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000355static PyGetSetDef type_getsets[] = {
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000356 {"__name__", (getter)type_name, (setter)type_set_name, NULL},
357 {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
Guido van Rossum3926a632001-09-25 16:25:58 +0000358 {"__module__", (getter)type_module, (setter)type_set_module, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000359 {"__dict__", (getter)type_dict, NULL, NULL},
Tim Peters24008312002-03-17 18:56:20 +0000360 {"__doc__", (getter)type_get_doc, NULL, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000361 {0}
362};
363
Martin v. Löwis0163d6d2001-06-09 07:34:05 +0000364static int
365type_compare(PyObject *v, PyObject *w)
366{
367 /* This is called with type objects only. So we
368 can just compare the addresses. */
369 Py_uintptr_t vv = (Py_uintptr_t)v;
370 Py_uintptr_t ww = (Py_uintptr_t)w;
371 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
372}
373
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000375type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000377 PyObject *mod, *name, *rtn;
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000378 char *kind;
Guido van Rossumc3542212001-08-16 09:18:56 +0000379
380 mod = type_module(type, NULL);
381 if (mod == NULL)
382 PyErr_Clear();
383 else if (!PyString_Check(mod)) {
384 Py_DECREF(mod);
385 mod = NULL;
386 }
387 name = type_name(type, NULL);
388 if (name == NULL)
389 return NULL;
Barry Warsaw7ce36942001-08-24 18:34:26 +0000390
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000391 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
392 kind = "class";
393 else
394 kind = "type";
395
Barry Warsaw7ce36942001-08-24 18:34:26 +0000396 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000397 rtn = PyString_FromFormat("<%s '%s.%s'>",
398 kind,
Barry Warsaw7ce36942001-08-24 18:34:26 +0000399 PyString_AS_STRING(mod),
400 PyString_AS_STRING(name));
401 }
Guido van Rossumc3542212001-08-16 09:18:56 +0000402 else
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000403 rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000404
Guido van Rossumc3542212001-08-16 09:18:56 +0000405 Py_XDECREF(mod);
406 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000407 return rtn;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408}
409
Tim Peters6d6c1a32001-08-02 04:15:00 +0000410static PyObject *
411type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
412{
413 PyObject *obj;
414
415 if (type->tp_new == NULL) {
416 PyErr_Format(PyExc_TypeError,
417 "cannot create '%.100s' instances",
418 type->tp_name);
419 return NULL;
420 }
421
Tim Peters3f996e72001-09-13 19:18:27 +0000422 obj = type->tp_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000423 if (obj != NULL) {
Guido van Rossumf76de622001-10-18 15:49:21 +0000424 /* Ugly exception: when the call was type(something),
425 don't call tp_init on the result. */
426 if (type == &PyType_Type &&
427 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
428 (kwds == NULL ||
429 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
430 return obj;
Guido van Rossum8ace1ab2002-04-06 01:05:01 +0000431 /* If the returned object is not an instance of type,
432 it won't be initialized. */
433 if (!PyType_IsSubtype(obj->ob_type, type))
434 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435 type = obj->ob_type;
Jeremy Hylton719841e2002-07-16 19:39:38 +0000436 if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) &&
437 type->tp_init != NULL &&
Tim Peters6d6c1a32001-08-02 04:15:00 +0000438 type->tp_init(obj, args, kwds) < 0) {
439 Py_DECREF(obj);
440 obj = NULL;
441 }
442 }
443 return obj;
444}
445
446PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000447PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000448{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000449 PyObject *obj;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000450 const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
451 /* note that we need to add one, for the sentinel */
Tim Peters406fe3b2001-10-06 19:04:01 +0000452
453 if (PyType_IS_GC(type))
Neil Schemenauer09a2ae52002-04-12 03:06:53 +0000454 obj = _PyObject_GC_Malloc(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000455 else
Neil Schemenauerc806c882001-08-29 23:54:54 +0000456 obj = PyObject_MALLOC(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000457
Neil Schemenauerc806c882001-08-29 23:54:54 +0000458 if (obj == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000459 return PyErr_NoMemory();
Tim Peters406fe3b2001-10-06 19:04:01 +0000460
Neil Schemenauerc806c882001-08-29 23:54:54 +0000461 memset(obj, '\0', size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000462
Tim Peters6d6c1a32001-08-02 04:15:00 +0000463 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
464 Py_INCREF(type);
Tim Peters406fe3b2001-10-06 19:04:01 +0000465
Tim Peters6d6c1a32001-08-02 04:15:00 +0000466 if (type->tp_itemsize == 0)
467 PyObject_INIT(obj, type);
468 else
469 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000470
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471 if (PyType_IS_GC(type))
Neil Schemenauerc806c882001-08-29 23:54:54 +0000472 _PyObject_GC_TRACK(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000473 return obj;
474}
475
476PyObject *
477PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
478{
479 return type->tp_alloc(type, 0);
480}
481
Guido van Rossum9475a232001-10-05 20:51:39 +0000482/* Helpers for subtyping */
483
484static int
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000485traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
486{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000487 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000488 PyMemberDef *mp;
489
490 n = type->ob_size;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000491 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000492 for (i = 0; i < n; i++, mp++) {
493 if (mp->type == T_OBJECT_EX) {
494 char *addr = (char *)self + mp->offset;
495 PyObject *obj = *(PyObject **)addr;
496 if (obj != NULL) {
497 int err = visit(obj, arg);
498 if (err)
499 return err;
500 }
501 }
502 }
503 return 0;
504}
505
506static int
Guido van Rossum9475a232001-10-05 20:51:39 +0000507subtype_traverse(PyObject *self, visitproc visit, void *arg)
508{
509 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000510 traverseproc basetraverse;
Guido van Rossum9475a232001-10-05 20:51:39 +0000511
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000512 /* Find the nearest base with a different tp_traverse,
513 and traverse slots while we're at it */
Guido van Rossum9475a232001-10-05 20:51:39 +0000514 type = self->ob_type;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000515 base = type;
516 while ((basetraverse = base->tp_traverse) == subtype_traverse) {
517 if (base->ob_size) {
518 int err = traverse_slots(base, self, visit, arg);
519 if (err)
520 return err;
521 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000522 base = base->tp_base;
523 assert(base);
524 }
525
526 if (type->tp_dictoffset != base->tp_dictoffset) {
527 PyObject **dictptr = _PyObject_GetDictPtr(self);
528 if (dictptr && *dictptr) {
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000529 int err = visit(*dictptr, arg);
Guido van Rossum9475a232001-10-05 20:51:39 +0000530 if (err)
531 return err;
532 }
533 }
534
Guido van Rossuma3862092002-06-10 15:24:42 +0000535 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
536 /* For a heaptype, the instances count as references
537 to the type. Traverse the type so the collector
538 can find cycles involving this link. */
539 int err = visit((PyObject *)type, arg);
540 if (err)
541 return err;
542 }
543
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000544 if (basetraverse)
545 return basetraverse(self, visit, arg);
546 return 0;
547}
548
549static void
550clear_slots(PyTypeObject *type, PyObject *self)
551{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000553 PyMemberDef *mp;
554
555 n = type->ob_size;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000556 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000557 for (i = 0; i < n; i++, mp++) {
558 if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
559 char *addr = (char *)self + mp->offset;
560 PyObject *obj = *(PyObject **)addr;
561 if (obj != NULL) {
562 Py_DECREF(obj);
563 *(PyObject **)addr = NULL;
564 }
565 }
566 }
567}
568
569static int
570subtype_clear(PyObject *self)
571{
572 PyTypeObject *type, *base;
573 inquiry baseclear;
574
575 /* Find the nearest base with a different tp_clear
576 and clear slots while we're at it */
577 type = self->ob_type;
578 base = type;
579 while ((baseclear = base->tp_clear) == subtype_clear) {
580 if (base->ob_size)
581 clear_slots(base, self);
582 base = base->tp_base;
583 assert(base);
584 }
585
Guido van Rossuma3862092002-06-10 15:24:42 +0000586 /* There's no need to clear the instance dict (if any);
587 the collector will call its tp_clear handler. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000588
589 if (baseclear)
590 return baseclear(self);
Guido van Rossum9475a232001-10-05 20:51:39 +0000591 return 0;
592}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000593
594static void
595subtype_dealloc(PyObject *self)
596{
Guido van Rossum14227b42001-12-06 02:35:58 +0000597 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000598 destructor basedealloc;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599
Guido van Rossum22b13872002-08-06 21:41:44 +0000600 /* Extract the type; we expect it to be a heap type */
601 type = self->ob_type;
602 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000603
Guido van Rossum22b13872002-08-06 21:41:44 +0000604 /* Test whether the type has GC exactly once */
605
606 if (!PyType_IS_GC(type)) {
607 /* It's really rare to find a dynamic type that doesn't have
608 GC; it can only happen when deriving from 'object' and not
609 adding any slots or instance variables. This allows
610 certain simplifications: there's no need to call
611 clear_slots(), or DECREF the dict, or clear weakrefs. */
612
613 /* Maybe call finalizer; exit early if resurrected */
Guido van Rossumfebd61d2002-08-08 20:55:20 +0000614 if (type->tp_del) {
615 type->tp_del(self);
616 if (self->ob_refcnt > 0)
617 return;
618 }
Guido van Rossum22b13872002-08-06 21:41:44 +0000619
620 /* Find the nearest base with a different tp_dealloc */
621 base = type;
622 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
623 assert(base->ob_size == 0);
624 base = base->tp_base;
625 assert(base);
626 }
627
628 /* Call the base tp_dealloc() */
629 assert(basedealloc);
630 basedealloc(self);
631
632 /* Can't reference self beyond this point */
633 Py_DECREF(type);
634
635 /* Done */
636 return;
637 }
638
639 /* We get here only if the type has GC */
640
641 /* UnTrack and re-Track around the trashcan macro, alas */
Andrew M. Kuchlingc9172d32003-02-06 15:22:49 +0000642 /* See explanation at end of function for full disclosure */
Guido van Rossum0906e072002-08-07 20:42:09 +0000643 PyObject_GC_UnTrack(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000644 ++_PyTrash_delete_nesting;
Guido van Rossum22b13872002-08-06 21:41:44 +0000645 Py_TRASHCAN_SAFE_BEGIN(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000646 --_PyTrash_delete_nesting;
Tim Petersf7f9e992003-11-13 21:59:32 +0000647 /* DO NOT restore GC tracking at this point. weakref callbacks
648 * (if any, and whether directly here or indirectly in something we
649 * call) may trigger GC, and if self is tracked at that point, it
650 * will look like trash to GC and GC will try to delete self again.
Tim Petersadd09b42003-11-12 20:43:28 +0000651 */
Guido van Rossum22b13872002-08-06 21:41:44 +0000652
Guido van Rossum59195fd2003-06-13 20:54:40 +0000653 /* Find the nearest base with a different tp_dealloc */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000654 base = type;
655 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656 base = base->tp_base;
657 assert(base);
Guido van Rossum14227b42001-12-06 02:35:58 +0000658 }
659
Guido van Rossum1987c662003-05-29 14:29:23 +0000660 /* If we added a weaklist, we clear it. Do this *before* calling
Guido van Rossum59195fd2003-06-13 20:54:40 +0000661 the finalizer (__del__), clearing slots, or clearing the instance
662 dict. */
663
Guido van Rossum1987c662003-05-29 14:29:23 +0000664 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
665 PyObject_ClearWeakRefs(self);
666
667 /* Maybe call finalizer; exit early if resurrected */
668 if (type->tp_del) {
Tim Petersf7f9e992003-11-13 21:59:32 +0000669 _PyObject_GC_TRACK(self);
Guido van Rossum1987c662003-05-29 14:29:23 +0000670 type->tp_del(self);
671 if (self->ob_refcnt > 0)
Tim Petersf7f9e992003-11-13 21:59:32 +0000672 goto endlabel; /* resurrected */
673 else
674 _PyObject_GC_UNTRACK(self);
Guido van Rossum1987c662003-05-29 14:29:23 +0000675 }
676
Guido van Rossum59195fd2003-06-13 20:54:40 +0000677 /* Clear slots up to the nearest base with a different tp_dealloc */
678 base = type;
679 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
680 if (base->ob_size)
681 clear_slots(base, self);
682 base = base->tp_base;
683 assert(base);
684 }
685
Tim Peters6d6c1a32001-08-02 04:15:00 +0000686 /* If we added a dict, DECREF it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000687 if (type->tp_dictoffset && !base->tp_dictoffset) {
688 PyObject **dictptr = _PyObject_GetDictPtr(self);
689 if (dictptr != NULL) {
690 PyObject *dict = *dictptr;
691 if (dict != NULL) {
692 Py_DECREF(dict);
693 *dictptr = NULL;
694 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000695 }
696 }
697
Tim Peters0bd743c2003-11-13 22:50:00 +0000698 /* Call the base tp_dealloc(); first retrack self if
699 * basedealloc knows about gc.
700 */
701 if (PyType_IS_GC(base))
702 _PyObject_GC_TRACK(self);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000703 assert(basedealloc);
704 basedealloc(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000705
706 /* Can't reference self beyond this point */
Guido van Rossum22b13872002-08-06 21:41:44 +0000707 Py_DECREF(type);
708
Guido van Rossum0906e072002-08-07 20:42:09 +0000709 endlabel:
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000710 ++_PyTrash_delete_nesting;
Guido van Rossum22b13872002-08-06 21:41:44 +0000711 Py_TRASHCAN_SAFE_END(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000712 --_PyTrash_delete_nesting;
713
714 /* Explanation of the weirdness around the trashcan macros:
715
716 Q. What do the trashcan macros do?
717
718 A. Read the comment titled "Trashcan mechanism" in object.h.
719 For one, this explains why there must be a call to GC-untrack
720 before the trashcan begin macro. Without understanding the
721 trashcan code, the answers to the following questions don't make
722 sense.
723
724 Q. Why do we GC-untrack before the trashcan and then immediately
725 GC-track again afterward?
726
727 A. In the case that the base class is GC-aware, the base class
728 probably GC-untracks the object. If it does that using the
729 UNTRACK macro, this will crash when the object is already
730 untracked. Because we don't know what the base class does, the
731 only safe thing is to make sure the object is tracked when we
732 call the base class dealloc. But... The trashcan begin macro
733 requires that the object is *untracked* before it is called. So
734 the dance becomes:
735
736 GC untrack
737 trashcan begin
738 GC track
739
Tim Petersf7f9e992003-11-13 21:59:32 +0000740 Q. Why did the last question say "immediately GC-track again"?
741 It's nowhere near immediately.
742
743 A. Because the code *used* to re-track immediately. Bad Idea.
744 self has a refcount of 0, and if gc ever gets its hands on it
745 (which can happen if any weakref callback gets invoked), it
746 looks like trash to gc too, and gc also tries to delete self
747 then. But we're already deleting self. Double dealloction is
748 a subtle disaster.
749
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000750 Q. Why the bizarre (net-zero) manipulation of
751 _PyTrash_delete_nesting around the trashcan macros?
752
753 A. Some base classes (e.g. list) also use the trashcan mechanism.
754 The following scenario used to be possible:
755
756 - suppose the trashcan level is one below the trashcan limit
757
758 - subtype_dealloc() is called
759
760 - the trashcan limit is not yet reached, so the trashcan level
761 is incremented and the code between trashcan begin and end is
762 executed
763
764 - this destroys much of the object's contents, including its
765 slots and __dict__
766
767 - basedealloc() is called; this is really list_dealloc(), or
768 some other type which also uses the trashcan macros
769
770 - the trashcan limit is now reached, so the object is put on the
771 trashcan's to-be-deleted-later list
772
773 - basedealloc() returns
774
775 - subtype_dealloc() decrefs the object's type
776
777 - subtype_dealloc() returns
778
779 - later, the trashcan code starts deleting the objects from its
780 to-be-deleted-later list
781
782 - subtype_dealloc() is called *AGAIN* for the same object
783
784 - at the very least (if the destroyed slots and __dict__ don't
785 cause problems) the object's type gets decref'ed a second
786 time, which is *BAD*!!!
787
788 The remedy is to make sure that if the code between trashcan
789 begin and end in subtype_dealloc() is called, the code between
790 trashcan begin and end in basedealloc() will also be called.
791 This is done by decrementing the level after passing into the
792 trashcan block, and incrementing it just before leaving the
793 block.
794
795 But now it's possible that a chain of objects consisting solely
796 of objects whose deallocator is subtype_dealloc() will defeat
797 the trashcan mechanism completely: the decremented level means
798 that the effective level never reaches the limit. Therefore, we
799 *increment* the level *before* entering the trashcan block, and
800 matchingly decrement it after leaving. This means the trashcan
801 code will trigger a little early, but that's no big deal.
802
803 Q. Are there any live examples of code in need of all this
804 complexity?
805
806 A. Yes. See SF bug 668433 for code that crashed (when Python was
807 compiled in debug mode) before the trashcan level manipulations
808 were added. For more discussion, see SF patches 581742, 575073
809 and bug 574207.
810 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000811}
812
Jeremy Hylton938ace62002-07-17 16:30:39 +0000813static PyTypeObject *solid_base(PyTypeObject *type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000814
Tim Peters6d6c1a32001-08-02 04:15:00 +0000815/* type test with subclassing support */
816
817int
818PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
819{
820 PyObject *mro;
821
Guido van Rossum9478d072001-09-07 18:52:13 +0000822 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
823 return b == a || b == &PyBaseObject_Type;
824
Tim Peters6d6c1a32001-08-02 04:15:00 +0000825 mro = a->tp_mro;
826 if (mro != NULL) {
827 /* Deal with multiple inheritance without recursion
828 by walking the MRO tuple */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000829 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000830 assert(PyTuple_Check(mro));
831 n = PyTuple_GET_SIZE(mro);
832 for (i = 0; i < n; i++) {
833 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
834 return 1;
835 }
836 return 0;
837 }
838 else {
839 /* a is not completely initilized yet; follow tp_base */
840 do {
841 if (a == b)
842 return 1;
843 a = a->tp_base;
844 } while (a != NULL);
845 return b == &PyBaseObject_Type;
846 }
847}
848
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000849/* Internal routines to do a method lookup in the type
Guido van Rossum60718732001-08-28 17:47:51 +0000850 without looking in the instance dictionary
851 (so we can't use PyObject_GetAttr) but still binding
852 it to the instance. The arguments are the object,
853 the method name as a C string, and the address of a
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000854 static variable used to cache the interned Python string.
855
856 Two variants:
857
858 - lookup_maybe() returns NULL without raising an exception
859 when the _PyType_Lookup() call fails;
860
861 - lookup_method() always raises an exception upon errors.
862*/
Guido van Rossum60718732001-08-28 17:47:51 +0000863
864static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000865lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
Guido van Rossum60718732001-08-28 17:47:51 +0000866{
867 PyObject *res;
868
869 if (*attrobj == NULL) {
870 *attrobj = PyString_InternFromString(attrstr);
871 if (*attrobj == NULL)
872 return NULL;
873 }
874 res = _PyType_Lookup(self->ob_type, *attrobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000875 if (res != NULL) {
Guido van Rossum60718732001-08-28 17:47:51 +0000876 descrgetfunc f;
877 if ((f = res->ob_type->tp_descr_get) == NULL)
878 Py_INCREF(res);
879 else
880 res = f(res, self, (PyObject *)(self->ob_type));
881 }
882 return res;
883}
884
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000885static PyObject *
886lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
887{
888 PyObject *res = lookup_maybe(self, attrstr, attrobj);
889 if (res == NULL && !PyErr_Occurred())
890 PyErr_SetObject(PyExc_AttributeError, *attrobj);
891 return res;
892}
893
Guido van Rossum2730b132001-08-28 18:22:14 +0000894/* A variation of PyObject_CallMethod that uses lookup_method()
895 instead of PyObject_GetAttrString(). This uses the same convention
896 as lookup_method to cache the interned name string object. */
897
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000898static PyObject *
Guido van Rossum2730b132001-08-28 18:22:14 +0000899call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
900{
901 va_list va;
902 PyObject *args, *func = 0, *retval;
Guido van Rossum2730b132001-08-28 18:22:14 +0000903 va_start(va, format);
904
Guido van Rossumda21c012001-10-03 00:50:18 +0000905 func = lookup_maybe(o, name, nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000906 if (func == NULL) {
907 va_end(va);
908 if (!PyErr_Occurred())
Guido van Rossumda21c012001-10-03 00:50:18 +0000909 PyErr_SetObject(PyExc_AttributeError, *nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000910 return NULL;
911 }
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000912
913 if (format && *format)
914 args = Py_VaBuildValue(format, va);
915 else
916 args = PyTuple_New(0);
917
918 va_end(va);
919
920 if (args == NULL)
921 return NULL;
922
923 assert(PyTuple_Check(args));
924 retval = PyObject_Call(func, args, NULL);
925
926 Py_DECREF(args);
927 Py_DECREF(func);
928
929 return retval;
930}
931
932/* Clone of call_method() that returns NotImplemented when the lookup fails. */
933
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000934static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000935call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
936{
937 va_list va;
938 PyObject *args, *func = 0, *retval;
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000939 va_start(va, format);
940
Guido van Rossumda21c012001-10-03 00:50:18 +0000941 func = lookup_maybe(o, name, nameobj);
Guido van Rossum2730b132001-08-28 18:22:14 +0000942 if (func == NULL) {
943 va_end(va);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000944 if (!PyErr_Occurred()) {
945 Py_INCREF(Py_NotImplemented);
946 return Py_NotImplemented;
947 }
Guido van Rossum717ce002001-09-14 16:58:08 +0000948 return NULL;
Guido van Rossum2730b132001-08-28 18:22:14 +0000949 }
950
951 if (format && *format)
952 args = Py_VaBuildValue(format, va);
953 else
954 args = PyTuple_New(0);
955
956 va_end(va);
957
Guido van Rossum717ce002001-09-14 16:58:08 +0000958 if (args == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +0000959 return NULL;
960
Guido van Rossum717ce002001-09-14 16:58:08 +0000961 assert(PyTuple_Check(args));
962 retval = PyObject_Call(func, args, NULL);
Guido van Rossum2730b132001-08-28 18:22:14 +0000963
964 Py_DECREF(args);
965 Py_DECREF(func);
966
967 return retval;
968}
969
Tim Petersa91e9642001-11-14 23:32:33 +0000970static int
971fill_classic_mro(PyObject *mro, PyObject *cls)
972{
973 PyObject *bases, *base;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000974 Py_ssize_t i, n;
Tim Petersa91e9642001-11-14 23:32:33 +0000975
976 assert(PyList_Check(mro));
977 assert(PyClass_Check(cls));
978 i = PySequence_Contains(mro, cls);
979 if (i < 0)
980 return -1;
981 if (!i) {
982 if (PyList_Append(mro, cls) < 0)
983 return -1;
984 }
985 bases = ((PyClassObject *)cls)->cl_bases;
986 assert(bases && PyTuple_Check(bases));
987 n = PyTuple_GET_SIZE(bases);
988 for (i = 0; i < n; i++) {
989 base = PyTuple_GET_ITEM(bases, i);
990 if (fill_classic_mro(mro, base) < 0)
991 return -1;
992 }
993 return 0;
994}
995
996static PyObject *
997classic_mro(PyObject *cls)
998{
999 PyObject *mro;
1000
1001 assert(PyClass_Check(cls));
1002 mro = PyList_New(0);
1003 if (mro != NULL) {
1004 if (fill_classic_mro(mro, cls) == 0)
1005 return mro;
1006 Py_DECREF(mro);
1007 }
1008 return NULL;
1009}
1010
Tim Petersea7f75d2002-12-07 21:39:16 +00001011/*
Guido van Rossum1f121312002-11-14 19:49:16 +00001012 Method resolution order algorithm C3 described in
1013 "A Monotonic Superclass Linearization for Dylan",
1014 by Kim Barrett, Bob Cassel, Paul Haahr,
Tim Petersea7f75d2002-12-07 21:39:16 +00001015 David A. Moon, Keith Playford, and P. Tucker Withington.
Guido van Rossum1f121312002-11-14 19:49:16 +00001016 (OOPSLA 1996)
1017
Guido van Rossum98f33732002-11-25 21:36:54 +00001018 Some notes about the rules implied by C3:
1019
Tim Petersea7f75d2002-12-07 21:39:16 +00001020 No duplicate bases.
Guido van Rossum98f33732002-11-25 21:36:54 +00001021 It isn't legal to repeat a class in a list of base classes.
1022
1023 The next three properties are the 3 constraints in "C3".
1024
Tim Petersea7f75d2002-12-07 21:39:16 +00001025 Local precendece order.
Guido van Rossum98f33732002-11-25 21:36:54 +00001026 If A precedes B in C's MRO, then A will precede B in the MRO of all
1027 subclasses of C.
1028
1029 Monotonicity.
1030 The MRO of a class must be an extension without reordering of the
1031 MRO of each of its superclasses.
1032
1033 Extended Precedence Graph (EPG).
1034 Linearization is consistent if there is a path in the EPG from
1035 each class to all its successors in the linearization. See
1036 the paper for definition of EPG.
Guido van Rossum1f121312002-11-14 19:49:16 +00001037 */
1038
Tim Petersea7f75d2002-12-07 21:39:16 +00001039static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001040tail_contains(PyObject *list, int whence, PyObject *o) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001041 Py_ssize_t j, size;
Guido van Rossum1f121312002-11-14 19:49:16 +00001042 size = PyList_GET_SIZE(list);
1043
1044 for (j = whence+1; j < size; j++) {
1045 if (PyList_GET_ITEM(list, j) == o)
1046 return 1;
1047 }
1048 return 0;
1049}
1050
Guido van Rossum98f33732002-11-25 21:36:54 +00001051static PyObject *
1052class_name(PyObject *cls)
1053{
1054 PyObject *name = PyObject_GetAttrString(cls, "__name__");
1055 if (name == NULL) {
1056 PyErr_Clear();
1057 Py_XDECREF(name);
1058 name = PyObject_Repr(cls);
1059 }
1060 if (name == NULL)
1061 return NULL;
1062 if (!PyString_Check(name)) {
1063 Py_DECREF(name);
1064 return NULL;
1065 }
1066 return name;
1067}
1068
1069static int
1070check_duplicates(PyObject *list)
1071{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001072 Py_ssize_t i, j, n;
Guido van Rossum98f33732002-11-25 21:36:54 +00001073 /* Let's use a quadratic time algorithm,
1074 assuming that the bases lists is short.
1075 */
1076 n = PyList_GET_SIZE(list);
1077 for (i = 0; i < n; i++) {
1078 PyObject *o = PyList_GET_ITEM(list, i);
1079 for (j = i + 1; j < n; j++) {
1080 if (PyList_GET_ITEM(list, j) == o) {
1081 o = class_name(o);
1082 PyErr_Format(PyExc_TypeError,
1083 "duplicate base class %s",
1084 o ? PyString_AS_STRING(o) : "?");
1085 Py_XDECREF(o);
1086 return -1;
1087 }
1088 }
1089 }
1090 return 0;
1091}
1092
1093/* Raise a TypeError for an MRO order disagreement.
1094
1095 It's hard to produce a good error message. In the absence of better
1096 insight into error reporting, report the classes that were candidates
1097 to be put next into the MRO. There is some conflict between the
1098 order in which they should be put in the MRO, but it's hard to
1099 diagnose what constraint can't be satisfied.
1100*/
1101
1102static void
1103set_mro_error(PyObject *to_merge, int *remain)
1104{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105 Py_ssize_t i, n, off, to_merge_size;
Guido van Rossum98f33732002-11-25 21:36:54 +00001106 char buf[1000];
1107 PyObject *k, *v;
1108 PyObject *set = PyDict_New();
Georg Brandl5c170fd2006-03-17 19:03:25 +00001109 if (!set) return;
Guido van Rossum98f33732002-11-25 21:36:54 +00001110
1111 to_merge_size = PyList_GET_SIZE(to_merge);
1112 for (i = 0; i < to_merge_size; i++) {
1113 PyObject *L = PyList_GET_ITEM(to_merge, i);
1114 if (remain[i] < PyList_GET_SIZE(L)) {
1115 PyObject *c = PyList_GET_ITEM(L, remain[i]);
Georg Brandl5c170fd2006-03-17 19:03:25 +00001116 if (PyDict_SetItem(set, c, Py_None) < 0) {
1117 Py_DECREF(set);
Guido van Rossum98f33732002-11-25 21:36:54 +00001118 return;
Georg Brandl5c170fd2006-03-17 19:03:25 +00001119 }
Guido van Rossum98f33732002-11-25 21:36:54 +00001120 }
1121 }
1122 n = PyDict_Size(set);
1123
Raymond Hettingerf394df42003-04-06 19:13:41 +00001124 off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
1125consistent method resolution\norder (MRO) for bases");
Guido van Rossum98f33732002-11-25 21:36:54 +00001126 i = 0;
1127 while (PyDict_Next(set, &i, &k, &v) && off < sizeof(buf)) {
1128 PyObject *name = class_name(k);
1129 off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s",
1130 name ? PyString_AS_STRING(name) : "?");
1131 Py_XDECREF(name);
1132 if (--n && off+1 < sizeof(buf)) {
1133 buf[off++] = ',';
1134 buf[off] = '\0';
1135 }
1136 }
1137 PyErr_SetString(PyExc_TypeError, buf);
1138 Py_DECREF(set);
1139}
1140
Tim Petersea7f75d2002-12-07 21:39:16 +00001141static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001142pmerge(PyObject *acc, PyObject* to_merge) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001143 Py_ssize_t i, j, to_merge_size, empty_cnt;
Guido van Rossum1f121312002-11-14 19:49:16 +00001144 int *remain;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001145 int ok;
Tim Petersea7f75d2002-12-07 21:39:16 +00001146
Guido van Rossum1f121312002-11-14 19:49:16 +00001147 to_merge_size = PyList_GET_SIZE(to_merge);
1148
Guido van Rossum98f33732002-11-25 21:36:54 +00001149 /* remain stores an index into each sublist of to_merge.
1150 remain[i] is the index of the next base in to_merge[i]
1151 that is not included in acc.
1152 */
Guido van Rossum1f121312002-11-14 19:49:16 +00001153 remain = PyMem_MALLOC(SIZEOF_INT*to_merge_size);
1154 if (remain == NULL)
1155 return -1;
1156 for (i = 0; i < to_merge_size; i++)
1157 remain[i] = 0;
1158
1159 again:
1160 empty_cnt = 0;
1161 for (i = 0; i < to_merge_size; i++) {
1162 PyObject *candidate;
Tim Petersea7f75d2002-12-07 21:39:16 +00001163
Guido van Rossum1f121312002-11-14 19:49:16 +00001164 PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
1165
1166 if (remain[i] >= PyList_GET_SIZE(cur_list)) {
1167 empty_cnt++;
1168 continue;
1169 }
1170
Guido van Rossum98f33732002-11-25 21:36:54 +00001171 /* Choose next candidate for MRO.
1172
1173 The input sequences alone can determine the choice.
1174 If not, choose the class which appears in the MRO
1175 of the earliest direct superclass of the new class.
1176 */
1177
Guido van Rossum1f121312002-11-14 19:49:16 +00001178 candidate = PyList_GET_ITEM(cur_list, remain[i]);
1179 for (j = 0; j < to_merge_size; j++) {
1180 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
Guido van Rossum98f33732002-11-25 21:36:54 +00001181 if (tail_contains(j_lst, remain[j], candidate)) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001182 goto skip; /* continue outer loop */
Guido van Rossum98f33732002-11-25 21:36:54 +00001183 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001184 }
1185 ok = PyList_Append(acc, candidate);
1186 if (ok < 0) {
1187 PyMem_Free(remain);
1188 return -1;
1189 }
1190 for (j = 0; j < to_merge_size; j++) {
1191 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
Guido van Rossum768158c2002-12-31 16:33:01 +00001192 if (remain[j] < PyList_GET_SIZE(j_lst) &&
1193 PyList_GET_ITEM(j_lst, remain[j]) == candidate) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001194 remain[j]++;
1195 }
1196 }
1197 goto again;
Tim Peters9a6b8d82002-11-14 23:22:33 +00001198 skip: ;
Guido van Rossum1f121312002-11-14 19:49:16 +00001199 }
1200
Guido van Rossum98f33732002-11-25 21:36:54 +00001201 if (empty_cnt == to_merge_size) {
1202 PyMem_FREE(remain);
Guido van Rossum1f121312002-11-14 19:49:16 +00001203 return 0;
Guido van Rossum98f33732002-11-25 21:36:54 +00001204 }
1205 set_mro_error(to_merge, remain);
1206 PyMem_FREE(remain);
Guido van Rossum1f121312002-11-14 19:49:16 +00001207 return -1;
1208}
1209
Tim Peters6d6c1a32001-08-02 04:15:00 +00001210static PyObject *
1211mro_implementation(PyTypeObject *type)
1212{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001213 Py_ssize_t i, n;
1214 int ok;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001215 PyObject *bases, *result;
Guido van Rossum1f121312002-11-14 19:49:16 +00001216 PyObject *to_merge, *bases_aslist;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001217
Guido van Rossum63517572002-06-18 16:44:57 +00001218 if(type->tp_dict == NULL) {
1219 if(PyType_Ready(type) < 0)
1220 return NULL;
1221 }
1222
Guido van Rossum98f33732002-11-25 21:36:54 +00001223 /* Find a superclass linearization that honors the constraints
1224 of the explicit lists of bases and the constraints implied by
Tim Petersea7f75d2002-12-07 21:39:16 +00001225 each base class.
Guido van Rossum98f33732002-11-25 21:36:54 +00001226
1227 to_merge is a list of lists, where each list is a superclass
1228 linearization implied by a base class. The last element of
1229 to_merge is the declared list of bases.
1230 */
1231
Tim Peters6d6c1a32001-08-02 04:15:00 +00001232 bases = type->tp_bases;
1233 n = PyTuple_GET_SIZE(bases);
Guido van Rossum1f121312002-11-14 19:49:16 +00001234
1235 to_merge = PyList_New(n+1);
1236 if (to_merge == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001237 return NULL;
Guido van Rossum1f121312002-11-14 19:49:16 +00001238
Tim Peters6d6c1a32001-08-02 04:15:00 +00001239 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001240 PyObject *base = PyTuple_GET_ITEM(bases, i);
1241 PyObject *parentMRO;
1242 if (PyType_Check(base))
1243 parentMRO = PySequence_List(
1244 ((PyTypeObject*)base)->tp_mro);
1245 else
1246 parentMRO = classic_mro(base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001247 if (parentMRO == NULL) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001248 Py_DECREF(to_merge);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001249 return NULL;
Guido van Rossum1f121312002-11-14 19:49:16 +00001250 }
1251
1252 PyList_SET_ITEM(to_merge, i, parentMRO);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001253 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001254
1255 bases_aslist = PySequence_List(bases);
1256 if (bases_aslist == NULL) {
1257 Py_DECREF(to_merge);
1258 return NULL;
1259 }
Guido van Rossum98f33732002-11-25 21:36:54 +00001260 /* This is just a basic sanity check. */
1261 if (check_duplicates(bases_aslist) < 0) {
1262 Py_DECREF(to_merge);
1263 Py_DECREF(bases_aslist);
1264 return NULL;
1265 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001266 PyList_SET_ITEM(to_merge, n, bases_aslist);
1267
1268 result = Py_BuildValue("[O]", (PyObject *)type);
1269 if (result == NULL) {
1270 Py_DECREF(to_merge);
1271 return NULL;
1272 }
1273
1274 ok = pmerge(result, to_merge);
1275 Py_DECREF(to_merge);
1276 if (ok < 0) {
1277 Py_DECREF(result);
1278 return NULL;
1279 }
1280
Tim Peters6d6c1a32001-08-02 04:15:00 +00001281 return result;
1282}
1283
1284static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001285mro_external(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001286{
1287 PyTypeObject *type = (PyTypeObject *)self;
1288
Tim Peters6d6c1a32001-08-02 04:15:00 +00001289 return mro_implementation(type);
1290}
1291
1292static int
1293mro_internal(PyTypeObject *type)
1294{
1295 PyObject *mro, *result, *tuple;
Armin Rigo037d1e02005-12-29 17:07:39 +00001296 int checkit = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001297
1298 if (type->ob_type == &PyType_Type) {
1299 result = mro_implementation(type);
1300 }
1301 else {
Guido van Rossum60718732001-08-28 17:47:51 +00001302 static PyObject *mro_str;
Armin Rigo037d1e02005-12-29 17:07:39 +00001303 checkit = 1;
Guido van Rossum60718732001-08-28 17:47:51 +00001304 mro = lookup_method((PyObject *)type, "mro", &mro_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001305 if (mro == NULL)
1306 return -1;
1307 result = PyObject_CallObject(mro, NULL);
1308 Py_DECREF(mro);
1309 }
1310 if (result == NULL)
1311 return -1;
1312 tuple = PySequence_Tuple(result);
1313 Py_DECREF(result);
Armin Rigo037d1e02005-12-29 17:07:39 +00001314 if (tuple == NULL)
1315 return -1;
1316 if (checkit) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001317 Py_ssize_t i, len;
Armin Rigo037d1e02005-12-29 17:07:39 +00001318 PyObject *cls;
1319 PyTypeObject *solid;
1320
1321 solid = solid_base(type);
1322
1323 len = PyTuple_GET_SIZE(tuple);
1324
1325 for (i = 0; i < len; i++) {
1326 PyTypeObject *t;
1327 cls = PyTuple_GET_ITEM(tuple, i);
1328 if (PyClass_Check(cls))
1329 continue;
1330 else if (!PyType_Check(cls)) {
1331 PyErr_Format(PyExc_TypeError,
1332 "mro() returned a non-class ('%.500s')",
1333 cls->ob_type->tp_name);
Neal Norwitz50bf51a2006-01-02 02:46:54 +00001334 Py_DECREF(tuple);
Armin Rigo037d1e02005-12-29 17:07:39 +00001335 return -1;
1336 }
1337 t = (PyTypeObject*)cls;
1338 if (!PyType_IsSubtype(solid, solid_base(t))) {
1339 PyErr_Format(PyExc_TypeError,
1340 "mro() returned base with unsuitable layout ('%.500s')",
1341 t->tp_name);
Neal Norwitz50bf51a2006-01-02 02:46:54 +00001342 Py_DECREF(tuple);
Armin Rigo037d1e02005-12-29 17:07:39 +00001343 return -1;
1344 }
1345 }
1346 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001347 type->tp_mro = tuple;
1348 return 0;
1349}
1350
1351
1352/* Calculate the best base amongst multiple base classes.
1353 This is the first one that's on the path to the "solid base". */
1354
1355static PyTypeObject *
1356best_base(PyObject *bases)
1357{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001358 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001359 PyTypeObject *base, *winner, *candidate, *base_i;
Tim Petersa91e9642001-11-14 23:32:33 +00001360 PyObject *base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001361
1362 assert(PyTuple_Check(bases));
1363 n = PyTuple_GET_SIZE(bases);
1364 assert(n > 0);
Tim Petersa91e9642001-11-14 23:32:33 +00001365 base = NULL;
1366 winner = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001367 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001368 base_proto = PyTuple_GET_ITEM(bases, i);
1369 if (PyClass_Check(base_proto))
1370 continue;
1371 if (!PyType_Check(base_proto)) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001372 PyErr_SetString(
1373 PyExc_TypeError,
1374 "bases must be types");
1375 return NULL;
1376 }
Tim Petersa91e9642001-11-14 23:32:33 +00001377 base_i = (PyTypeObject *)base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001378 if (base_i->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001379 if (PyType_Ready(base_i) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001380 return NULL;
1381 }
1382 candidate = solid_base(base_i);
Tim Petersa91e9642001-11-14 23:32:33 +00001383 if (winner == NULL) {
1384 winner = candidate;
1385 base = base_i;
1386 }
1387 else if (PyType_IsSubtype(winner, candidate))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001388 ;
1389 else if (PyType_IsSubtype(candidate, winner)) {
1390 winner = candidate;
1391 base = base_i;
1392 }
1393 else {
1394 PyErr_SetString(
1395 PyExc_TypeError,
1396 "multiple bases have "
1397 "instance lay-out conflict");
1398 return NULL;
1399 }
1400 }
Guido van Rossume54616c2001-12-14 04:19:56 +00001401 if (base == NULL)
1402 PyErr_SetString(PyExc_TypeError,
1403 "a new-style class can't have only classic bases");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001404 return base;
1405}
1406
1407static int
1408extra_ivars(PyTypeObject *type, PyTypeObject *base)
1409{
Neil Schemenauerc806c882001-08-29 23:54:54 +00001410 size_t t_size = type->tp_basicsize;
1411 size_t b_size = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001412
Guido van Rossum9676b222001-08-17 20:32:36 +00001413 assert(t_size >= b_size); /* Else type smaller than base! */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001414 if (type->tp_itemsize || base->tp_itemsize) {
1415 /* If itemsize is involved, stricter rules */
1416 return t_size != b_size ||
1417 type->tp_itemsize != base->tp_itemsize;
1418 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001419 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
1420 type->tp_weaklistoffset + sizeof(PyObject *) == t_size)
1421 t_size -= sizeof(PyObject *);
1422 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
1423 type->tp_dictoffset + sizeof(PyObject *) == t_size)
1424 t_size -= sizeof(PyObject *);
1425
1426 return t_size != b_size;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001427}
1428
1429static PyTypeObject *
1430solid_base(PyTypeObject *type)
1431{
1432 PyTypeObject *base;
1433
1434 if (type->tp_base)
1435 base = solid_base(type->tp_base);
1436 else
1437 base = &PyBaseObject_Type;
1438 if (extra_ivars(type, base))
1439 return type;
1440 else
1441 return base;
1442}
1443
Jeremy Hylton938ace62002-07-17 16:30:39 +00001444static void object_dealloc(PyObject *);
1445static int object_init(PyObject *, PyObject *, PyObject *);
1446static int update_slot(PyTypeObject *, PyObject *);
1447static void fixup_slot_dispatchers(PyTypeObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001448
1449static PyObject *
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001450subtype_dict(PyObject *obj, void *context)
1451{
1452 PyObject **dictptr = _PyObject_GetDictPtr(obj);
1453 PyObject *dict;
1454
1455 if (dictptr == NULL) {
1456 PyErr_SetString(PyExc_AttributeError,
1457 "This object has no __dict__");
1458 return NULL;
1459 }
1460 dict = *dictptr;
Guido van Rossum3926a632001-09-25 16:25:58 +00001461 if (dict == NULL)
1462 *dictptr = dict = PyDict_New();
1463 Py_XINCREF(dict);
1464 return dict;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001465}
1466
Guido van Rossum6661be32001-10-26 04:26:12 +00001467static int
1468subtype_setdict(PyObject *obj, PyObject *value, void *context)
1469{
1470 PyObject **dictptr = _PyObject_GetDictPtr(obj);
1471 PyObject *dict;
1472
1473 if (dictptr == NULL) {
1474 PyErr_SetString(PyExc_AttributeError,
1475 "This object has no __dict__");
1476 return -1;
1477 }
Guido van Rossumd331cb52001-12-05 19:46:42 +00001478 if (value != NULL && !PyDict_Check(value)) {
Guido van Rossum6661be32001-10-26 04:26:12 +00001479 PyErr_SetString(PyExc_TypeError,
1480 "__dict__ must be set to a dictionary");
1481 return -1;
1482 }
1483 dict = *dictptr;
Guido van Rossumd331cb52001-12-05 19:46:42 +00001484 Py_XINCREF(value);
Guido van Rossum6661be32001-10-26 04:26:12 +00001485 *dictptr = value;
1486 Py_XDECREF(dict);
1487 return 0;
1488}
1489
Guido van Rossumad47da02002-08-12 19:05:44 +00001490static PyObject *
1491subtype_getweakref(PyObject *obj, void *context)
1492{
1493 PyObject **weaklistptr;
1494 PyObject *result;
1495
1496 if (obj->ob_type->tp_weaklistoffset == 0) {
1497 PyErr_SetString(PyExc_AttributeError,
1498 "This object has no __weaklist__");
1499 return NULL;
1500 }
1501 assert(obj->ob_type->tp_weaklistoffset > 0);
1502 assert(obj->ob_type->tp_weaklistoffset + sizeof(PyObject *) <=
Guido van Rossum3747a0f2002-08-12 19:25:08 +00001503 (size_t)(obj->ob_type->tp_basicsize));
Guido van Rossumad47da02002-08-12 19:05:44 +00001504 weaklistptr = (PyObject **)
Guido van Rossum3747a0f2002-08-12 19:25:08 +00001505 ((char *)obj + obj->ob_type->tp_weaklistoffset);
Guido van Rossumad47da02002-08-12 19:05:44 +00001506 if (*weaklistptr == NULL)
1507 result = Py_None;
1508 else
1509 result = *weaklistptr;
1510 Py_INCREF(result);
1511 return result;
1512}
1513
Guido van Rossum373c7412003-01-07 13:41:37 +00001514/* Three variants on the subtype_getsets list. */
1515
1516static PyGetSetDef subtype_getsets_full[] = {
Guido van Rossumad47da02002-08-12 19:05:44 +00001517 {"__dict__", subtype_dict, subtype_setdict,
Neal Norwitz858e34f2002-08-13 17:18:45 +00001518 PyDoc_STR("dictionary for instance variables (if defined)")},
Guido van Rossumad47da02002-08-12 19:05:44 +00001519 {"__weakref__", subtype_getweakref, NULL,
Neal Norwitz858e34f2002-08-13 17:18:45 +00001520 PyDoc_STR("list of weak references to the object (if defined)")},
Guido van Rossumad47da02002-08-12 19:05:44 +00001521 {0}
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001522};
1523
Guido van Rossum373c7412003-01-07 13:41:37 +00001524static PyGetSetDef subtype_getsets_dict_only[] = {
1525 {"__dict__", subtype_dict, subtype_setdict,
1526 PyDoc_STR("dictionary for instance variables (if defined)")},
1527 {0}
1528};
1529
1530static PyGetSetDef subtype_getsets_weakref_only[] = {
1531 {"__weakref__", subtype_getweakref, NULL,
1532 PyDoc_STR("list of weak references to the object (if defined)")},
1533 {0}
1534};
1535
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001536static int
1537valid_identifier(PyObject *s)
1538{
Guido van Rossum03013a02002-07-16 14:30:28 +00001539 unsigned char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001540 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001541
1542 if (!PyString_Check(s)) {
1543 PyErr_SetString(PyExc_TypeError,
1544 "__slots__ must be strings");
1545 return 0;
1546 }
Guido van Rossum03013a02002-07-16 14:30:28 +00001547 p = (unsigned char *) PyString_AS_STRING(s);
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001548 n = PyString_GET_SIZE(s);
1549 /* We must reject an empty name. As a hack, we bump the
1550 length to 1 so that the loop will balk on the trailing \0. */
1551 if (n == 0)
1552 n = 1;
1553 for (i = 0; i < n; i++, p++) {
1554 if (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_') {
1555 PyErr_SetString(PyExc_TypeError,
1556 "__slots__ must be identifiers");
1557 return 0;
1558 }
1559 }
1560 return 1;
1561}
1562
Martin v. Löwisd919a592002-10-14 21:07:28 +00001563#ifdef Py_USING_UNICODE
1564/* Replace Unicode objects in slots. */
1565
1566static PyObject *
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001567_unicode_to_string(PyObject *slots, Py_ssize_t nslots)
Martin v. Löwisd919a592002-10-14 21:07:28 +00001568{
1569 PyObject *tmp = slots;
1570 PyObject *o, *o1;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001571 Py_ssize_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001572 ssizessizeargfunc copy = slots->ob_type->tp_as_sequence->sq_slice;
Martin v. Löwisd919a592002-10-14 21:07:28 +00001573 for (i = 0; i < nslots; i++) {
1574 if (PyUnicode_Check(o = PyTuple_GET_ITEM(tmp, i))) {
1575 if (tmp == slots) {
1576 tmp = copy(slots, 0, PyTuple_GET_SIZE(slots));
1577 if (tmp == NULL)
1578 return NULL;
1579 }
1580 o1 = _PyUnicode_AsDefaultEncodedString
1581 (o, NULL);
1582 if (o1 == NULL) {
1583 Py_DECREF(tmp);
1584 return 0;
1585 }
1586 Py_INCREF(o1);
1587 Py_DECREF(o);
1588 PyTuple_SET_ITEM(tmp, i, o1);
1589 }
1590 }
1591 return tmp;
1592}
1593#endif
1594
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001595static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001596type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
1597{
1598 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001599 static char *kwlist[] = {"name", "bases", "dict", 0};
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001600 PyObject *slots, *tmp, *newslots;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001601 PyTypeObject *type, *base, *tmptype, *winner;
Guido van Rossume5c691a2003-03-07 15:13:17 +00001602 PyHeapTypeObject *et;
Guido van Rossum6f799372001-09-20 20:46:19 +00001603 PyMemberDef *mp;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001604 Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
Guido van Rossumad47da02002-08-12 19:05:44 +00001605 int j, may_add_dict, may_add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001606
Tim Peters3abca122001-10-27 19:37:48 +00001607 assert(args != NULL && PyTuple_Check(args));
1608 assert(kwds == NULL || PyDict_Check(kwds));
1609
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001610 /* Special case: type(x) should return x->ob_type */
Tim Peters3abca122001-10-27 19:37:48 +00001611 {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001612 const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1613 const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
Tim Peters3abca122001-10-27 19:37:48 +00001614
1615 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
1616 PyObject *x = PyTuple_GET_ITEM(args, 0);
1617 Py_INCREF(x->ob_type);
1618 return (PyObject *) x->ob_type;
1619 }
1620
1621 /* SF bug 475327 -- if that didn't trigger, we need 3
1622 arguments. but PyArg_ParseTupleAndKeywords below may give
1623 a msg saying type() needs exactly 3. */
1624 if (nargs + nkwds != 3) {
1625 PyErr_SetString(PyExc_TypeError,
1626 "type() takes 1 or 3 arguments");
1627 return NULL;
1628 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001629 }
1630
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001631 /* Check arguments: (name, bases, dict) */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
1633 &name,
1634 &PyTuple_Type, &bases,
1635 &PyDict_Type, &dict))
1636 return NULL;
1637
1638 /* Determine the proper metatype to deal with this,
1639 and check for metatype conflicts while we're at it.
1640 Note that if some other metatype wins to contract,
1641 it's possible that its instances are not types. */
1642 nbases = PyTuple_GET_SIZE(bases);
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001643 winner = metatype;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001644 for (i = 0; i < nbases; i++) {
1645 tmp = PyTuple_GET_ITEM(bases, i);
1646 tmptype = tmp->ob_type;
Tim Petersa91e9642001-11-14 23:32:33 +00001647 if (tmptype == &PyClass_Type)
1648 continue; /* Special case classic classes */
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001649 if (PyType_IsSubtype(winner, tmptype))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001650 continue;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001651 if (PyType_IsSubtype(tmptype, winner)) {
1652 winner = tmptype;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001653 continue;
1654 }
1655 PyErr_SetString(PyExc_TypeError,
Guido van Rossum636688d2003-04-23 12:07:22 +00001656 "metaclass conflict: "
1657 "the metaclass of a derived class "
1658 "must be a (non-strict) subclass "
1659 "of the metaclasses of all its bases");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001660 return NULL;
1661 }
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001662 if (winner != metatype) {
1663 if (winner->tp_new != type_new) /* Pass it to the winner */
1664 return winner->tp_new(winner, args, kwds);
1665 metatype = winner;
1666 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001667
1668 /* Adjust for empty tuple bases */
1669 if (nbases == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001670 bases = PyTuple_Pack(1, &PyBaseObject_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671 if (bases == NULL)
1672 return NULL;
1673 nbases = 1;
1674 }
1675 else
1676 Py_INCREF(bases);
1677
1678 /* XXX From here until type is allocated, "return NULL" leaks bases! */
1679
1680 /* Calculate best base, and check that all bases are type objects */
1681 base = best_base(bases);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001682 if (base == NULL) {
1683 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001685 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001686 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
1687 PyErr_Format(PyExc_TypeError,
1688 "type '%.100s' is not an acceptable base type",
1689 base->tp_name);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001690 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001691 return NULL;
1692 }
1693
Tim Peters6d6c1a32001-08-02 04:15:00 +00001694 /* Check for a __slots__ sequence variable in dict, and count it */
1695 slots = PyDict_GetItemString(dict, "__slots__");
1696 nslots = 0;
Guido van Rossum9676b222001-08-17 20:32:36 +00001697 add_dict = 0;
1698 add_weak = 0;
Guido van Rossumad47da02002-08-12 19:05:44 +00001699 may_add_dict = base->tp_dictoffset == 0;
1700 may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0;
1701 if (slots == NULL) {
1702 if (may_add_dict) {
1703 add_dict++;
1704 }
1705 if (may_add_weak) {
1706 add_weak++;
1707 }
1708 }
1709 else {
1710 /* Have slots */
1711
Tim Peters6d6c1a32001-08-02 04:15:00 +00001712 /* Make it into a tuple */
1713 if (PyString_Check(slots))
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001714 slots = PyTuple_Pack(1, slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001715 else
1716 slots = PySequence_Tuple(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001717 if (slots == NULL) {
1718 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001719 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001720 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001721 assert(PyTuple_Check(slots));
1722
1723 /* Are slots allowed? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001724 nslots = PyTuple_GET_SIZE(slots);
Jeremy Hylton1c7a0ea2003-07-16 16:08:23 +00001725 if (nslots > 0 && base->tp_itemsize != 0) {
Guido van Rossumc4141872001-08-30 04:43:35 +00001726 PyErr_Format(PyExc_TypeError,
1727 "nonempty __slots__ "
1728 "not supported for subtype of '%s'",
1729 base->tp_name);
Guido van Rossumad47da02002-08-12 19:05:44 +00001730 bad_slots:
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001731 Py_DECREF(bases);
Guido van Rossumad47da02002-08-12 19:05:44 +00001732 Py_DECREF(slots);
Guido van Rossumc4141872001-08-30 04:43:35 +00001733 return NULL;
1734 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001735
Martin v. Löwisd919a592002-10-14 21:07:28 +00001736#ifdef Py_USING_UNICODE
1737 tmp = _unicode_to_string(slots, nslots);
Martin v. Löwis13b1a5c2002-10-14 21:11:34 +00001738 if (tmp != slots) {
1739 Py_DECREF(slots);
1740 slots = tmp;
1741 }
Martin v. Löwisd919a592002-10-14 21:07:28 +00001742 if (!tmp)
1743 return NULL;
1744#endif
Guido van Rossumad47da02002-08-12 19:05:44 +00001745 /* Check for valid slot names and two special cases */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001746 for (i = 0; i < nslots; i++) {
Guido van Rossumad47da02002-08-12 19:05:44 +00001747 PyObject *tmp = PyTuple_GET_ITEM(slots, i);
1748 char *s;
1749 if (!valid_identifier(tmp))
1750 goto bad_slots;
1751 assert(PyString_Check(tmp));
1752 s = PyString_AS_STRING(tmp);
1753 if (strcmp(s, "__dict__") == 0) {
1754 if (!may_add_dict || add_dict) {
1755 PyErr_SetString(PyExc_TypeError,
1756 "__dict__ slot disallowed: "
1757 "we already got one");
1758 goto bad_slots;
1759 }
1760 add_dict++;
1761 }
1762 if (strcmp(s, "__weakref__") == 0) {
1763 if (!may_add_weak || add_weak) {
1764 PyErr_SetString(PyExc_TypeError,
1765 "__weakref__ slot disallowed: "
1766 "either we already got one, "
1767 "or __itemsize__ != 0");
1768 goto bad_slots;
1769 }
1770 add_weak++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001771 }
1772 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001773
Guido van Rossumad47da02002-08-12 19:05:44 +00001774 /* Copy slots into yet another tuple, demangling names */
1775 newslots = PyTuple_New(nslots - add_dict - add_weak);
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001776 if (newslots == NULL)
Guido van Rossumad47da02002-08-12 19:05:44 +00001777 goto bad_slots;
1778 for (i = j = 0; i < nslots; i++) {
1779 char *s;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001780 tmp = PyTuple_GET_ITEM(slots, i);
Guido van Rossumad47da02002-08-12 19:05:44 +00001781 s = PyString_AS_STRING(tmp);
1782 if ((add_dict && strcmp(s, "__dict__") == 0) ||
1783 (add_weak && strcmp(s, "__weakref__") == 0))
1784 continue;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001785 tmp =_Py_Mangle(name, tmp);
1786 if (!tmp)
1787 goto bad_slots;
Guido van Rossumad47da02002-08-12 19:05:44 +00001788 PyTuple_SET_ITEM(newslots, j, tmp);
1789 j++;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001790 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001791 assert(j == nslots - add_dict - add_weak);
1792 nslots = j;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001793 Py_DECREF(slots);
1794 slots = newslots;
1795
Guido van Rossumad47da02002-08-12 19:05:44 +00001796 /* Secondary bases may provide weakrefs or dict */
1797 if (nbases > 1 &&
1798 ((may_add_dict && !add_dict) ||
1799 (may_add_weak && !add_weak))) {
1800 for (i = 0; i < nbases; i++) {
1801 tmp = PyTuple_GET_ITEM(bases, i);
1802 if (tmp == (PyObject *)base)
1803 continue; /* Skip primary base */
1804 if (PyClass_Check(tmp)) {
1805 /* Classic base class provides both */
1806 if (may_add_dict && !add_dict)
1807 add_dict++;
1808 if (may_add_weak && !add_weak)
1809 add_weak++;
1810 break;
1811 }
1812 assert(PyType_Check(tmp));
1813 tmptype = (PyTypeObject *)tmp;
1814 if (may_add_dict && !add_dict &&
1815 tmptype->tp_dictoffset != 0)
1816 add_dict++;
1817 if (may_add_weak && !add_weak &&
1818 tmptype->tp_weaklistoffset != 0)
1819 add_weak++;
1820 if (may_add_dict && !add_dict)
1821 continue;
1822 if (may_add_weak && !add_weak)
1823 continue;
1824 /* Nothing more to check */
1825 break;
1826 }
1827 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001828 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001829
1830 /* XXX From here until type is safely allocated,
1831 "return NULL" may leak slots! */
1832
1833 /* Allocate the type object */
1834 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
Guido van Rossumad47da02002-08-12 19:05:44 +00001835 if (type == NULL) {
1836 Py_XDECREF(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001837 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001838 return NULL;
Guido van Rossumad47da02002-08-12 19:05:44 +00001839 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001840
1841 /* Keep name and slots alive in the extended type object */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001842 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001843 Py_INCREF(name);
Georg Brandlc255c7b2006-02-20 22:27:28 +00001844 et->ht_name = name;
1845 et->ht_slots = slots;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001846
Guido van Rossumdc91b992001-08-08 22:26:22 +00001847 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001848 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
1849 Py_TPFLAGS_BASETYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00001850 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
1851 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00001852
1853 /* It's a new-style number unless it specifically inherits any
1854 old-style numeric behavior */
1855 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
1856 (base->tp_as_number == NULL))
1857 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
1858
1859 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001860 type->tp_as_number = &et->as_number;
1861 type->tp_as_sequence = &et->as_sequence;
1862 type->tp_as_mapping = &et->as_mapping;
1863 type->tp_as_buffer = &et->as_buffer;
1864 type->tp_name = PyString_AS_STRING(name);
1865
1866 /* Set tp_base and tp_bases */
1867 type->tp_bases = bases;
1868 Py_INCREF(base);
1869 type->tp_base = base;
1870
Guido van Rossum687ae002001-10-15 22:03:32 +00001871 /* Initialize tp_dict from passed-in dict */
1872 type->tp_dict = dict = PyDict_Copy(dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001873 if (dict == NULL) {
1874 Py_DECREF(type);
1875 return NULL;
1876 }
1877
Guido van Rossumc3542212001-08-16 09:18:56 +00001878 /* Set __module__ in the dict */
1879 if (PyDict_GetItemString(dict, "__module__") == NULL) {
1880 tmp = PyEval_GetGlobals();
1881 if (tmp != NULL) {
1882 tmp = PyDict_GetItemString(tmp, "__name__");
1883 if (tmp != NULL) {
1884 if (PyDict_SetItemString(dict, "__module__",
1885 tmp) < 0)
1886 return NULL;
1887 }
1888 }
1889 }
1890
Tim Peters2f93e282001-10-04 05:27:00 +00001891 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
Tim Peters24008312002-03-17 18:56:20 +00001892 and is a string. The __doc__ accessor will first look for tp_doc;
1893 if that fails, it will still look into __dict__.
Tim Peters2f93e282001-10-04 05:27:00 +00001894 */
1895 {
1896 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
1897 if (doc != NULL && PyString_Check(doc)) {
1898 const size_t n = (size_t)PyString_GET_SIZE(doc);
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001899 char *tp_doc = PyObject_MALLOC(n+1);
1900 if (tp_doc == NULL) {
Tim Peters2f93e282001-10-04 05:27:00 +00001901 Py_DECREF(type);
1902 return NULL;
1903 }
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001904 memcpy(tp_doc, PyString_AS_STRING(doc), n+1);
1905 type->tp_doc = tp_doc;
Tim Peters2f93e282001-10-04 05:27:00 +00001906 }
1907 }
1908
Tim Peters6d6c1a32001-08-02 04:15:00 +00001909 /* Special-case __new__: if it's a plain function,
1910 make it a static function */
1911 tmp = PyDict_GetItemString(dict, "__new__");
1912 if (tmp != NULL && PyFunction_Check(tmp)) {
1913 tmp = PyStaticMethod_New(tmp);
1914 if (tmp == NULL) {
1915 Py_DECREF(type);
1916 return NULL;
1917 }
1918 PyDict_SetItemString(dict, "__new__", tmp);
1919 Py_DECREF(tmp);
1920 }
1921
1922 /* Add descriptors for custom slots from __slots__, or for __dict__ */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001923 mp = PyHeapType_GET_MEMBERS(et);
Neil Schemenauerc806c882001-08-29 23:54:54 +00001924 slotoffset = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001925 if (slots != NULL) {
1926 for (i = 0; i < nslots; i++, mp++) {
1927 mp->name = PyString_AS_STRING(
1928 PyTuple_GET_ITEM(slots, i));
Guido van Rossum64b206c2001-12-04 17:13:22 +00001929 mp->type = T_OBJECT_EX;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001930 mp->offset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00001931 if (base->tp_weaklistoffset == 0 &&
Guido van Rossum64b206c2001-12-04 17:13:22 +00001932 strcmp(mp->name, "__weakref__") == 0) {
Guido van Rossumad47da02002-08-12 19:05:44 +00001933 add_weak++;
Guido van Rossum64b206c2001-12-04 17:13:22 +00001934 mp->type = T_OBJECT;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001935 mp->flags = READONLY;
Guido van Rossum9676b222001-08-17 20:32:36 +00001936 type->tp_weaklistoffset = slotoffset;
Guido van Rossum64b206c2001-12-04 17:13:22 +00001937 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001938 slotoffset += sizeof(PyObject *);
1939 }
1940 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001941 if (add_dict) {
1942 if (base->tp_itemsize)
1943 type->tp_dictoffset = -(long)sizeof(PyObject *);
1944 else
1945 type->tp_dictoffset = slotoffset;
1946 slotoffset += sizeof(PyObject *);
1947 }
1948 if (add_weak) {
1949 assert(!base->tp_itemsize);
1950 type->tp_weaklistoffset = slotoffset;
1951 slotoffset += sizeof(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001952 }
1953 type->tp_basicsize = slotoffset;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001954 type->tp_itemsize = base->tp_itemsize;
Guido van Rossume5c691a2003-03-07 15:13:17 +00001955 type->tp_members = PyHeapType_GET_MEMBERS(et);
Guido van Rossum373c7412003-01-07 13:41:37 +00001956
1957 if (type->tp_weaklistoffset && type->tp_dictoffset)
1958 type->tp_getset = subtype_getsets_full;
1959 else if (type->tp_weaklistoffset && !type->tp_dictoffset)
1960 type->tp_getset = subtype_getsets_weakref_only;
1961 else if (!type->tp_weaklistoffset && type->tp_dictoffset)
1962 type->tp_getset = subtype_getsets_dict_only;
1963 else
1964 type->tp_getset = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001965
1966 /* Special case some slots */
1967 if (type->tp_dictoffset != 0 || nslots > 0) {
1968 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
1969 type->tp_getattro = PyObject_GenericGetAttr;
1970 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
1971 type->tp_setattro = PyObject_GenericSetAttr;
1972 }
1973 type->tp_dealloc = subtype_dealloc;
1974
Guido van Rossum9475a232001-10-05 20:51:39 +00001975 /* Enable GC unless there are really no instance variables possible */
1976 if (!(type->tp_basicsize == sizeof(PyObject) &&
1977 type->tp_itemsize == 0))
1978 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
1979
Tim Peters6d6c1a32001-08-02 04:15:00 +00001980 /* Always override allocation strategy to use regular heap */
1981 type->tp_alloc = PyType_GenericAlloc;
Guido van Rossum048eb752001-10-02 21:24:57 +00001982 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001983 type->tp_free = PyObject_GC_Del;
Guido van Rossum9475a232001-10-05 20:51:39 +00001984 type->tp_traverse = subtype_traverse;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001985 type->tp_clear = subtype_clear;
Guido van Rossum048eb752001-10-02 21:24:57 +00001986 }
1987 else
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00001988 type->tp_free = PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001989
1990 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001991 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00001992 Py_DECREF(type);
1993 return NULL;
1994 }
1995
Guido van Rossum7b9144b2001-10-09 19:39:46 +00001996 /* Put the proper slots in place */
1997 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00001998
Tim Peters6d6c1a32001-08-02 04:15:00 +00001999 return (PyObject *)type;
2000}
2001
2002/* Internal API to look for a name through the MRO.
2003 This returns a borrowed reference, and doesn't set an exception! */
2004PyObject *
2005_PyType_Lookup(PyTypeObject *type, PyObject *name)
2006{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002007 Py_ssize_t i, n;
Tim Petersa91e9642001-11-14 23:32:33 +00002008 PyObject *mro, *res, *base, *dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002009
Guido van Rossum687ae002001-10-15 22:03:32 +00002010 /* Look in tp_dict of types in MRO */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002011 mro = type->tp_mro;
Guido van Rossum23094982002-06-10 14:30:43 +00002012
2013 /* If mro is NULL, the type is either not yet initialized
2014 by PyType_Ready(), or already cleared by type_clear().
2015 Either way the safest thing to do is to return NULL. */
2016 if (mro == NULL)
2017 return NULL;
2018
Tim Peters6d6c1a32001-08-02 04:15:00 +00002019 assert(PyTuple_Check(mro));
2020 n = PyTuple_GET_SIZE(mro);
2021 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002022 base = PyTuple_GET_ITEM(mro, i);
2023 if (PyClass_Check(base))
2024 dict = ((PyClassObject *)base)->cl_dict;
2025 else {
2026 assert(PyType_Check(base));
2027 dict = ((PyTypeObject *)base)->tp_dict;
2028 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002029 assert(dict && PyDict_Check(dict));
2030 res = PyDict_GetItem(dict, name);
2031 if (res != NULL)
2032 return res;
2033 }
2034 return NULL;
2035}
2036
2037/* This is similar to PyObject_GenericGetAttr(),
2038 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
2039static PyObject *
2040type_getattro(PyTypeObject *type, PyObject *name)
2041{
2042 PyTypeObject *metatype = type->ob_type;
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002043 PyObject *meta_attribute, *attribute;
2044 descrgetfunc meta_get;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002045
2046 /* Initialize this type (we'll assume the metatype is initialized) */
2047 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002048 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002049 return NULL;
2050 }
2051
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002052 /* No readable descriptor found yet */
2053 meta_get = NULL;
Tim Peters34592512002-07-11 06:23:50 +00002054
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002055 /* Look for the attribute in the metatype */
2056 meta_attribute = _PyType_Lookup(metatype, name);
2057
2058 if (meta_attribute != NULL) {
2059 meta_get = meta_attribute->ob_type->tp_descr_get;
Tim Peters34592512002-07-11 06:23:50 +00002060
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002061 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
2062 /* Data descriptors implement tp_descr_set to intercept
2063 * writes. Assume the attribute is not overridden in
2064 * type's tp_dict (and bases): call the descriptor now.
2065 */
2066 return meta_get(meta_attribute, (PyObject *)type,
2067 (PyObject *)metatype);
2068 }
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002069 Py_INCREF(meta_attribute);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002070 }
2071
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002072 /* No data descriptor found on metatype. Look in tp_dict of this
2073 * type and its bases */
2074 attribute = _PyType_Lookup(type, name);
2075 if (attribute != NULL) {
2076 /* Implement descriptor functionality, if any */
2077 descrgetfunc local_get = attribute->ob_type->tp_descr_get;
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002078
2079 Py_XDECREF(meta_attribute);
2080
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002081 if (local_get != NULL) {
2082 /* NULL 2nd argument indicates the descriptor was
2083 * found on the target object itself (or a base) */
2084 return local_get(attribute, (PyObject *)NULL,
2085 (PyObject *)type);
2086 }
Tim Peters34592512002-07-11 06:23:50 +00002087
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002088 Py_INCREF(attribute);
2089 return attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002090 }
2091
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002092 /* No attribute found in local __dict__ (or bases): use the
2093 * descriptor from the metatype, if any */
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002094 if (meta_get != NULL) {
2095 PyObject *res;
2096 res = meta_get(meta_attribute, (PyObject *)type,
2097 (PyObject *)metatype);
2098 Py_DECREF(meta_attribute);
2099 return res;
2100 }
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002101
2102 /* If an ordinary attribute was found on the metatype, return it now */
2103 if (meta_attribute != NULL) {
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002104 return meta_attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002105 }
2106
2107 /* Give up */
2108 PyErr_Format(PyExc_AttributeError,
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002109 "type object '%.50s' has no attribute '%.400s'",
2110 type->tp_name, PyString_AS_STRING(name));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002111 return NULL;
2112}
2113
2114static int
2115type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
2116{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002117 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2118 PyErr_Format(
2119 PyExc_TypeError,
2120 "can't set attributes of built-in/extension type '%s'",
2121 type->tp_name);
2122 return -1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002123 }
Guido van Rossum8d24ee92003-03-24 23:49:49 +00002124 /* XXX Example of how I expect this to be used...
2125 if (update_subclasses(type, name, invalidate_cache, NULL) < 0)
2126 return -1;
2127 */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002128 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
2129 return -1;
2130 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002131}
2132
2133static void
2134type_dealloc(PyTypeObject *type)
2135{
Guido van Rossume5c691a2003-03-07 15:13:17 +00002136 PyHeapTypeObject *et;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002137
2138 /* Assert this is a heap-allocated type object */
2139 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002140 _PyObject_GC_UNTRACK(type);
Guido van Rossum1c450732001-10-08 15:18:27 +00002141 PyObject_ClearWeakRefs((PyObject *)type);
Guido van Rossume5c691a2003-03-07 15:13:17 +00002142 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002143 Py_XDECREF(type->tp_base);
2144 Py_XDECREF(type->tp_dict);
2145 Py_XDECREF(type->tp_bases);
2146 Py_XDECREF(type->tp_mro);
Guido van Rossum687ae002001-10-15 22:03:32 +00002147 Py_XDECREF(type->tp_cache);
Guido van Rossum1c450732001-10-08 15:18:27 +00002148 Py_XDECREF(type->tp_subclasses);
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002149 /* A type's tp_doc is heap allocated, unlike the tp_doc slots
2150 * of most other objects. It's okay to cast it to char *.
2151 */
2152 PyObject_Free((char *)type->tp_doc);
Georg Brandlc255c7b2006-02-20 22:27:28 +00002153 Py_XDECREF(et->ht_name);
2154 Py_XDECREF(et->ht_slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002155 type->ob_type->tp_free((PyObject *)type);
2156}
2157
Guido van Rossum1c450732001-10-08 15:18:27 +00002158static PyObject *
2159type_subclasses(PyTypeObject *type, PyObject *args_ignored)
2160{
2161 PyObject *list, *raw, *ref;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002162 Py_ssize_t i, n;
Guido van Rossum1c450732001-10-08 15:18:27 +00002163
2164 list = PyList_New(0);
2165 if (list == NULL)
2166 return NULL;
2167 raw = type->tp_subclasses;
2168 if (raw == NULL)
2169 return list;
2170 assert(PyList_Check(raw));
2171 n = PyList_GET_SIZE(raw);
2172 for (i = 0; i < n; i++) {
2173 ref = PyList_GET_ITEM(raw, i);
Tim Peters44383382001-10-08 16:49:26 +00002174 assert(PyWeakref_CheckRef(ref));
Guido van Rossum1c450732001-10-08 15:18:27 +00002175 ref = PyWeakref_GET_OBJECT(ref);
2176 if (ref != Py_None) {
2177 if (PyList_Append(list, ref) < 0) {
2178 Py_DECREF(list);
2179 return NULL;
2180 }
2181 }
2182 }
2183 return list;
2184}
2185
Tim Peters6d6c1a32001-08-02 04:15:00 +00002186static PyMethodDef type_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002187 {"mro", (PyCFunction)mro_external, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002188 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
Guido van Rossum1c450732001-10-08 15:18:27 +00002189 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002190 PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002191 {0}
2192};
2193
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002194PyDoc_STRVAR(type_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002195"type(object) -> the object's type\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002196"type(name, bases, dict) -> a new type");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002197
Guido van Rossum048eb752001-10-02 21:24:57 +00002198static int
2199type_traverse(PyTypeObject *type, visitproc visit, void *arg)
2200{
Guido van Rossum048eb752001-10-02 21:24:57 +00002201 int err;
2202
Guido van Rossuma3862092002-06-10 15:24:42 +00002203 /* Because of type_is_gc(), the collector only calls this
2204 for heaptypes. */
2205 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002206
2207#define VISIT(SLOT) \
2208 if (SLOT) { \
2209 err = visit((PyObject *)(SLOT), arg); \
2210 if (err) \
2211 return err; \
2212 }
2213
2214 VISIT(type->tp_dict);
Guido van Rossum687ae002001-10-15 22:03:32 +00002215 VISIT(type->tp_cache);
Guido van Rossum048eb752001-10-02 21:24:57 +00002216 VISIT(type->tp_mro);
2217 VISIT(type->tp_bases);
2218 VISIT(type->tp_base);
Guido van Rossuma3862092002-06-10 15:24:42 +00002219
2220 /* There's no need to visit type->tp_subclasses or
Georg Brandlc255c7b2006-02-20 22:27:28 +00002221 ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
Guido van Rossuma3862092002-06-10 15:24:42 +00002222 in cycles; tp_subclasses is a list of weak references,
2223 and slots is a tuple of strings. */
Guido van Rossum048eb752001-10-02 21:24:57 +00002224
2225#undef VISIT
2226
2227 return 0;
2228}
2229
2230static int
2231type_clear(PyTypeObject *type)
2232{
Guido van Rossum048eb752001-10-02 21:24:57 +00002233 PyObject *tmp;
2234
Guido van Rossuma3862092002-06-10 15:24:42 +00002235 /* Because of type_is_gc(), the collector only calls this
2236 for heaptypes. */
2237 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002238
2239#define CLEAR(SLOT) \
2240 if (SLOT) { \
2241 tmp = (PyObject *)(SLOT); \
2242 SLOT = NULL; \
2243 Py_DECREF(tmp); \
2244 }
2245
Guido van Rossuma3862092002-06-10 15:24:42 +00002246 /* The only field we need to clear is tp_mro, which is part of a
2247 hard cycle (its first element is the class itself) that won't
2248 be broken otherwise (it's a tuple and tuples don't have a
2249 tp_clear handler). None of the other fields need to be
2250 cleared, and here's why:
Guido van Rossum048eb752001-10-02 21:24:57 +00002251
Guido van Rossuma3862092002-06-10 15:24:42 +00002252 tp_dict:
2253 It is a dict, so the collector will call its tp_clear.
2254
2255 tp_cache:
2256 Not used; if it were, it would be a dict.
2257
2258 tp_bases, tp_base:
2259 If these are involved in a cycle, there must be at least
2260 one other, mutable object in the cycle, e.g. a base
2261 class's dict; the cycle will be broken that way.
2262
2263 tp_subclasses:
2264 A list of weak references can't be part of a cycle; and
2265 lists have their own tp_clear.
2266
Guido van Rossume5c691a2003-03-07 15:13:17 +00002267 slots (in PyHeapTypeObject):
Guido van Rossuma3862092002-06-10 15:24:42 +00002268 A tuple of strings can't be part of a cycle.
2269 */
2270
2271 CLEAR(type->tp_mro);
Tim Peters2f93e282001-10-04 05:27:00 +00002272
Guido van Rossum048eb752001-10-02 21:24:57 +00002273#undef CLEAR
2274
2275 return 0;
2276}
2277
2278static int
2279type_is_gc(PyTypeObject *type)
2280{
2281 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
2282}
2283
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002284PyTypeObject PyType_Type = {
2285 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002286 0, /* ob_size */
2287 "type", /* tp_name */
Guido van Rossume5c691a2003-03-07 15:13:17 +00002288 sizeof(PyHeapTypeObject), /* tp_basicsize */
Guido van Rossum6f799372001-09-20 20:46:19 +00002289 sizeof(PyMemberDef), /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002290 (destructor)type_dealloc, /* tp_dealloc */
2291 0, /* tp_print */
2292 0, /* tp_getattr */
2293 0, /* tp_setattr */
2294 type_compare, /* tp_compare */
2295 (reprfunc)type_repr, /* tp_repr */
2296 0, /* tp_as_number */
2297 0, /* tp_as_sequence */
2298 0, /* tp_as_mapping */
2299 (hashfunc)_Py_HashPointer, /* tp_hash */
2300 (ternaryfunc)type_call, /* tp_call */
2301 0, /* tp_str */
2302 (getattrofunc)type_getattro, /* tp_getattro */
2303 (setattrofunc)type_setattro, /* tp_setattro */
2304 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00002305 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2306 Py_TPFLAGS_BASETYPE, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002307 type_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00002308 (traverseproc)type_traverse, /* tp_traverse */
2309 (inquiry)type_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002310 0, /* tp_richcompare */
Guido van Rossum1c450732001-10-08 15:18:27 +00002311 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002312 0, /* tp_iter */
2313 0, /* tp_iternext */
2314 type_methods, /* tp_methods */
2315 type_members, /* tp_members */
2316 type_getsets, /* tp_getset */
2317 0, /* tp_base */
2318 0, /* tp_dict */
2319 0, /* tp_descr_get */
2320 0, /* tp_descr_set */
2321 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
2322 0, /* tp_init */
2323 0, /* tp_alloc */
2324 type_new, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002325 PyObject_GC_Del, /* tp_free */
Guido van Rossum048eb752001-10-02 21:24:57 +00002326 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002327};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002328
2329
2330/* The base type of all types (eventually)... except itself. */
2331
2332static int
2333object_init(PyObject *self, PyObject *args, PyObject *kwds)
2334{
2335 return 0;
2336}
2337
Guido van Rossum298e4212003-02-13 16:30:16 +00002338/* If we don't have a tp_new for a new-style class, new will use this one.
2339 Therefore this should take no arguments/keywords. However, this new may
2340 also be inherited by objects that define a tp_init but no tp_new. These
2341 objects WILL pass argumets to tp_new, because it gets the same args as
2342 tp_init. So only allow arguments if we aren't using the default init, in
2343 which case we expect init to handle argument parsing. */
2344static PyObject *
2345object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2346{
2347 if (type->tp_init == object_init && (PyTuple_GET_SIZE(args) ||
2348 (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)))) {
2349 PyErr_SetString(PyExc_TypeError,
2350 "default __new__ takes no parameters");
2351 return NULL;
2352 }
2353 return type->tp_alloc(type, 0);
2354}
2355
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356static void
2357object_dealloc(PyObject *self)
2358{
2359 self->ob_type->tp_free(self);
2360}
2361
Guido van Rossum8e248182001-08-12 05:17:56 +00002362static PyObject *
2363object_repr(PyObject *self)
2364{
Guido van Rossum76e69632001-08-16 18:52:43 +00002365 PyTypeObject *type;
Barry Warsaw7ce36942001-08-24 18:34:26 +00002366 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002367
Guido van Rossum76e69632001-08-16 18:52:43 +00002368 type = self->ob_type;
2369 mod = type_module(type, NULL);
2370 if (mod == NULL)
2371 PyErr_Clear();
2372 else if (!PyString_Check(mod)) {
2373 Py_DECREF(mod);
2374 mod = NULL;
2375 }
2376 name = type_name(type, NULL);
2377 if (name == NULL)
2378 return NULL;
2379 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002380 rtn = PyString_FromFormat("<%s.%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002381 PyString_AS_STRING(mod),
2382 PyString_AS_STRING(name),
2383 self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002384 else
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002385 rtn = PyString_FromFormat("<%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002386 type->tp_name, self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002387 Py_XDECREF(mod);
2388 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +00002389 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002390}
2391
Guido van Rossumb8f63662001-08-15 23:57:02 +00002392static PyObject *
2393object_str(PyObject *self)
2394{
2395 unaryfunc f;
2396
2397 f = self->ob_type->tp_repr;
2398 if (f == NULL)
2399 f = object_repr;
2400 return f(self);
2401}
2402
Guido van Rossum8e248182001-08-12 05:17:56 +00002403static long
2404object_hash(PyObject *self)
2405{
2406 return _Py_HashPointer(self);
2407}
Guido van Rossum8e248182001-08-12 05:17:56 +00002408
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002409static PyObject *
2410object_get_class(PyObject *self, void *closure)
2411{
2412 Py_INCREF(self->ob_type);
2413 return (PyObject *)(self->ob_type);
2414}
2415
2416static int
2417equiv_structs(PyTypeObject *a, PyTypeObject *b)
2418{
2419 return a == b ||
2420 (a != NULL &&
2421 b != NULL &&
2422 a->tp_basicsize == b->tp_basicsize &&
2423 a->tp_itemsize == b->tp_itemsize &&
2424 a->tp_dictoffset == b->tp_dictoffset &&
2425 a->tp_weaklistoffset == b->tp_weaklistoffset &&
2426 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
2427 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
2428}
2429
2430static int
2431same_slots_added(PyTypeObject *a, PyTypeObject *b)
2432{
2433 PyTypeObject *base = a->tp_base;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002434 Py_ssize_t size;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002435
2436 if (base != b->tp_base)
2437 return 0;
2438 if (equiv_structs(a, base) && equiv_structs(b, base))
2439 return 1;
2440 size = base->tp_basicsize;
2441 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
2442 size += sizeof(PyObject *);
2443 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
2444 size += sizeof(PyObject *);
2445 return size == a->tp_basicsize && size == b->tp_basicsize;
2446}
2447
2448static int
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002449compatible_for_assignment(PyTypeObject* old, PyTypeObject* new, char* attr)
2450{
2451 PyTypeObject *newbase, *oldbase;
2452
2453 if (new->tp_dealloc != old->tp_dealloc ||
2454 new->tp_free != old->tp_free)
2455 {
2456 PyErr_Format(PyExc_TypeError,
2457 "%s assignment: "
2458 "'%s' deallocator differs from '%s'",
2459 attr,
2460 new->tp_name,
2461 old->tp_name);
2462 return 0;
2463 }
2464 newbase = new;
2465 oldbase = old;
2466 while (equiv_structs(newbase, newbase->tp_base))
2467 newbase = newbase->tp_base;
2468 while (equiv_structs(oldbase, oldbase->tp_base))
2469 oldbase = oldbase->tp_base;
2470 if (newbase != oldbase &&
2471 (newbase->tp_base != oldbase->tp_base ||
2472 !same_slots_added(newbase, oldbase))) {
2473 PyErr_Format(PyExc_TypeError,
2474 "%s assignment: "
2475 "'%s' object layout differs from '%s'",
2476 attr,
2477 new->tp_name,
2478 old->tp_name);
2479 return 0;
2480 }
Tim Petersea7f75d2002-12-07 21:39:16 +00002481
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002482 return 1;
2483}
2484
2485static int
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002486object_set_class(PyObject *self, PyObject *value, void *closure)
2487{
2488 PyTypeObject *old = self->ob_type;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002489 PyTypeObject *new;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002490
Guido van Rossumb6b89422002-04-15 01:03:30 +00002491 if (value == NULL) {
2492 PyErr_SetString(PyExc_TypeError,
2493 "can't delete __class__ attribute");
2494 return -1;
2495 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002496 if (!PyType_Check(value)) {
2497 PyErr_Format(PyExc_TypeError,
2498 "__class__ must be set to new-style class, not '%s' object",
2499 value->ob_type->tp_name);
2500 return -1;
2501 }
2502 new = (PyTypeObject *)value;
Guido van Rossum40af8892002-08-10 05:42:07 +00002503 if (!(new->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
2504 !(old->tp_flags & Py_TPFLAGS_HEAPTYPE))
2505 {
2506 PyErr_Format(PyExc_TypeError,
2507 "__class__ assignment: only for heap types");
2508 return -1;
2509 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002510 if (compatible_for_assignment(new, old, "__class__")) {
2511 Py_INCREF(new);
2512 self->ob_type = new;
2513 Py_DECREF(old);
2514 return 0;
2515 }
2516 else {
Guido van Rossum9ee4b942002-05-24 18:47:47 +00002517 return -1;
2518 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002519}
2520
2521static PyGetSetDef object_getsets[] = {
2522 {"__class__", object_get_class, object_set_class,
Neal Norwitz858e34f2002-08-13 17:18:45 +00002523 PyDoc_STR("the object's class")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002524 {0}
2525};
2526
Guido van Rossumc53f0092003-02-18 22:05:12 +00002527
Guido van Rossum036f9992003-02-21 22:02:54 +00002528/* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
2529 We fall back to helpers in copy_reg for:
2530 - pickle protocols < 2
2531 - calculating the list of slot names (done only once per class)
2532 - the __newobj__ function (which is used as a token but never called)
2533*/
2534
2535static PyObject *
2536import_copy_reg(void)
2537{
2538 static PyObject *copy_reg_str;
Guido van Rossum3926a632001-09-25 16:25:58 +00002539
2540 if (!copy_reg_str) {
2541 copy_reg_str = PyString_InternFromString("copy_reg");
2542 if (copy_reg_str == NULL)
2543 return NULL;
2544 }
Guido van Rossum036f9992003-02-21 22:02:54 +00002545
2546 return PyImport_Import(copy_reg_str);
2547}
2548
2549static PyObject *
2550slotnames(PyObject *cls)
2551{
2552 PyObject *clsdict;
2553 PyObject *copy_reg;
2554 PyObject *slotnames;
2555
2556 if (!PyType_Check(cls)) {
2557 Py_INCREF(Py_None);
2558 return Py_None;
2559 }
2560
2561 clsdict = ((PyTypeObject *)cls)->tp_dict;
2562 slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
Armin Rigoec862b92005-09-24 22:58:41 +00002563 if (slotnames != NULL && PyList_Check(slotnames)) {
Guido van Rossum036f9992003-02-21 22:02:54 +00002564 Py_INCREF(slotnames);
2565 return slotnames;
2566 }
2567
2568 copy_reg = import_copy_reg();
2569 if (copy_reg == NULL)
2570 return NULL;
2571
2572 slotnames = PyObject_CallMethod(copy_reg, "_slotnames", "O", cls);
2573 Py_DECREF(copy_reg);
2574 if (slotnames != NULL &&
2575 slotnames != Py_None &&
2576 !PyList_Check(slotnames))
2577 {
2578 PyErr_SetString(PyExc_TypeError,
2579 "copy_reg._slotnames didn't return a list or None");
2580 Py_DECREF(slotnames);
2581 slotnames = NULL;
2582 }
2583
2584 return slotnames;
2585}
2586
2587static PyObject *
2588reduce_2(PyObject *obj)
2589{
2590 PyObject *cls, *getnewargs;
2591 PyObject *args = NULL, *args2 = NULL;
2592 PyObject *getstate = NULL, *state = NULL, *names = NULL;
2593 PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
2594 PyObject *copy_reg = NULL, *newobj = NULL, *res = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002595 Py_ssize_t i, n;
Guido van Rossum036f9992003-02-21 22:02:54 +00002596
2597 cls = PyObject_GetAttrString(obj, "__class__");
2598 if (cls == NULL)
2599 return NULL;
2600
2601 getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
2602 if (getnewargs != NULL) {
2603 args = PyObject_CallObject(getnewargs, NULL);
2604 Py_DECREF(getnewargs);
2605 if (args != NULL && !PyTuple_Check(args)) {
2606 PyErr_SetString(PyExc_TypeError,
2607 "__getnewargs__ should return a tuple");
2608 goto end;
2609 }
2610 }
2611 else {
2612 PyErr_Clear();
2613 args = PyTuple_New(0);
2614 }
2615 if (args == NULL)
2616 goto end;
2617
2618 getstate = PyObject_GetAttrString(obj, "__getstate__");
2619 if (getstate != NULL) {
2620 state = PyObject_CallObject(getstate, NULL);
2621 Py_DECREF(getstate);
Neal Norwitze2fdc612003-06-08 13:19:58 +00002622 if (state == NULL)
2623 goto end;
Guido van Rossum036f9992003-02-21 22:02:54 +00002624 }
2625 else {
Jim Fulton8a1a5942004-02-08 04:21:26 +00002626 PyErr_Clear();
Guido van Rossum036f9992003-02-21 22:02:54 +00002627 state = PyObject_GetAttrString(obj, "__dict__");
2628 if (state == NULL) {
2629 PyErr_Clear();
2630 state = Py_None;
2631 Py_INCREF(state);
2632 }
2633 names = slotnames(cls);
2634 if (names == NULL)
2635 goto end;
2636 if (names != Py_None) {
2637 assert(PyList_Check(names));
2638 slots = PyDict_New();
2639 if (slots == NULL)
2640 goto end;
2641 n = 0;
2642 /* Can't pre-compute the list size; the list
2643 is stored on the class so accessible to other
2644 threads, which may be run by DECREF */
2645 for (i = 0; i < PyList_GET_SIZE(names); i++) {
2646 PyObject *name, *value;
2647 name = PyList_GET_ITEM(names, i);
2648 value = PyObject_GetAttr(obj, name);
2649 if (value == NULL)
2650 PyErr_Clear();
2651 else {
2652 int err = PyDict_SetItem(slots, name,
2653 value);
2654 Py_DECREF(value);
2655 if (err)
2656 goto end;
2657 n++;
2658 }
2659 }
2660 if (n) {
2661 state = Py_BuildValue("(NO)", state, slots);
2662 if (state == NULL)
2663 goto end;
2664 }
2665 }
2666 }
2667
2668 if (!PyList_Check(obj)) {
2669 listitems = Py_None;
2670 Py_INCREF(listitems);
2671 }
2672 else {
2673 listitems = PyObject_GetIter(obj);
2674 if (listitems == NULL)
2675 goto end;
2676 }
2677
2678 if (!PyDict_Check(obj)) {
2679 dictitems = Py_None;
2680 Py_INCREF(dictitems);
2681 }
2682 else {
2683 dictitems = PyObject_CallMethod(obj, "iteritems", "");
2684 if (dictitems == NULL)
2685 goto end;
2686 }
2687
2688 copy_reg = import_copy_reg();
2689 if (copy_reg == NULL)
2690 goto end;
2691 newobj = PyObject_GetAttrString(copy_reg, "__newobj__");
2692 if (newobj == NULL)
2693 goto end;
2694
2695 n = PyTuple_GET_SIZE(args);
2696 args2 = PyTuple_New(n+1);
2697 if (args2 == NULL)
2698 goto end;
2699 PyTuple_SET_ITEM(args2, 0, cls);
2700 cls = NULL;
2701 for (i = 0; i < n; i++) {
2702 PyObject *v = PyTuple_GET_ITEM(args, i);
2703 Py_INCREF(v);
2704 PyTuple_SET_ITEM(args2, i+1, v);
2705 }
2706
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002707 res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
Guido van Rossum036f9992003-02-21 22:02:54 +00002708
2709 end:
2710 Py_XDECREF(cls);
2711 Py_XDECREF(args);
2712 Py_XDECREF(args2);
Jeremy Hyltond06483c2003-04-09 21:01:42 +00002713 Py_XDECREF(slots);
Guido van Rossum036f9992003-02-21 22:02:54 +00002714 Py_XDECREF(state);
2715 Py_XDECREF(names);
2716 Py_XDECREF(listitems);
2717 Py_XDECREF(dictitems);
2718 Py_XDECREF(copy_reg);
2719 Py_XDECREF(newobj);
2720 return res;
2721}
2722
2723static PyObject *
2724object_reduce_ex(PyObject *self, PyObject *args)
2725{
2726 /* Call copy_reg._reduce_ex(self, proto) */
2727 PyObject *reduce, *copy_reg, *res;
2728 int proto = 0;
2729
2730 if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
2731 return NULL;
2732
2733 reduce = PyObject_GetAttrString(self, "__reduce__");
2734 if (reduce == NULL)
2735 PyErr_Clear();
2736 else {
2737 PyObject *cls, *clsreduce, *objreduce;
2738 int override;
2739 cls = PyObject_GetAttrString(self, "__class__");
2740 if (cls == NULL) {
2741 Py_DECREF(reduce);
2742 return NULL;
2743 }
2744 clsreduce = PyObject_GetAttrString(cls, "__reduce__");
2745 Py_DECREF(cls);
2746 if (clsreduce == NULL) {
2747 Py_DECREF(reduce);
2748 return NULL;
2749 }
2750 objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
2751 "__reduce__");
2752 override = (clsreduce != objreduce);
2753 Py_DECREF(clsreduce);
2754 if (override) {
2755 res = PyObject_CallObject(reduce, NULL);
2756 Py_DECREF(reduce);
2757 return res;
2758 }
2759 else
2760 Py_DECREF(reduce);
2761 }
2762
2763 if (proto >= 2)
2764 return reduce_2(self);
2765
2766 copy_reg = import_copy_reg();
Guido van Rossum3926a632001-09-25 16:25:58 +00002767 if (!copy_reg)
2768 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00002769
Guido van Rossumc53f0092003-02-18 22:05:12 +00002770 res = PyEval_CallMethod(copy_reg, "_reduce_ex", "(Oi)", self, proto);
Guido van Rossum3926a632001-09-25 16:25:58 +00002771 Py_DECREF(copy_reg);
Guido van Rossum036f9992003-02-21 22:02:54 +00002772
Guido van Rossum3926a632001-09-25 16:25:58 +00002773 return res;
2774}
2775
2776static PyMethodDef object_methods[] = {
Guido van Rossumc53f0092003-02-18 22:05:12 +00002777 {"__reduce_ex__", object_reduce_ex, METH_VARARGS,
2778 PyDoc_STR("helper for pickle")},
2779 {"__reduce__", object_reduce_ex, METH_VARARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002780 PyDoc_STR("helper for pickle")},
Guido van Rossum3926a632001-09-25 16:25:58 +00002781 {0}
2782};
2783
Guido van Rossum036f9992003-02-21 22:02:54 +00002784
Tim Peters6d6c1a32001-08-02 04:15:00 +00002785PyTypeObject PyBaseObject_Type = {
2786 PyObject_HEAD_INIT(&PyType_Type)
2787 0, /* ob_size */
2788 "object", /* tp_name */
2789 sizeof(PyObject), /* tp_basicsize */
2790 0, /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00002791 object_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002792 0, /* tp_print */
2793 0, /* tp_getattr */
2794 0, /* tp_setattr */
2795 0, /* tp_compare */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002796 object_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002797 0, /* tp_as_number */
2798 0, /* tp_as_sequence */
2799 0, /* tp_as_mapping */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002800 object_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002801 0, /* tp_call */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002802 object_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002803 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +00002804 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002805 0, /* tp_as_buffer */
2806 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002807 PyDoc_STR("The most base type"), /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002808 0, /* tp_traverse */
2809 0, /* tp_clear */
2810 0, /* tp_richcompare */
2811 0, /* tp_weaklistoffset */
2812 0, /* tp_iter */
2813 0, /* tp_iternext */
Guido van Rossum3926a632001-09-25 16:25:58 +00002814 object_methods, /* tp_methods */
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002815 0, /* tp_members */
2816 object_getsets, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002817 0, /* tp_base */
2818 0, /* tp_dict */
2819 0, /* tp_descr_get */
2820 0, /* tp_descr_set */
2821 0, /* tp_dictoffset */
2822 object_init, /* tp_init */
2823 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossum298e4212003-02-13 16:30:16 +00002824 object_new, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002825 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002826};
2827
2828
2829/* Initialize the __dict__ in a type object */
2830
2831static int
2832add_methods(PyTypeObject *type, PyMethodDef *meth)
2833{
Guido van Rossum687ae002001-10-15 22:03:32 +00002834 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002835
2836 for (; meth->ml_name != NULL; meth++) {
2837 PyObject *descr;
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002838 if (PyDict_GetItemString(dict, meth->ml_name) &&
2839 !(meth->ml_flags & METH_COEXIST))
2840 continue;
Fred Drake7bf97152002-03-28 05:33:33 +00002841 if (meth->ml_flags & METH_CLASS) {
2842 if (meth->ml_flags & METH_STATIC) {
2843 PyErr_SetString(PyExc_ValueError,
2844 "method cannot be both class and static");
2845 return -1;
2846 }
Tim Petersbca1cbc2002-12-09 22:56:13 +00002847 descr = PyDescr_NewClassMethod(type, meth);
Fred Drake7bf97152002-03-28 05:33:33 +00002848 }
2849 else if (meth->ml_flags & METH_STATIC) {
Guido van Rossum9af48ff2003-02-11 17:12:46 +00002850 PyObject *cfunc = PyCFunction_New(meth, NULL);
2851 if (cfunc == NULL)
2852 return -1;
2853 descr = PyStaticMethod_New(cfunc);
2854 Py_DECREF(cfunc);
Fred Drake7bf97152002-03-28 05:33:33 +00002855 }
2856 else {
2857 descr = PyDescr_NewMethod(type, meth);
2858 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002859 if (descr == NULL)
2860 return -1;
Fred Drake7bf97152002-03-28 05:33:33 +00002861 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002862 return -1;
2863 Py_DECREF(descr);
2864 }
2865 return 0;
2866}
2867
2868static int
Guido van Rossum6f799372001-09-20 20:46:19 +00002869add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002870{
Guido van Rossum687ae002001-10-15 22:03:32 +00002871 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002872
2873 for (; memb->name != NULL; memb++) {
2874 PyObject *descr;
2875 if (PyDict_GetItemString(dict, memb->name))
2876 continue;
2877 descr = PyDescr_NewMember(type, memb);
2878 if (descr == NULL)
2879 return -1;
2880 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
2881 return -1;
2882 Py_DECREF(descr);
2883 }
2884 return 0;
2885}
2886
2887static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00002888add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002889{
Guido van Rossum687ae002001-10-15 22:03:32 +00002890 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002891
2892 for (; gsp->name != NULL; gsp++) {
2893 PyObject *descr;
2894 if (PyDict_GetItemString(dict, gsp->name))
2895 continue;
2896 descr = PyDescr_NewGetSet(type, gsp);
2897
2898 if (descr == NULL)
2899 return -1;
2900 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
2901 return -1;
2902 Py_DECREF(descr);
2903 }
2904 return 0;
2905}
2906
Guido van Rossum13d52f02001-08-10 21:24:08 +00002907static void
2908inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002909{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002910 Py_ssize_t oldsize, newsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002911
Guido van Rossum13d52f02001-08-10 21:24:08 +00002912 /* Special flag magic */
2913 if (!type->tp_as_buffer && base->tp_as_buffer) {
2914 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
2915 type->tp_flags |=
2916 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
2917 }
2918 if (!type->tp_as_sequence && base->tp_as_sequence) {
2919 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
2920 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
2921 }
2922 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
2923 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
2924 if ((!type->tp_as_number && base->tp_as_number) ||
2925 (!type->tp_as_sequence && base->tp_as_sequence)) {
2926 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
2927 if (!type->tp_as_number && !type->tp_as_sequence) {
2928 type->tp_flags |= base->tp_flags &
2929 Py_TPFLAGS_HAVE_INPLACEOPS;
2930 }
2931 }
2932 /* Wow */
2933 }
2934 if (!type->tp_as_number && base->tp_as_number) {
2935 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
2936 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
2937 }
2938
2939 /* Copying basicsize is connected to the GC flags */
Neil Schemenauerc806c882001-08-29 23:54:54 +00002940 oldsize = base->tp_basicsize;
2941 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
2942 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
2943 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
Guido van Rossum13d52f02001-08-10 21:24:08 +00002944 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
2945 (!type->tp_traverse && !type->tp_clear)) {
Neil Schemenauerc806c882001-08-29 23:54:54 +00002946 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum13d52f02001-08-10 21:24:08 +00002947 if (type->tp_traverse == NULL)
2948 type->tp_traverse = base->tp_traverse;
2949 if (type->tp_clear == NULL)
2950 type->tp_clear = base->tp_clear;
2951 }
2952 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
Guido van Rossumf884b742001-12-17 17:14:22 +00002953 /* The condition below could use some explanation.
2954 It appears that tp_new is not inherited for static types
2955 whose base class is 'object'; this seems to be a precaution
2956 so that old extension types don't suddenly become
2957 callable (object.__new__ wouldn't insure the invariants
2958 that the extension type's own factory function ensures).
2959 Heap types, of course, are under our control, so they do
2960 inherit tp_new; static extension types that specify some
2961 other built-in type as the default are considered
2962 new-style-aware so they also inherit object.__new__. */
Guido van Rossum13d52f02001-08-10 21:24:08 +00002963 if (base != &PyBaseObject_Type ||
2964 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2965 if (type->tp_new == NULL)
2966 type->tp_new = base->tp_new;
2967 }
2968 }
Neil Schemenauerc806c882001-08-29 23:54:54 +00002969 type->tp_basicsize = newsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00002970
2971 /* Copy other non-function slots */
2972
2973#undef COPYVAL
2974#define COPYVAL(SLOT) \
2975 if (type->SLOT == 0) type->SLOT = base->SLOT
2976
2977 COPYVAL(tp_itemsize);
2978 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
2979 COPYVAL(tp_weaklistoffset);
2980 }
2981 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
2982 COPYVAL(tp_dictoffset);
2983 }
Guido van Rossum13d52f02001-08-10 21:24:08 +00002984}
2985
2986static void
2987inherit_slots(PyTypeObject *type, PyTypeObject *base)
2988{
2989 PyTypeObject *basebase;
2990
2991#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00002992#undef COPYSLOT
2993#undef COPYNUM
2994#undef COPYSEQ
2995#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00002996#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00002997
2998#define SLOTDEFINED(SLOT) \
2999 (base->SLOT != 0 && \
3000 (basebase == NULL || base->SLOT != basebase->SLOT))
3001
Tim Peters6d6c1a32001-08-02 04:15:00 +00003002#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00003003 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00003004
3005#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
3006#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
3007#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003008#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003009
Guido van Rossum13d52f02001-08-10 21:24:08 +00003010 /* This won't inherit indirect slots (from tp_as_number etc.)
3011 if type doesn't provide the space. */
3012
3013 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
3014 basebase = base->tp_base;
3015 if (basebase->tp_as_number == NULL)
3016 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003017 COPYNUM(nb_add);
3018 COPYNUM(nb_subtract);
3019 COPYNUM(nb_multiply);
3020 COPYNUM(nb_divide);
3021 COPYNUM(nb_remainder);
3022 COPYNUM(nb_divmod);
3023 COPYNUM(nb_power);
3024 COPYNUM(nb_negative);
3025 COPYNUM(nb_positive);
3026 COPYNUM(nb_absolute);
3027 COPYNUM(nb_nonzero);
3028 COPYNUM(nb_invert);
3029 COPYNUM(nb_lshift);
3030 COPYNUM(nb_rshift);
3031 COPYNUM(nb_and);
3032 COPYNUM(nb_xor);
3033 COPYNUM(nb_or);
3034 COPYNUM(nb_coerce);
3035 COPYNUM(nb_int);
3036 COPYNUM(nb_long);
3037 COPYNUM(nb_float);
3038 COPYNUM(nb_oct);
3039 COPYNUM(nb_hex);
3040 COPYNUM(nb_inplace_add);
3041 COPYNUM(nb_inplace_subtract);
3042 COPYNUM(nb_inplace_multiply);
3043 COPYNUM(nb_inplace_divide);
3044 COPYNUM(nb_inplace_remainder);
3045 COPYNUM(nb_inplace_power);
3046 COPYNUM(nb_inplace_lshift);
3047 COPYNUM(nb_inplace_rshift);
3048 COPYNUM(nb_inplace_and);
3049 COPYNUM(nb_inplace_xor);
3050 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00003051 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
3052 COPYNUM(nb_true_divide);
3053 COPYNUM(nb_floor_divide);
3054 COPYNUM(nb_inplace_true_divide);
3055 COPYNUM(nb_inplace_floor_divide);
3056 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003057 if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
3058 COPYNUM(nb_index);
3059 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003060 }
3061
Guido van Rossum13d52f02001-08-10 21:24:08 +00003062 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
3063 basebase = base->tp_base;
3064 if (basebase->tp_as_sequence == NULL)
3065 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003066 COPYSEQ(sq_length);
3067 COPYSEQ(sq_concat);
3068 COPYSEQ(sq_repeat);
3069 COPYSEQ(sq_item);
3070 COPYSEQ(sq_slice);
3071 COPYSEQ(sq_ass_item);
3072 COPYSEQ(sq_ass_slice);
3073 COPYSEQ(sq_contains);
3074 COPYSEQ(sq_inplace_concat);
3075 COPYSEQ(sq_inplace_repeat);
3076 }
3077
Guido van Rossum13d52f02001-08-10 21:24:08 +00003078 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
3079 basebase = base->tp_base;
3080 if (basebase->tp_as_mapping == NULL)
3081 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003082 COPYMAP(mp_length);
3083 COPYMAP(mp_subscript);
3084 COPYMAP(mp_ass_subscript);
3085 }
3086
Tim Petersfc57ccb2001-10-12 02:38:24 +00003087 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
3088 basebase = base->tp_base;
3089 if (basebase->tp_as_buffer == NULL)
3090 basebase = NULL;
3091 COPYBUF(bf_getreadbuffer);
3092 COPYBUF(bf_getwritebuffer);
3093 COPYBUF(bf_getsegcount);
3094 COPYBUF(bf_getcharbuffer);
3095 }
3096
Guido van Rossum13d52f02001-08-10 21:24:08 +00003097 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003098
Tim Peters6d6c1a32001-08-02 04:15:00 +00003099 COPYSLOT(tp_dealloc);
3100 COPYSLOT(tp_print);
3101 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
3102 type->tp_getattr = base->tp_getattr;
3103 type->tp_getattro = base->tp_getattro;
3104 }
3105 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
3106 type->tp_setattr = base->tp_setattr;
3107 type->tp_setattro = base->tp_setattro;
3108 }
3109 /* tp_compare see tp_richcompare */
3110 COPYSLOT(tp_repr);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003111 /* tp_hash see tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003112 COPYSLOT(tp_call);
3113 COPYSLOT(tp_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003114 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003115 if (type->tp_compare == NULL &&
3116 type->tp_richcompare == NULL &&
3117 type->tp_hash == NULL)
3118 {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003119 type->tp_compare = base->tp_compare;
3120 type->tp_richcompare = base->tp_richcompare;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003121 type->tp_hash = base->tp_hash;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003122 }
3123 }
3124 else {
3125 COPYSLOT(tp_compare);
3126 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003127 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
3128 COPYSLOT(tp_iter);
3129 COPYSLOT(tp_iternext);
3130 }
3131 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
3132 COPYSLOT(tp_descr_get);
3133 COPYSLOT(tp_descr_set);
3134 COPYSLOT(tp_dictoffset);
3135 COPYSLOT(tp_init);
3136 COPYSLOT(tp_alloc);
Guido van Rossumcc8fe042002-04-05 17:10:16 +00003137 COPYSLOT(tp_is_gc);
Tim Peters3cfe7542003-05-21 21:29:48 +00003138 if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
3139 (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
3140 /* They agree about gc. */
3141 COPYSLOT(tp_free);
3142 }
3143 else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3144 type->tp_free == NULL &&
3145 base->tp_free == _PyObject_Del) {
3146 /* A bit of magic to plug in the correct default
3147 * tp_free function when a derived class adds gc,
3148 * didn't define tp_free, and the base uses the
3149 * default non-gc tp_free.
3150 */
3151 type->tp_free = PyObject_GC_Del;
3152 }
3153 /* else they didn't agree about gc, and there isn't something
3154 * obvious to be done -- the type is on its own.
3155 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003156 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003157}
3158
Jeremy Hylton938ace62002-07-17 16:30:39 +00003159static int add_operators(PyTypeObject *);
Guido van Rossum13d52f02001-08-10 21:24:08 +00003160
Tim Peters6d6c1a32001-08-02 04:15:00 +00003161int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00003162PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003163{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003164 PyObject *dict, *bases;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003165 PyTypeObject *base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003166 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003167
Guido van Rossumcab05802002-06-10 15:29:03 +00003168 if (type->tp_flags & Py_TPFLAGS_READY) {
3169 assert(type->tp_dict != NULL);
Guido van Rossumd614f972001-08-10 17:39:49 +00003170 return 0;
Guido van Rossumcab05802002-06-10 15:29:03 +00003171 }
Guido van Rossumd614f972001-08-10 17:39:49 +00003172 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00003173
3174 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003175
Tim Peters36eb4df2003-03-23 03:33:13 +00003176#ifdef Py_TRACE_REFS
3177 /* PyType_Ready is the closest thing we have to a choke point
3178 * for type objects, so is the best place I can think of to try
3179 * to get type objects into the doubly-linked list of all objects.
3180 * Still, not all type objects go thru PyType_Ready.
3181 */
Tim Peters7571a0f2003-03-23 17:52:28 +00003182 _Py_AddToAllObjects((PyObject *)type, 0);
Tim Peters36eb4df2003-03-23 03:33:13 +00003183#endif
3184
Tim Peters6d6c1a32001-08-02 04:15:00 +00003185 /* Initialize tp_base (defaults to BaseObject unless that's us) */
3186 base = type->tp_base;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003187 if (base == NULL && type != &PyBaseObject_Type) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003188 base = type->tp_base = &PyBaseObject_Type;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003189 Py_INCREF(base);
3190 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003191
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003192 /* Now the only way base can still be NULL is if type is
3193 * &PyBaseObject_Type.
3194 */
3195
Guido van Rossum323a9cf2002-08-14 17:26:30 +00003196 /* Initialize the base class */
3197 if (base && base->tp_dict == NULL) {
3198 if (PyType_Ready(base) < 0)
3199 goto error;
3200 }
3201
Guido van Rossum0986d822002-04-08 01:38:42 +00003202 /* Initialize ob_type if NULL. This means extensions that want to be
3203 compilable separately on Windows can call PyType_Ready() instead of
3204 initializing the ob_type field of their type objects. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003205 /* The test for base != NULL is really unnecessary, since base is only
3206 NULL when type is &PyBaseObject_Type, and we know its ob_type is
3207 not NULL (it's initialized to &PyType_Type). But coverity doesn't
3208 know that. */
3209 if (type->ob_type == NULL && base != NULL)
Guido van Rossum0986d822002-04-08 01:38:42 +00003210 type->ob_type = base->ob_type;
3211
Tim Peters6d6c1a32001-08-02 04:15:00 +00003212 /* Initialize tp_bases */
3213 bases = type->tp_bases;
3214 if (bases == NULL) {
3215 if (base == NULL)
3216 bases = PyTuple_New(0);
3217 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003218 bases = PyTuple_Pack(1, base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003219 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003220 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003221 type->tp_bases = bases;
3222 }
3223
Guido van Rossum687ae002001-10-15 22:03:32 +00003224 /* Initialize tp_dict */
3225 dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003226 if (dict == NULL) {
3227 dict = PyDict_New();
3228 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003229 goto error;
Guido van Rossum687ae002001-10-15 22:03:32 +00003230 type->tp_dict = dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003231 }
3232
Guido van Rossum687ae002001-10-15 22:03:32 +00003233 /* Add type-specific descriptors to tp_dict */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003234 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003235 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003236 if (type->tp_methods != NULL) {
3237 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003238 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003239 }
3240 if (type->tp_members != NULL) {
3241 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003242 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003243 }
3244 if (type->tp_getset != NULL) {
3245 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003246 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003247 }
3248
Tim Peters6d6c1a32001-08-02 04:15:00 +00003249 /* Calculate method resolution order */
3250 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00003251 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003252 }
3253
Guido van Rossum13d52f02001-08-10 21:24:08 +00003254 /* Inherit special flags from dominant base */
3255 if (type->tp_base != NULL)
3256 inherit_special(type, type->tp_base);
3257
Tim Peters6d6c1a32001-08-02 04:15:00 +00003258 /* Initialize tp_dict properly */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003259 bases = type->tp_mro;
3260 assert(bases != NULL);
3261 assert(PyTuple_Check(bases));
3262 n = PyTuple_GET_SIZE(bases);
3263 for (i = 1; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003264 PyObject *b = PyTuple_GET_ITEM(bases, i);
3265 if (PyType_Check(b))
3266 inherit_slots(type, (PyTypeObject *)b);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003267 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003268
Tim Peters3cfe7542003-05-21 21:29:48 +00003269 /* Sanity check for tp_free. */
3270 if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
3271 (type->tp_free == NULL || type->tp_free == PyObject_Del)) {
3272 /* This base class needs to call tp_free, but doesn't have
3273 * one, or its tp_free is for non-gc'ed objects.
3274 */
3275 PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
3276 "gc and is a base type but has inappropriate "
3277 "tp_free slot",
3278 type->tp_name);
3279 goto error;
3280 }
3281
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003282 /* if the type dictionary doesn't contain a __doc__, set it from
3283 the tp_doc slot.
3284 */
3285 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
3286 if (type->tp_doc != NULL) {
3287 PyObject *doc = PyString_FromString(type->tp_doc);
3288 PyDict_SetItemString(type->tp_dict, "__doc__", doc);
3289 Py_DECREF(doc);
3290 } else {
Guido van Rossumd4641072002-04-03 02:13:37 +00003291 PyDict_SetItemString(type->tp_dict,
3292 "__doc__", Py_None);
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003293 }
3294 }
3295
Guido van Rossum13d52f02001-08-10 21:24:08 +00003296 /* Some more special stuff */
3297 base = type->tp_base;
3298 if (base != NULL) {
3299 if (type->tp_as_number == NULL)
3300 type->tp_as_number = base->tp_as_number;
3301 if (type->tp_as_sequence == NULL)
3302 type->tp_as_sequence = base->tp_as_sequence;
3303 if (type->tp_as_mapping == NULL)
3304 type->tp_as_mapping = base->tp_as_mapping;
Guido van Rossumeea47182003-02-11 20:39:59 +00003305 if (type->tp_as_buffer == NULL)
3306 type->tp_as_buffer = base->tp_as_buffer;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003307 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003308
Guido van Rossum1c450732001-10-08 15:18:27 +00003309 /* Link into each base class's list of subclasses */
3310 bases = type->tp_bases;
3311 n = PyTuple_GET_SIZE(bases);
3312 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003313 PyObject *b = PyTuple_GET_ITEM(bases, i);
3314 if (PyType_Check(b) &&
3315 add_subclass((PyTypeObject *)b, type) < 0)
Guido van Rossum1c450732001-10-08 15:18:27 +00003316 goto error;
3317 }
3318
Guido van Rossum13d52f02001-08-10 21:24:08 +00003319 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00003320 assert(type->tp_dict != NULL);
3321 type->tp_flags =
3322 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003323 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00003324
3325 error:
3326 type->tp_flags &= ~Py_TPFLAGS_READYING;
3327 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003328}
3329
Guido van Rossum1c450732001-10-08 15:18:27 +00003330static int
3331add_subclass(PyTypeObject *base, PyTypeObject *type)
3332{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003333 Py_ssize_t i;
3334 int result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003335 PyObject *list, *ref, *new;
3336
3337 list = base->tp_subclasses;
3338 if (list == NULL) {
3339 base->tp_subclasses = list = PyList_New(0);
3340 if (list == NULL)
3341 return -1;
3342 }
3343 assert(PyList_Check(list));
3344 new = PyWeakref_NewRef((PyObject *)type, NULL);
3345 i = PyList_GET_SIZE(list);
3346 while (--i >= 0) {
3347 ref = PyList_GET_ITEM(list, i);
3348 assert(PyWeakref_CheckRef(ref));
Guido van Rossum3930bc32002-10-18 13:51:49 +00003349 if (PyWeakref_GET_OBJECT(ref) == Py_None)
3350 return PyList_SetItem(list, i, new);
Guido van Rossum1c450732001-10-08 15:18:27 +00003351 }
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003352 result = PyList_Append(list, new);
Guido van Rossum1c450732001-10-08 15:18:27 +00003353 Py_DECREF(new);
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003354 return result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003355}
3356
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003357static void
3358remove_subclass(PyTypeObject *base, PyTypeObject *type)
3359{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003360 Py_ssize_t i;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003361 PyObject *list, *ref;
3362
3363 list = base->tp_subclasses;
3364 if (list == NULL) {
3365 return;
3366 }
3367 assert(PyList_Check(list));
3368 i = PyList_GET_SIZE(list);
3369 while (--i >= 0) {
3370 ref = PyList_GET_ITEM(list, i);
3371 assert(PyWeakref_CheckRef(ref));
3372 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
3373 /* this can't fail, right? */
3374 PySequence_DelItem(list, i);
3375 return;
3376 }
3377 }
3378}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003379
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003380static int
3381check_num_args(PyObject *ob, int n)
3382{
3383 if (!PyTuple_CheckExact(ob)) {
3384 PyErr_SetString(PyExc_SystemError,
3385 "PyArg_UnpackTuple() argument list is not a tuple");
3386 return 0;
3387 }
3388 if (n == PyTuple_GET_SIZE(ob))
3389 return 1;
3390 PyErr_Format(
3391 PyExc_TypeError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00003392 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003393 return 0;
3394}
3395
Tim Peters6d6c1a32001-08-02 04:15:00 +00003396/* Generic wrappers for overloadable 'operators' such as __getitem__ */
3397
3398/* There's a wrapper *function* for each distinct function typedef used
3399 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
3400 wrapper *table* for each distinct operation (e.g. __len__, __add__).
3401 Most tables have only one entry; the tables for binary operators have two
3402 entries, one regular and one with reversed arguments. */
3403
3404static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003405wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003406{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003407 lenfunc func = (lenfunc)wrapped;
3408 Py_ssize_t res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003409
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003410 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003411 return NULL;
3412 res = (*func)(self);
3413 if (res == -1 && PyErr_Occurred())
3414 return NULL;
3415 return PyInt_FromLong((long)res);
3416}
3417
Tim Peters6d6c1a32001-08-02 04:15:00 +00003418static PyObject *
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003419wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
3420{
3421 inquiry func = (inquiry)wrapped;
3422 int res;
3423
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003424 if (!check_num_args(args, 0))
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003425 return NULL;
3426 res = (*func)(self);
3427 if (res == -1 && PyErr_Occurred())
3428 return NULL;
3429 return PyBool_FromLong((long)res);
3430}
3431
3432static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003433wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
3434{
3435 binaryfunc func = (binaryfunc)wrapped;
3436 PyObject *other;
3437
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003438 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003439 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003440 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003441 return (*func)(self, other);
3442}
3443
3444static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003445wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
3446{
3447 binaryfunc func = (binaryfunc)wrapped;
3448 PyObject *other;
3449
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003450 if (!check_num_args(args, 1))
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003451 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003452 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003453 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003454 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003455 Py_INCREF(Py_NotImplemented);
3456 return Py_NotImplemented;
3457 }
3458 return (*func)(self, other);
3459}
3460
3461static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003462wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3463{
3464 binaryfunc func = (binaryfunc)wrapped;
3465 PyObject *other;
3466
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003467 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003468 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003469 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003470 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003471 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003472 Py_INCREF(Py_NotImplemented);
3473 return Py_NotImplemented;
3474 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003475 return (*func)(other, self);
3476}
3477
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003478static PyObject *
3479wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
3480{
3481 coercion func = (coercion)wrapped;
3482 PyObject *other, *res;
3483 int ok;
3484
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003485 if (!check_num_args(args, 1))
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003486 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003487 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003488 ok = func(&self, &other);
3489 if (ok < 0)
3490 return NULL;
3491 if (ok > 0) {
3492 Py_INCREF(Py_NotImplemented);
3493 return Py_NotImplemented;
3494 }
3495 res = PyTuple_New(2);
3496 if (res == NULL) {
3497 Py_DECREF(self);
3498 Py_DECREF(other);
3499 return NULL;
3500 }
3501 PyTuple_SET_ITEM(res, 0, self);
3502 PyTuple_SET_ITEM(res, 1, other);
3503 return res;
3504}
3505
Tim Peters6d6c1a32001-08-02 04:15:00 +00003506static PyObject *
3507wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
3508{
3509 ternaryfunc func = (ternaryfunc)wrapped;
3510 PyObject *other;
3511 PyObject *third = Py_None;
3512
3513 /* Note: This wrapper only works for __pow__() */
3514
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003515 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003516 return NULL;
3517 return (*func)(self, other, third);
3518}
3519
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003520static PyObject *
3521wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3522{
3523 ternaryfunc func = (ternaryfunc)wrapped;
3524 PyObject *other;
3525 PyObject *third = Py_None;
3526
3527 /* Note: This wrapper only works for __pow__() */
3528
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003529 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003530 return NULL;
3531 return (*func)(other, self, third);
3532}
3533
Tim Peters6d6c1a32001-08-02 04:15:00 +00003534static PyObject *
3535wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
3536{
3537 unaryfunc func = (unaryfunc)wrapped;
3538
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003539 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003540 return NULL;
3541 return (*func)(self);
3542}
3543
Tim Peters6d6c1a32001-08-02 04:15:00 +00003544static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003545wrap_ssizeargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003546{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003547 ssizeargfunc func = (ssizeargfunc)wrapped;
3548 Py_ssize_t i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003549
Martin v. Löwis18e16552006-02-15 17:27:45 +00003550 if (!PyArg_ParseTuple(args, "n", &i))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003551 return NULL;
3552 return (*func)(self, i);
3553}
3554
Martin v. Löwis18e16552006-02-15 17:27:45 +00003555static Py_ssize_t
Guido van Rossum5d815f32001-08-17 21:57:47 +00003556getindex(PyObject *self, PyObject *arg)
3557{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003558 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003559
Martin v. Löwis18e16552006-02-15 17:27:45 +00003560 i = PyInt_AsSsize_t(arg);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003561 if (i == -1 && PyErr_Occurred())
3562 return -1;
3563 if (i < 0) {
3564 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
3565 if (sq && sq->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00003566 Py_ssize_t n = (*sq->sq_length)(self);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003567 if (n < 0)
3568 return -1;
3569 i += n;
3570 }
3571 }
3572 return i;
3573}
3574
3575static PyObject *
3576wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
3577{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003578 ssizeargfunc func = (ssizeargfunc)wrapped;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003579 PyObject *arg;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003580 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003581
Guido van Rossumf4593e02001-10-03 12:09:30 +00003582 if (PyTuple_GET_SIZE(args) == 1) {
3583 arg = PyTuple_GET_ITEM(args, 0);
3584 i = getindex(self, arg);
3585 if (i == -1 && PyErr_Occurred())
3586 return NULL;
3587 return (*func)(self, i);
3588 }
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003589 check_num_args(args, 1);
Guido van Rossumf4593e02001-10-03 12:09:30 +00003590 assert(PyErr_Occurred());
3591 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003592}
3593
Tim Peters6d6c1a32001-08-02 04:15:00 +00003594static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003595wrap_ssizessizeargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003596{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003597 ssizessizeargfunc func = (ssizessizeargfunc)wrapped;
3598 Py_ssize_t i, j;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003599
Martin v. Löwis18e16552006-02-15 17:27:45 +00003600 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003601 return NULL;
3602 return (*func)(self, i, j);
3603}
3604
Tim Peters6d6c1a32001-08-02 04:15:00 +00003605static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003606wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003607{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003608 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3609 Py_ssize_t i;
3610 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003611 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003612
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003613 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003614 return NULL;
3615 i = getindex(self, arg);
3616 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00003617 return NULL;
3618 res = (*func)(self, i, value);
3619 if (res == -1 && PyErr_Occurred())
3620 return NULL;
3621 Py_INCREF(Py_None);
3622 return Py_None;
3623}
3624
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003625static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003626wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003627{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003628 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3629 Py_ssize_t i;
3630 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003631 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003632
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003633 if (!check_num_args(args, 1))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003634 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003635 arg = PyTuple_GET_ITEM(args, 0);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003636 i = getindex(self, arg);
3637 if (i == -1 && PyErr_Occurred())
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003638 return NULL;
3639 res = (*func)(self, i, NULL);
3640 if (res == -1 && PyErr_Occurred())
3641 return NULL;
3642 Py_INCREF(Py_None);
3643 return Py_None;
3644}
3645
Tim Peters6d6c1a32001-08-02 04:15:00 +00003646static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003647wrap_ssizessizeobjargproc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003648{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003649 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3650 Py_ssize_t i, j;
3651 int res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003652 PyObject *value;
3653
Martin v. Löwis18e16552006-02-15 17:27:45 +00003654 if (!PyArg_ParseTuple(args, "nnO", &i, &j, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003655 return NULL;
3656 res = (*func)(self, i, j, value);
3657 if (res == -1 && PyErr_Occurred())
3658 return NULL;
3659 Py_INCREF(Py_None);
3660 return Py_None;
3661}
3662
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003663static PyObject *
3664wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
3665{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003666 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3667 Py_ssize_t i, j;
3668 int res;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003669
Martin v. Löwis18e16552006-02-15 17:27:45 +00003670 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003671 return NULL;
3672 res = (*func)(self, i, j, NULL);
3673 if (res == -1 && PyErr_Occurred())
3674 return NULL;
3675 Py_INCREF(Py_None);
3676 return Py_None;
3677}
3678
Tim Peters6d6c1a32001-08-02 04:15:00 +00003679/* XXX objobjproc is a misnomer; should be objargpred */
3680static PyObject *
3681wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
3682{
3683 objobjproc func = (objobjproc)wrapped;
3684 int res;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003685 PyObject *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003686
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003687 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003688 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003689 value = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003690 res = (*func)(self, value);
3691 if (res == -1 && PyErr_Occurred())
3692 return NULL;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003693 else
3694 return PyBool_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003695}
3696
Tim Peters6d6c1a32001-08-02 04:15:00 +00003697static PyObject *
3698wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
3699{
3700 objobjargproc func = (objobjargproc)wrapped;
3701 int res;
3702 PyObject *key, *value;
3703
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003704 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003705 return NULL;
3706 res = (*func)(self, key, value);
3707 if (res == -1 && PyErr_Occurred())
3708 return NULL;
3709 Py_INCREF(Py_None);
3710 return Py_None;
3711}
3712
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003713static PyObject *
3714wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
3715{
3716 objobjargproc func = (objobjargproc)wrapped;
3717 int res;
3718 PyObject *key;
3719
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003720 if (!check_num_args(args, 1))
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003721 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003722 key = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003723 res = (*func)(self, key, NULL);
3724 if (res == -1 && PyErr_Occurred())
3725 return NULL;
3726 Py_INCREF(Py_None);
3727 return Py_None;
3728}
3729
Tim Peters6d6c1a32001-08-02 04:15:00 +00003730static PyObject *
3731wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
3732{
3733 cmpfunc func = (cmpfunc)wrapped;
3734 int res;
3735 PyObject *other;
3736
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003737 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003738 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003739 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00003740 if (other->ob_type->tp_compare != func &&
3741 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossumceccae52001-09-18 20:03:57 +00003742 PyErr_Format(
3743 PyExc_TypeError,
3744 "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
3745 self->ob_type->tp_name,
3746 self->ob_type->tp_name,
3747 other->ob_type->tp_name);
3748 return NULL;
3749 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003750 res = (*func)(self, other);
3751 if (PyErr_Occurred())
3752 return NULL;
3753 return PyInt_FromLong((long)res);
3754}
3755
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003756/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
Guido van Rossum52b27052003-04-15 20:05:10 +00003757 This is called the Carlo Verre hack after its discoverer. */
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003758static int
3759hackcheck(PyObject *self, setattrofunc func, char *what)
3760{
3761 PyTypeObject *type = self->ob_type;
3762 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
3763 type = type->tp_base;
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003764 /* If type is NULL now, this is a really weird type.
3765 In the same of backwards compatibility (?), just shut up. */
3766 if (type && type->tp_setattro != func) {
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003767 PyErr_Format(PyExc_TypeError,
3768 "can't apply this %s to %s object",
3769 what,
3770 type->tp_name);
3771 return 0;
3772 }
3773 return 1;
3774}
3775
Tim Peters6d6c1a32001-08-02 04:15:00 +00003776static PyObject *
3777wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
3778{
3779 setattrofunc func = (setattrofunc)wrapped;
3780 int res;
3781 PyObject *name, *value;
3782
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003783 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003784 return NULL;
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003785 if (!hackcheck(self, func, "__setattr__"))
3786 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003787 res = (*func)(self, name, value);
3788 if (res < 0)
3789 return NULL;
3790 Py_INCREF(Py_None);
3791 return Py_None;
3792}
3793
3794static PyObject *
3795wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
3796{
3797 setattrofunc func = (setattrofunc)wrapped;
3798 int res;
3799 PyObject *name;
3800
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003801 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003802 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003803 name = PyTuple_GET_ITEM(args, 0);
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003804 if (!hackcheck(self, func, "__delattr__"))
3805 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003806 res = (*func)(self, name, NULL);
3807 if (res < 0)
3808 return NULL;
3809 Py_INCREF(Py_None);
3810 return Py_None;
3811}
3812
Tim Peters6d6c1a32001-08-02 04:15:00 +00003813static PyObject *
3814wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
3815{
3816 hashfunc func = (hashfunc)wrapped;
3817 long res;
3818
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003819 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003820 return NULL;
3821 res = (*func)(self);
3822 if (res == -1 && PyErr_Occurred())
3823 return NULL;
3824 return PyInt_FromLong(res);
3825}
3826
Tim Peters6d6c1a32001-08-02 04:15:00 +00003827static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00003828wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003829{
3830 ternaryfunc func = (ternaryfunc)wrapped;
3831
Guido van Rossumc8e56452001-10-22 00:43:43 +00003832 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003833}
3834
Tim Peters6d6c1a32001-08-02 04:15:00 +00003835static PyObject *
3836wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
3837{
3838 richcmpfunc func = (richcmpfunc)wrapped;
3839 PyObject *other;
3840
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003841 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003842 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003843 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003844 return (*func)(self, other, op);
3845}
3846
3847#undef RICHCMP_WRAPPER
3848#define RICHCMP_WRAPPER(NAME, OP) \
3849static PyObject * \
3850richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
3851{ \
3852 return wrap_richcmpfunc(self, args, wrapped, OP); \
3853}
3854
Jack Jansen8e938b42001-08-08 15:29:49 +00003855RICHCMP_WRAPPER(lt, Py_LT)
3856RICHCMP_WRAPPER(le, Py_LE)
3857RICHCMP_WRAPPER(eq, Py_EQ)
3858RICHCMP_WRAPPER(ne, Py_NE)
3859RICHCMP_WRAPPER(gt, Py_GT)
3860RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003861
Tim Peters6d6c1a32001-08-02 04:15:00 +00003862static PyObject *
3863wrap_next(PyObject *self, PyObject *args, void *wrapped)
3864{
3865 unaryfunc func = (unaryfunc)wrapped;
3866 PyObject *res;
3867
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003868 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003869 return NULL;
3870 res = (*func)(self);
3871 if (res == NULL && !PyErr_Occurred())
3872 PyErr_SetNone(PyExc_StopIteration);
3873 return res;
3874}
3875
Tim Peters6d6c1a32001-08-02 04:15:00 +00003876static PyObject *
3877wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
3878{
3879 descrgetfunc func = (descrgetfunc)wrapped;
3880 PyObject *obj;
3881 PyObject *type = NULL;
3882
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003883 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003884 return NULL;
Guido van Rossum82ed25c2003-02-11 16:25:43 +00003885 if (obj == Py_None)
3886 obj = NULL;
3887 if (type == Py_None)
3888 type = NULL;
3889 if (type == NULL &&obj == NULL) {
3890 PyErr_SetString(PyExc_TypeError,
3891 "__get__(None, None) is invalid");
3892 return NULL;
3893 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003894 return (*func)(self, obj, type);
3895}
3896
Tim Peters6d6c1a32001-08-02 04:15:00 +00003897static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003898wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003899{
3900 descrsetfunc func = (descrsetfunc)wrapped;
3901 PyObject *obj, *value;
3902 int ret;
3903
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003904 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003905 return NULL;
3906 ret = (*func)(self, obj, value);
3907 if (ret < 0)
3908 return NULL;
3909 Py_INCREF(Py_None);
3910 return Py_None;
3911}
Guido van Rossum22b13872002-08-06 21:41:44 +00003912
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003913static PyObject *
3914wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
3915{
3916 descrsetfunc func = (descrsetfunc)wrapped;
3917 PyObject *obj;
3918 int ret;
3919
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003920 if (!check_num_args(args, 1))
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003921 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003922 obj = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003923 ret = (*func)(self, obj, NULL);
3924 if (ret < 0)
3925 return NULL;
3926 Py_INCREF(Py_None);
3927 return Py_None;
3928}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003929
Tim Peters6d6c1a32001-08-02 04:15:00 +00003930static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00003931wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003932{
3933 initproc func = (initproc)wrapped;
3934
Guido van Rossumc8e56452001-10-22 00:43:43 +00003935 if (func(self, args, kwds) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003936 return NULL;
3937 Py_INCREF(Py_None);
3938 return Py_None;
3939}
3940
Tim Peters6d6c1a32001-08-02 04:15:00 +00003941static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003942tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003943{
Barry Warsaw60f01882001-08-22 19:24:42 +00003944 PyTypeObject *type, *subtype, *staticbase;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003945 PyObject *arg0, *res;
3946
3947 if (self == NULL || !PyType_Check(self))
3948 Py_FatalError("__new__() called with non-type 'self'");
3949 type = (PyTypeObject *)self;
3950 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
Barry Warsaw60f01882001-08-22 19:24:42 +00003951 PyErr_Format(PyExc_TypeError,
3952 "%s.__new__(): not enough arguments",
3953 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003954 return NULL;
3955 }
3956 arg0 = PyTuple_GET_ITEM(args, 0);
3957 if (!PyType_Check(arg0)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00003958 PyErr_Format(PyExc_TypeError,
3959 "%s.__new__(X): X is not a type object (%s)",
3960 type->tp_name,
3961 arg0->ob_type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003962 return NULL;
3963 }
3964 subtype = (PyTypeObject *)arg0;
3965 if (!PyType_IsSubtype(subtype, type)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00003966 PyErr_Format(PyExc_TypeError,
3967 "%s.__new__(%s): %s is not a subtype of %s",
3968 type->tp_name,
3969 subtype->tp_name,
3970 subtype->tp_name,
3971 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003972 return NULL;
3973 }
Barry Warsaw60f01882001-08-22 19:24:42 +00003974
3975 /* Check that the use doesn't do something silly and unsafe like
Tim Petersa427a2b2001-10-29 22:25:45 +00003976 object.__new__(dict). To do this, we check that the
Barry Warsaw60f01882001-08-22 19:24:42 +00003977 most derived base that's not a heap type is this type. */
3978 staticbase = subtype;
3979 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
3980 staticbase = staticbase->tp_base;
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003981 /* If staticbase is NULL now, it is a really weird type.
3982 In the same of backwards compatibility (?), just shut up. */
3983 if (staticbase && staticbase->tp_new != type->tp_new) {
Barry Warsaw60f01882001-08-22 19:24:42 +00003984 PyErr_Format(PyExc_TypeError,
3985 "%s.__new__(%s) is not safe, use %s.__new__()",
3986 type->tp_name,
3987 subtype->tp_name,
3988 staticbase == NULL ? "?" : staticbase->tp_name);
3989 return NULL;
3990 }
3991
Guido van Rossum0d231ed2001-08-06 16:50:37 +00003992 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
3993 if (args == NULL)
3994 return NULL;
3995 res = type->tp_new(subtype, args, kwds);
3996 Py_DECREF(args);
3997 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003998}
3999
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004000static struct PyMethodDef tp_new_methoddef[] = {
4001 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00004002 PyDoc_STR("T.__new__(S, ...) -> "
4003 "a new object with type S, a subtype of T")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00004004 {0}
4005};
4006
4007static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004008add_tp_new_wrapper(PyTypeObject *type)
4009{
Guido van Rossumf040ede2001-08-07 16:40:56 +00004010 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004011
Guido van Rossum687ae002001-10-15 22:03:32 +00004012 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
Guido van Rossumf040ede2001-08-07 16:40:56 +00004013 return 0;
4014 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004015 if (func == NULL)
4016 return -1;
Raymond Hettinger8d726ee2004-06-25 22:24:35 +00004017 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
Raymond Hettingerd56cbe52004-06-25 22:17:39 +00004018 Py_DECREF(func);
4019 return -1;
4020 }
4021 Py_DECREF(func);
4022 return 0;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004023}
4024
Guido van Rossumf040ede2001-08-07 16:40:56 +00004025/* Slot wrappers that call the corresponding __foo__ slot. See comments
4026 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004027
Guido van Rossumdc91b992001-08-08 22:26:22 +00004028#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004029static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004030FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004031{ \
Guido van Rossum5592e4d2001-08-28 18:28:21 +00004032 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004033 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004034}
4035
Guido van Rossumdc91b992001-08-08 22:26:22 +00004036#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004037static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004038FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004039{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004040 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004041 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004042}
4043
Guido van Rossumcd118802003-01-06 22:57:47 +00004044/* Boolean helper for SLOT1BINFULL().
4045 right.__class__ is a nontrivial subclass of left.__class__. */
4046static int
4047method_is_overloaded(PyObject *left, PyObject *right, char *name)
4048{
4049 PyObject *a, *b;
4050 int ok;
4051
4052 b = PyObject_GetAttrString((PyObject *)(right->ob_type), name);
4053 if (b == NULL) {
4054 PyErr_Clear();
4055 /* If right doesn't have it, it's not overloaded */
4056 return 0;
4057 }
4058
4059 a = PyObject_GetAttrString((PyObject *)(left->ob_type), name);
4060 if (a == NULL) {
4061 PyErr_Clear();
4062 Py_DECREF(b);
4063 /* If right has it but left doesn't, it's overloaded */
4064 return 1;
4065 }
4066
4067 ok = PyObject_RichCompareBool(a, b, Py_NE);
4068 Py_DECREF(a);
4069 Py_DECREF(b);
4070 if (ok < 0) {
4071 PyErr_Clear();
4072 return 0;
4073 }
4074
4075 return ok;
4076}
4077
Guido van Rossumdc91b992001-08-08 22:26:22 +00004078
4079#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004080static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004081FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004082{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004083 static PyObject *cache_str, *rcache_str; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004084 int do_other = self->ob_type != other->ob_type && \
4085 other->ob_type->tp_as_number != NULL && \
4086 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004087 if (self->ob_type->tp_as_number != NULL && \
4088 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
4089 PyObject *r; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004090 if (do_other && \
Guido van Rossumcd118802003-01-06 22:57:47 +00004091 PyType_IsSubtype(other->ob_type, self->ob_type) && \
4092 method_is_overloaded(self, other, ROPSTR)) { \
Guido van Rossum55f20992001-10-01 17:18:22 +00004093 r = call_maybe( \
4094 other, ROPSTR, &rcache_str, "(O)", self); \
4095 if (r != Py_NotImplemented) \
4096 return r; \
4097 Py_DECREF(r); \
4098 do_other = 0; \
4099 } \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004100 r = call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004101 self, OPSTR, &cache_str, "(O)", other); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004102 if (r != Py_NotImplemented || \
4103 other->ob_type == self->ob_type) \
4104 return r; \
4105 Py_DECREF(r); \
4106 } \
Guido van Rossum55f20992001-10-01 17:18:22 +00004107 if (do_other) { \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004108 return call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004109 other, ROPSTR, &rcache_str, "(O)", self); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004110 } \
4111 Py_INCREF(Py_NotImplemented); \
4112 return Py_NotImplemented; \
4113}
4114
4115#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
4116 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
4117
4118#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
4119static PyObject * \
4120FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
4121{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004122 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004123 return call_method(self, OPSTR, &cache_str, \
4124 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004125}
4126
Martin v. Löwis18e16552006-02-15 17:27:45 +00004127static Py_ssize_t
Tim Peters6d6c1a32001-08-02 04:15:00 +00004128slot_sq_length(PyObject *self)
4129{
Guido van Rossum2730b132001-08-28 18:22:14 +00004130 static PyObject *len_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004131 PyObject *res = call_method(self, "__len__", &len_str, "()");
Martin v. Löwis18e16552006-02-15 17:27:45 +00004132 Py_ssize_t temp;
4133 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004134
4135 if (res == NULL)
4136 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004137 temp = PyInt_AsSsize_t(res);
Guido van Rossum630db602005-09-20 18:49:54 +00004138 len = (int)temp;
Guido van Rossum26111622001-10-01 16:42:49 +00004139 Py_DECREF(res);
Jeremy Hylton73a088e2002-07-25 16:43:29 +00004140 if (len == -1 && PyErr_Occurred())
4141 return -1;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004142#if SIZEOF_SIZE_T < SIZEOF_LONG
4143 /* Overflow check -- range of PyInt is more than C ssize_t */
Guido van Rossum630db602005-09-20 18:49:54 +00004144 if (len != temp) {
4145 PyErr_SetString(PyExc_OverflowError,
4146 "__len__() should return 0 <= outcome < 2**31");
4147 return -1;
4148 }
4149#endif
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004150 if (len < 0) {
Guido van Rossum22b13872002-08-06 21:41:44 +00004151 PyErr_SetString(PyExc_ValueError,
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004152 "__len__() should return >= 0");
4153 return -1;
4154 }
Guido van Rossum26111622001-10-01 16:42:49 +00004155 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004156}
4157
Guido van Rossumf4593e02001-10-03 12:09:30 +00004158/* Super-optimized version of slot_sq_item.
4159 Other slots could do the same... */
4160static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00004161slot_sq_item(PyObject *self, Py_ssize_t i)
Guido van Rossumf4593e02001-10-03 12:09:30 +00004162{
4163 static PyObject *getitem_str;
4164 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
4165 descrgetfunc f;
4166
4167 if (getitem_str == NULL) {
4168 getitem_str = PyString_InternFromString("__getitem__");
4169 if (getitem_str == NULL)
4170 return NULL;
4171 }
4172 func = _PyType_Lookup(self->ob_type, getitem_str);
4173 if (func != NULL) {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004174 if ((f = func->ob_type->tp_descr_get) == NULL)
4175 Py_INCREF(func);
Neal Norwitz673cd822002-10-18 16:33:13 +00004176 else {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004177 func = f(func, self, (PyObject *)(self->ob_type));
Neal Norwitz673cd822002-10-18 16:33:13 +00004178 if (func == NULL) {
4179 return NULL;
4180 }
4181 }
Martin v. Löwiseb079f12006-02-16 14:32:27 +00004182 ival = PyInt_FromSsize_t(i);
Guido van Rossumf4593e02001-10-03 12:09:30 +00004183 if (ival != NULL) {
4184 args = PyTuple_New(1);
4185 if (args != NULL) {
4186 PyTuple_SET_ITEM(args, 0, ival);
4187 retval = PyObject_Call(func, args, NULL);
4188 Py_XDECREF(args);
4189 Py_XDECREF(func);
4190 return retval;
4191 }
4192 }
4193 }
4194 else {
4195 PyErr_SetObject(PyExc_AttributeError, getitem_str);
4196 }
4197 Py_XDECREF(args);
4198 Py_XDECREF(ival);
4199 Py_XDECREF(func);
4200 return NULL;
4201}
4202
Martin v. Löwis18e16552006-02-15 17:27:45 +00004203SLOT2(slot_sq_slice, "__getslice__", Py_ssize_t, Py_ssize_t, "nn")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004204
4205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004206slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004207{
4208 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004209 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004210
4211 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004212 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004213 "(i)", index);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004214 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004215 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004216 "(iO)", index, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004217 if (res == NULL)
4218 return -1;
4219 Py_DECREF(res);
4220 return 0;
4221}
4222
4223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004224slot_sq_ass_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004225{
4226 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004227 static PyObject *delslice_str, *setslice_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004228
4229 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004230 res = call_method(self, "__delslice__", &delslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004231 "(ii)", i, j);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004232 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004233 res = call_method(self, "__setslice__", &setslice_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004234 "(iiO)", i, j, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004235 if (res == NULL)
4236 return -1;
4237 Py_DECREF(res);
4238 return 0;
4239}
4240
4241static int
4242slot_sq_contains(PyObject *self, PyObject *value)
4243{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004244 PyObject *func, *res, *args;
Tim Petersbf9b2442003-03-23 05:35:36 +00004245 int result = -1;
4246
Guido van Rossum60718732001-08-28 17:47:51 +00004247 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004248
Guido van Rossum55f20992001-10-01 17:18:22 +00004249 func = lookup_maybe(self, "__contains__", &contains_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004250 if (func != NULL) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004251 args = PyTuple_Pack(1, value);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004252 if (args == NULL)
4253 res = NULL;
4254 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004255 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004256 Py_DECREF(args);
4257 }
4258 Py_DECREF(func);
Tim Petersbf9b2442003-03-23 05:35:36 +00004259 if (res != NULL) {
4260 result = PyObject_IsTrue(res);
4261 Py_DECREF(res);
4262 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004263 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004264 else if (! PyErr_Occurred()) {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004265 /* Possible results: -1 and 1 */
4266 result = (int)_PySequence_IterSearch(self, value,
Tim Petersbf9b2442003-03-23 05:35:36 +00004267 PY_ITERSEARCH_CONTAINS);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004268 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004269 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004270}
4271
Tim Peters6d6c1a32001-08-02 04:15:00 +00004272#define slot_mp_length slot_sq_length
4273
Guido van Rossumdc91b992001-08-08 22:26:22 +00004274SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004275
4276static int
4277slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
4278{
4279 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004280 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004281
4282 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004283 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004284 "(O)", key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004285 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004286 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004287 "(OO)", key, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004288 if (res == NULL)
4289 return -1;
4290 Py_DECREF(res);
4291 return 0;
4292}
4293
Guido van Rossumdc91b992001-08-08 22:26:22 +00004294SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
4295SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
4296SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
4297SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
4298SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
4299SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
4300
Jeremy Hylton938ace62002-07-17 16:30:39 +00004301static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00004302
4303SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
4304 nb_power, "__pow__", "__rpow__")
4305
4306static PyObject *
4307slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
4308{
Guido van Rossum2730b132001-08-28 18:22:14 +00004309 static PyObject *pow_str;
4310
Guido van Rossumdc91b992001-08-08 22:26:22 +00004311 if (modulus == Py_None)
4312 return slot_nb_power_binary(self, other);
Guido van Rossum23094982002-06-10 14:30:43 +00004313 /* Three-arg power doesn't use __rpow__. But ternary_op
4314 can call this when the second argument's type uses
4315 slot_nb_power, so check before calling self.__pow__. */
4316 if (self->ob_type->tp_as_number != NULL &&
4317 self->ob_type->tp_as_number->nb_power == slot_nb_power) {
4318 return call_method(self, "__pow__", &pow_str,
4319 "(OO)", other, modulus);
4320 }
4321 Py_INCREF(Py_NotImplemented);
4322 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00004323}
4324
4325SLOT0(slot_nb_negative, "__neg__")
4326SLOT0(slot_nb_positive, "__pos__")
4327SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004328
4329static int
4330slot_nb_nonzero(PyObject *self)
4331{
Tim Petersea7f75d2002-12-07 21:39:16 +00004332 PyObject *func, *args;
Guido van Rossum60718732001-08-28 17:47:51 +00004333 static PyObject *nonzero_str, *len_str;
Tim Petersea7f75d2002-12-07 21:39:16 +00004334 int result = -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004335
Guido van Rossum55f20992001-10-01 17:18:22 +00004336 func = lookup_maybe(self, "__nonzero__", &nonzero_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004337 if (func == NULL) {
Guido van Rossum55f20992001-10-01 17:18:22 +00004338 if (PyErr_Occurred())
Guido van Rossumb8f63662001-08-15 23:57:02 +00004339 return -1;
Guido van Rossum55f20992001-10-01 17:18:22 +00004340 func = lookup_maybe(self, "__len__", &len_str);
Tim Petersea7f75d2002-12-07 21:39:16 +00004341 if (func == NULL)
4342 return PyErr_Occurred() ? -1 : 1;
4343 }
4344 args = PyTuple_New(0);
4345 if (args != NULL) {
4346 PyObject *temp = PyObject_Call(func, args, NULL);
4347 Py_DECREF(args);
4348 if (temp != NULL) {
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004349 if (PyInt_CheckExact(temp) || PyBool_Check(temp))
Jeremy Hylton090a3492003-06-27 16:46:45 +00004350 result = PyObject_IsTrue(temp);
4351 else {
4352 PyErr_Format(PyExc_TypeError,
4353 "__nonzero__ should return "
4354 "bool or int, returned %s",
4355 temp->ob_type->tp_name);
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004356 result = -1;
Jeremy Hylton090a3492003-06-27 16:46:45 +00004357 }
Tim Petersea7f75d2002-12-07 21:39:16 +00004358 Py_DECREF(temp);
Guido van Rossum55f20992001-10-01 17:18:22 +00004359 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004360 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004361 Py_DECREF(func);
Tim Petersea7f75d2002-12-07 21:39:16 +00004362 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004363}
4364
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004365
4366static Py_ssize_t
4367slot_nb_index(PyObject *self)
4368{
4369 PyObject *func, *args;
4370 static PyObject *index_str;
4371 Py_ssize_t result = -1;
4372
4373 func = lookup_maybe(self, "__index__", &index_str);
4374 if (func == NULL) {
4375 if (!PyErr_Occurred()) {
4376 PyErr_SetString(PyExc_TypeError,
4377 "object cannot be interpreted as an index");
4378 }
4379 return -1;
4380 }
4381 args = PyTuple_New(0);
4382 if (args != NULL) {
4383 PyObject *temp = PyObject_Call(func, args, NULL);
4384 Py_DECREF(args);
4385 if (temp != NULL) {
4386 if (PyInt_Check(temp) || PyLong_Check(temp)) {
4387 result =
4388 temp->ob_type->tp_as_number->nb_index(temp);
4389 }
4390 else {
4391 PyErr_SetString(PyExc_TypeError,
4392 "__index__ must return an int or a long");
4393 result = -1;
4394 }
4395 Py_DECREF(temp);
4396 }
4397 }
4398 Py_DECREF(func);
4399 return result;
4400}
4401
4402
Guido van Rossumdc91b992001-08-08 22:26:22 +00004403SLOT0(slot_nb_invert, "__invert__")
4404SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
4405SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
4406SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
4407SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
4408SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004409
4410static int
4411slot_nb_coerce(PyObject **a, PyObject **b)
4412{
4413 static PyObject *coerce_str;
4414 PyObject *self = *a, *other = *b;
4415
4416 if (self->ob_type->tp_as_number != NULL &&
4417 self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4418 PyObject *r;
4419 r = call_maybe(
4420 self, "__coerce__", &coerce_str, "(O)", other);
4421 if (r == NULL)
4422 return -1;
4423 if (r == Py_NotImplemented) {
4424 Py_DECREF(r);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004425 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004426 else {
4427 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4428 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004429 "__coerce__ didn't return a 2-tuple");
Guido van Rossum55f20992001-10-01 17:18:22 +00004430 Py_DECREF(r);
4431 return -1;
4432 }
4433 *a = PyTuple_GET_ITEM(r, 0);
4434 Py_INCREF(*a);
4435 *b = PyTuple_GET_ITEM(r, 1);
4436 Py_INCREF(*b);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004437 Py_DECREF(r);
Guido van Rossum55f20992001-10-01 17:18:22 +00004438 return 0;
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004439 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004440 }
4441 if (other->ob_type->tp_as_number != NULL &&
4442 other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4443 PyObject *r;
4444 r = call_maybe(
4445 other, "__coerce__", &coerce_str, "(O)", self);
4446 if (r == NULL)
4447 return -1;
4448 if (r == Py_NotImplemented) {
4449 Py_DECREF(r);
4450 return 1;
4451 }
4452 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4453 PyErr_SetString(PyExc_TypeError,
4454 "__coerce__ didn't return a 2-tuple");
4455 Py_DECREF(r);
4456 return -1;
4457 }
4458 *a = PyTuple_GET_ITEM(r, 1);
4459 Py_INCREF(*a);
4460 *b = PyTuple_GET_ITEM(r, 0);
4461 Py_INCREF(*b);
4462 Py_DECREF(r);
4463 return 0;
4464 }
4465 return 1;
4466}
4467
Guido van Rossumdc91b992001-08-08 22:26:22 +00004468SLOT0(slot_nb_int, "__int__")
4469SLOT0(slot_nb_long, "__long__")
4470SLOT0(slot_nb_float, "__float__")
4471SLOT0(slot_nb_oct, "__oct__")
4472SLOT0(slot_nb_hex, "__hex__")
4473SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
4474SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
4475SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
4476SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
4477SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
Guido van Rossum6e5680f2002-10-15 01:01:53 +00004478SLOT1(slot_nb_inplace_power, "__ipow__", PyObject *, "O")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004479SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
4480SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
4481SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
4482SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
4483SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
4484SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
4485 "__floordiv__", "__rfloordiv__")
4486SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
4487SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
4488SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004489
4490static int
Guido van Rossumb8f63662001-08-15 23:57:02 +00004491half_compare(PyObject *self, PyObject *other)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004492{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004493 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004494 static PyObject *cmp_str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004495 Py_ssize_t c;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004496
Guido van Rossum60718732001-08-28 17:47:51 +00004497 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004498 if (func == NULL) {
4499 PyErr_Clear();
4500 }
4501 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004502 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004503 if (args == NULL)
4504 res = NULL;
4505 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004506 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004507 Py_DECREF(args);
4508 }
Raymond Hettingerab5dae32002-06-24 13:08:16 +00004509 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004510 if (res != Py_NotImplemented) {
4511 if (res == NULL)
4512 return -2;
4513 c = PyInt_AsLong(res);
4514 Py_DECREF(res);
4515 if (c == -1 && PyErr_Occurred())
4516 return -2;
4517 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
4518 }
4519 Py_DECREF(res);
4520 }
4521 return 2;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004522}
4523
Guido van Rossumab3b0342001-09-18 20:38:53 +00004524/* This slot is published for the benefit of try_3way_compare in object.c */
4525int
4526_PyObject_SlotCompare(PyObject *self, PyObject *other)
Guido van Rossumb8f63662001-08-15 23:57:02 +00004527{
4528 int c;
4529
Guido van Rossumab3b0342001-09-18 20:38:53 +00004530 if (self->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004531 c = half_compare(self, other);
4532 if (c <= 1)
4533 return c;
4534 }
Guido van Rossumab3b0342001-09-18 20:38:53 +00004535 if (other->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004536 c = half_compare(other, self);
4537 if (c < -1)
4538 return -2;
4539 if (c <= 1)
4540 return -c;
4541 }
4542 return (void *)self < (void *)other ? -1 :
4543 (void *)self > (void *)other ? 1 : 0;
4544}
4545
4546static PyObject *
4547slot_tp_repr(PyObject *self)
4548{
4549 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004550 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004551
Guido van Rossum60718732001-08-28 17:47:51 +00004552 func = lookup_method(self, "__repr__", &repr_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004553 if (func != NULL) {
4554 res = PyEval_CallObject(func, NULL);
4555 Py_DECREF(func);
4556 return res;
4557 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00004558 PyErr_Clear();
4559 return PyString_FromFormat("<%s object at %p>",
4560 self->ob_type->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004561}
4562
4563static PyObject *
4564slot_tp_str(PyObject *self)
4565{
4566 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004567 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004568
Guido van Rossum60718732001-08-28 17:47:51 +00004569 func = lookup_method(self, "__str__", &str_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004570 if (func != NULL) {
4571 res = PyEval_CallObject(func, NULL);
4572 Py_DECREF(func);
4573 return res;
4574 }
4575 else {
4576 PyErr_Clear();
4577 return slot_tp_repr(self);
4578 }
4579}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004580
4581static long
4582slot_tp_hash(PyObject *self)
4583{
Tim Peters61ce0a92002-12-06 23:38:02 +00004584 PyObject *func;
Guido van Rossum60718732001-08-28 17:47:51 +00004585 static PyObject *hash_str, *eq_str, *cmp_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004586 long h;
4587
Guido van Rossum60718732001-08-28 17:47:51 +00004588 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004589
4590 if (func != NULL) {
Tim Peters61ce0a92002-12-06 23:38:02 +00004591 PyObject *res = PyEval_CallObject(func, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004592 Py_DECREF(func);
4593 if (res == NULL)
4594 return -1;
4595 h = PyInt_AsLong(res);
Tim Peters61ce0a92002-12-06 23:38:02 +00004596 Py_DECREF(res);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004597 }
4598 else {
4599 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004600 func = lookup_method(self, "__eq__", &eq_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004601 if (func == NULL) {
4602 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004603 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004604 }
4605 if (func != NULL) {
4606 Py_DECREF(func);
4607 PyErr_SetString(PyExc_TypeError, "unhashable type");
4608 return -1;
4609 }
4610 PyErr_Clear();
4611 h = _Py_HashPointer((void *)self);
4612 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004613 if (h == -1 && !PyErr_Occurred())
4614 h = -2;
4615 return h;
4616}
4617
4618static PyObject *
4619slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
4620{
Guido van Rossum60718732001-08-28 17:47:51 +00004621 static PyObject *call_str;
4622 PyObject *meth = lookup_method(self, "__call__", &call_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004623 PyObject *res;
4624
4625 if (meth == NULL)
4626 return NULL;
4627 res = PyObject_Call(meth, args, kwds);
4628 Py_DECREF(meth);
4629 return res;
4630}
4631
Guido van Rossum14a6f832001-10-17 13:59:09 +00004632/* There are two slot dispatch functions for tp_getattro.
4633
4634 - slot_tp_getattro() is used when __getattribute__ is overridden
4635 but no __getattr__ hook is present;
4636
4637 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
4638
Guido van Rossumc334df52002-04-04 23:44:47 +00004639 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
4640 detects the absence of __getattr__ and then installs the simpler slot if
4641 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00004642
Tim Peters6d6c1a32001-08-02 04:15:00 +00004643static PyObject *
4644slot_tp_getattro(PyObject *self, PyObject *name)
4645{
Guido van Rossum14a6f832001-10-17 13:59:09 +00004646 static PyObject *getattribute_str = NULL;
4647 return call_method(self, "__getattribute__", &getattribute_str,
4648 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004649}
4650
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004651static PyObject *
4652slot_tp_getattr_hook(PyObject *self, PyObject *name)
4653{
4654 PyTypeObject *tp = self->ob_type;
4655 PyObject *getattr, *getattribute, *res;
4656 static PyObject *getattribute_str = NULL;
4657 static PyObject *getattr_str = NULL;
4658
4659 if (getattr_str == NULL) {
4660 getattr_str = PyString_InternFromString("__getattr__");
4661 if (getattr_str == NULL)
4662 return NULL;
4663 }
4664 if (getattribute_str == NULL) {
4665 getattribute_str =
4666 PyString_InternFromString("__getattribute__");
4667 if (getattribute_str == NULL)
4668 return NULL;
4669 }
4670 getattr = _PyType_Lookup(tp, getattr_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004671 if (getattr == NULL) {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004672 /* No __getattr__ hook: use a simpler dispatcher */
4673 tp->tp_getattro = slot_tp_getattro;
4674 return slot_tp_getattro(self, name);
4675 }
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004676 getattribute = _PyType_Lookup(tp, getattribute_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004677 if (getattribute == NULL ||
4678 (getattribute->ob_type == &PyWrapperDescr_Type &&
4679 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
4680 (void *)PyObject_GenericGetAttr))
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004681 res = PyObject_GenericGetAttr(self, name);
4682 else
4683 res = PyObject_CallFunction(getattribute, "OO", self, name);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004684 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004685 PyErr_Clear();
4686 res = PyObject_CallFunction(getattr, "OO", self, name);
4687 }
4688 return res;
4689}
4690
Tim Peters6d6c1a32001-08-02 04:15:00 +00004691static int
4692slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
4693{
4694 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004695 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004696
4697 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004698 res = call_method(self, "__delattr__", &delattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004699 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004700 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004701 res = call_method(self, "__setattr__", &setattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004702 "(OO)", name, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004703 if (res == NULL)
4704 return -1;
4705 Py_DECREF(res);
4706 return 0;
4707}
4708
4709/* Map rich comparison operators to their __xx__ namesakes */
4710static char *name_op[] = {
4711 "__lt__",
4712 "__le__",
4713 "__eq__",
4714 "__ne__",
4715 "__gt__",
4716 "__ge__",
4717};
4718
4719static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00004720half_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004721{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004722 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004723 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00004724
Guido van Rossum60718732001-08-28 17:47:51 +00004725 func = lookup_method(self, name_op[op], &op_str[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004726 if (func == NULL) {
4727 PyErr_Clear();
4728 Py_INCREF(Py_NotImplemented);
4729 return Py_NotImplemented;
4730 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004731 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004732 if (args == NULL)
4733 res = NULL;
4734 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004735 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004736 Py_DECREF(args);
4737 }
4738 Py_DECREF(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004739 return res;
4740}
4741
Guido van Rossumb8f63662001-08-15 23:57:02 +00004742static PyObject *
4743slot_tp_richcompare(PyObject *self, PyObject *other, int op)
4744{
4745 PyObject *res;
4746
4747 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
4748 res = half_richcompare(self, other, op);
4749 if (res != Py_NotImplemented)
4750 return res;
4751 Py_DECREF(res);
4752 }
4753 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
Tim Petersf4aca752004-09-23 02:39:37 +00004754 res = half_richcompare(other, self, _Py_SwappedOp[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004755 if (res != Py_NotImplemented) {
4756 return res;
4757 }
4758 Py_DECREF(res);
4759 }
4760 Py_INCREF(Py_NotImplemented);
4761 return Py_NotImplemented;
4762}
4763
4764static PyObject *
4765slot_tp_iter(PyObject *self)
4766{
4767 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004768 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004769
Guido van Rossum60718732001-08-28 17:47:51 +00004770 func = lookup_method(self, "__iter__", &iter_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004771 if (func != NULL) {
Guido van Rossum84b2bed2002-08-16 17:01:09 +00004772 PyObject *args;
4773 args = res = PyTuple_New(0);
4774 if (args != NULL) {
4775 res = PyObject_Call(func, args, NULL);
4776 Py_DECREF(args);
4777 }
4778 Py_DECREF(func);
4779 return res;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004780 }
4781 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004782 func = lookup_method(self, "__getitem__", &getitem_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004783 if (func == NULL) {
Guido van Rossumd4641072002-04-03 02:13:37 +00004784 PyErr_SetString(PyExc_TypeError,
4785 "iteration over non-sequence");
Guido van Rossumb8f63662001-08-15 23:57:02 +00004786 return NULL;
4787 }
4788 Py_DECREF(func);
4789 return PySeqIter_New(self);
4790}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004791
4792static PyObject *
4793slot_tp_iternext(PyObject *self)
4794{
Guido van Rossum2730b132001-08-28 18:22:14 +00004795 static PyObject *next_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004796 return call_method(self, "next", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00004797}
4798
Guido van Rossum1a493502001-08-17 16:47:50 +00004799static PyObject *
4800slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
4801{
4802 PyTypeObject *tp = self->ob_type;
4803 PyObject *get;
4804 static PyObject *get_str = NULL;
4805
4806 if (get_str == NULL) {
4807 get_str = PyString_InternFromString("__get__");
4808 if (get_str == NULL)
4809 return NULL;
4810 }
4811 get = _PyType_Lookup(tp, get_str);
4812 if (get == NULL) {
4813 /* Avoid further slowdowns */
4814 if (tp->tp_descr_get == slot_tp_descr_get)
4815 tp->tp_descr_get = NULL;
4816 Py_INCREF(self);
4817 return self;
4818 }
Guido van Rossum2c252392001-08-24 10:13:31 +00004819 if (obj == NULL)
4820 obj = Py_None;
4821 if (type == NULL)
4822 type = Py_None;
Guido van Rossum1a493502001-08-17 16:47:50 +00004823 return PyObject_CallFunction(get, "OOO", self, obj, type);
4824}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004825
4826static int
4827slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
4828{
Guido van Rossum2c252392001-08-24 10:13:31 +00004829 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004830 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00004831
4832 if (value == NULL)
Guido van Rossum1d5b3f22001-12-03 00:08:33 +00004833 res = call_method(self, "__delete__", &del_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004834 "(O)", target);
Guido van Rossum2c252392001-08-24 10:13:31 +00004835 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004836 res = call_method(self, "__set__", &set_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004837 "(OO)", target, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004838 if (res == NULL)
4839 return -1;
4840 Py_DECREF(res);
4841 return 0;
4842}
4843
4844static int
4845slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
4846{
Guido van Rossum60718732001-08-28 17:47:51 +00004847 static PyObject *init_str;
4848 PyObject *meth = lookup_method(self, "__init__", &init_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004849 PyObject *res;
4850
4851 if (meth == NULL)
4852 return -1;
4853 res = PyObject_Call(meth, args, kwds);
4854 Py_DECREF(meth);
4855 if (res == NULL)
4856 return -1;
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004857 if (res != Py_None) {
4858 PyErr_SetString(PyExc_TypeError,
4859 "__init__() should return None");
4860 Py_DECREF(res);
4861 return -1;
4862 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004863 Py_DECREF(res);
4864 return 0;
4865}
4866
4867static PyObject *
4868slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4869{
Guido van Rossum7bed2132002-08-08 21:57:53 +00004870 static PyObject *new_str;
4871 PyObject *func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004872 PyObject *newargs, *x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004873 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004874
Guido van Rossum7bed2132002-08-08 21:57:53 +00004875 if (new_str == NULL) {
4876 new_str = PyString_InternFromString("__new__");
4877 if (new_str == NULL)
4878 return NULL;
4879 }
4880 func = PyObject_GetAttr((PyObject *)type, new_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004881 if (func == NULL)
4882 return NULL;
4883 assert(PyTuple_Check(args));
4884 n = PyTuple_GET_SIZE(args);
4885 newargs = PyTuple_New(n+1);
4886 if (newargs == NULL)
4887 return NULL;
4888 Py_INCREF(type);
4889 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
4890 for (i = 0; i < n; i++) {
4891 x = PyTuple_GET_ITEM(args, i);
4892 Py_INCREF(x);
4893 PyTuple_SET_ITEM(newargs, i+1, x);
4894 }
4895 x = PyObject_Call(func, newargs, kwds);
Guido van Rossum25d18072001-10-01 15:55:28 +00004896 Py_DECREF(newargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004897 Py_DECREF(func);
4898 return x;
4899}
4900
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004901static void
4902slot_tp_del(PyObject *self)
4903{
4904 static PyObject *del_str = NULL;
4905 PyObject *del, *res;
4906 PyObject *error_type, *error_value, *error_traceback;
4907
4908 /* Temporarily resurrect the object. */
4909 assert(self->ob_refcnt == 0);
4910 self->ob_refcnt = 1;
4911
4912 /* Save the current exception, if any. */
4913 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4914
4915 /* Execute __del__ method, if any. */
4916 del = lookup_maybe(self, "__del__", &del_str);
4917 if (del != NULL) {
4918 res = PyEval_CallObject(del, NULL);
4919 if (res == NULL)
4920 PyErr_WriteUnraisable(del);
4921 else
4922 Py_DECREF(res);
4923 Py_DECREF(del);
4924 }
4925
4926 /* Restore the saved exception. */
4927 PyErr_Restore(error_type, error_value, error_traceback);
4928
4929 /* Undo the temporary resurrection; can't use DECREF here, it would
4930 * cause a recursive call.
4931 */
4932 assert(self->ob_refcnt > 0);
4933 if (--self->ob_refcnt == 0)
4934 return; /* this is the normal path out */
4935
4936 /* __del__ resurrected it! Make it look like the original Py_DECREF
4937 * never happened.
4938 */
4939 {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004940 Py_ssize_t refcnt = self->ob_refcnt;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004941 _Py_NewReference(self);
4942 self->ob_refcnt = refcnt;
4943 }
4944 assert(!PyType_IS_GC(self->ob_type) ||
4945 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +00004946 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
4947 * we need to undo that. */
4948 _Py_DEC_REFTOTAL;
4949 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
4950 * chain, so no more to do there.
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004951 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
4952 * _Py_NewReference bumped tp_allocs: both of those need to be
4953 * undone.
4954 */
4955#ifdef COUNT_ALLOCS
4956 --self->ob_type->tp_frees;
4957 --self->ob_type->tp_allocs;
4958#endif
4959}
4960
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004961
4962/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
Tim Petersbf9b2442003-03-23 05:35:36 +00004963 functions. The offsets here are relative to the 'PyHeapTypeObject'
Guido van Rossume5c691a2003-03-07 15:13:17 +00004964 structure, which incorporates the additional structures used for numbers,
4965 sequences and mappings.
4966 Note that multiple names may map to the same slot (e.g. __eq__,
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004967 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00004968 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
4969 terminated with an all-zero entry. (This table is further initialized and
4970 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004971
Guido van Rossum6d204072001-10-21 00:44:31 +00004972typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004973
4974#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00004975#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004976#undef ETSLOT
4977#undef SQSLOT
4978#undef MPSLOT
4979#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00004980#undef UNSLOT
4981#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004982#undef BINSLOT
4983#undef RBINSLOT
4984
Guido van Rossum6d204072001-10-21 00:44:31 +00004985#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Neal Norwitzd47714a2002-08-13 19:01:38 +00004986 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
4987 PyDoc_STR(DOC)}
Guido van Rossumc8e56452001-10-22 00:43:43 +00004988#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
4989 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00004990 PyDoc_STR(DOC), FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00004991#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Guido van Rossume5c691a2003-03-07 15:13:17 +00004992 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00004993 PyDoc_STR(DOC)}
Guido van Rossum6d204072001-10-21 00:44:31 +00004994#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
4995 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
4996#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
4997 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
4998#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
4999 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
5000#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5001 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5002 "x." NAME "() <==> " DOC)
5003#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5004 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5005 "x." NAME "(y) <==> x" DOC "y")
5006#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
5007 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5008 "x." NAME "(y) <==> x" DOC "y")
5009#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
5010 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5011 "x." NAME "(y) <==> y" DOC "x")
Anthony Baxter56616992005-06-03 14:12:21 +00005012#define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5013 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5014 "x." NAME "(y) <==> " DOC)
5015#define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5016 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5017 "x." NAME "(y) <==> " DOC)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005018
5019static slotdef slotdefs[] = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00005020 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005021 "x.__len__() <==> len(x)"),
Armin Rigofd163f92005-12-29 15:59:19 +00005022 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
5023 The logic in abstract.c always falls back to nb_add/nb_multiply in
5024 this case. Defining both the nb_* and the sq_* slots to call the
5025 user-defined methods has unexpected side-effects, as shown by
5026 test_descr.notimplemented() */
5027 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
5028 "x.__add__(y) <==> x+y"),
Martin v. Löwis18e16552006-02-15 17:27:45 +00005029 SQSLOT("__mul__", sq_repeat, NULL, wrap_ssizeargfunc,
Armin Rigofd163f92005-12-29 15:59:19 +00005030 "x.__mul__(n) <==> x*n"),
Martin v. Löwis18e16552006-02-15 17:27:45 +00005031 SQSLOT("__rmul__", sq_repeat, NULL, wrap_ssizeargfunc,
Armin Rigofd163f92005-12-29 15:59:19 +00005032 "x.__rmul__(n) <==> n*x"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005033 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
5034 "x.__getitem__(y) <==> x[y]"),
Martin v. Löwis18e16552006-02-15 17:27:45 +00005035 SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_ssizessizeargfunc,
Brett Cannon154da9b2003-05-20 02:30:04 +00005036 "x.__getslice__(i, j) <==> x[i:j]\n\
5037 \n\
5038 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005039 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005040 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005041 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005042 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005043 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
Martin v. Löwis18e16552006-02-15 17:27:45 +00005044 wrap_ssizessizeobjargproc,
Brett Cannonbe67d872003-05-20 02:40:12 +00005045 "x.__setslice__(i, j, y) <==> x[i:j]=y\n\
5046 \n\
5047 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005048 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
Brett Cannonbe67d872003-05-20 02:40:12 +00005049 "x.__delslice__(i, j) <==> del x[i:j]\n\
5050 \n\
5051 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005052 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
5053 "x.__contains__(y) <==> y in x"),
Armin Rigofd163f92005-12-29 15:59:19 +00005054 SQSLOT("__iadd__", sq_inplace_concat, NULL,
5055 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
5056 SQSLOT("__imul__", sq_inplace_repeat, NULL,
Martin v. Löwis18e16552006-02-15 17:27:45 +00005057 wrap_ssizeargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005058
Martin v. Löwis18e16552006-02-15 17:27:45 +00005059 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005060 "x.__len__() <==> len(x)"),
Guido van Rossumfd38f8e2001-10-09 20:17:57 +00005061 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005062 wrap_binaryfunc,
5063 "x.__getitem__(y) <==> x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005064 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005065 wrap_objobjargproc,
5066 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005067 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005068 wrap_delitem,
5069 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005070
Guido van Rossum6d204072001-10-21 00:44:31 +00005071 BINSLOT("__add__", nb_add, slot_nb_add,
5072 "+"),
5073 RBINSLOT("__radd__", nb_add, slot_nb_add,
5074 "+"),
5075 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
5076 "-"),
5077 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
5078 "-"),
5079 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
5080 "*"),
5081 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
5082 "*"),
5083 BINSLOT("__div__", nb_divide, slot_nb_divide,
5084 "/"),
5085 RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
5086 "/"),
5087 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
5088 "%"),
5089 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
5090 "%"),
Anthony Baxter56616992005-06-03 14:12:21 +00005091 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005092 "divmod(x, y)"),
Anthony Baxter56616992005-06-03 14:12:21 +00005093 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005094 "divmod(y, x)"),
5095 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
5096 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
5097 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
5098 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
5099 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
5100 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
5101 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
5102 "abs(x)"),
Raymond Hettingerf34f2642003-10-11 17:29:04 +00005103 UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquirypred,
Guido van Rossum6d204072001-10-21 00:44:31 +00005104 "x != 0"),
5105 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
5106 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
5107 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
5108 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
5109 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
5110 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
5111 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
5112 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
5113 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
5114 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
5115 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
5116 NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
5117 "x.__coerce__(y) <==> coerce(x, y)"),
5118 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
5119 "int(x)"),
5120 UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
5121 "long(x)"),
5122 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
5123 "float(x)"),
5124 UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
5125 "oct(x)"),
5126 UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
5127 "hex(x)"),
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005128 NBSLOT("__index__", nb_index, slot_nb_index, wrap_lenfunc,
5129 "x[y:z] <==> x[y.__index__():z.__index__()]"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005130 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
5131 wrap_binaryfunc, "+"),
5132 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
5133 wrap_binaryfunc, "-"),
5134 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
5135 wrap_binaryfunc, "*"),
5136 IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
5137 wrap_binaryfunc, "/"),
5138 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
5139 wrap_binaryfunc, "%"),
5140 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
Guido van Rossum6e5680f2002-10-15 01:01:53 +00005141 wrap_binaryfunc, "**"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005142 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
5143 wrap_binaryfunc, "<<"),
5144 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
5145 wrap_binaryfunc, ">>"),
5146 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
5147 wrap_binaryfunc, "&"),
5148 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
5149 wrap_binaryfunc, "^"),
5150 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
5151 wrap_binaryfunc, "|"),
5152 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5153 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5154 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
5155 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
5156 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
5157 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
5158 IBSLOT("__itruediv__", nb_inplace_true_divide,
5159 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005160
Guido van Rossum6d204072001-10-21 00:44:31 +00005161 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
5162 "x.__str__() <==> str(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005163 TPSLOT("__str__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005164 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
5165 "x.__repr__() <==> repr(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005166 TPSLOT("__repr__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005167 TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
5168 "x.__cmp__(y) <==> cmp(x,y)"),
5169 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
5170 "x.__hash__() <==> hash(x)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005171 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
5172 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005173 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
Guido van Rossum6d204072001-10-21 00:44:31 +00005174 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
5175 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
5176 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
5177 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
5178 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
5179 "x.__setattr__('name', value) <==> x.name = value"),
5180 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
5181 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
5182 "x.__delattr__('name') <==> del x.name"),
5183 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
5184 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
5185 "x.__lt__(y) <==> x<y"),
5186 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
5187 "x.__le__(y) <==> x<=y"),
5188 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
5189 "x.__eq__(y) <==> x==y"),
5190 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
5191 "x.__ne__(y) <==> x!=y"),
5192 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
5193 "x.__gt__(y) <==> x>y"),
5194 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
5195 "x.__ge__(y) <==> x>=y"),
5196 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
5197 "x.__iter__() <==> iter(x)"),
5198 TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
5199 "x.next() -> the next value, or raise StopIteration"),
5200 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
5201 "descr.__get__(obj[, type]) -> value"),
5202 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
5203 "descr.__set__(obj, value)"),
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00005204 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
5205 wrap_descr_delete, "descr.__delete__(obj)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005206 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
Guido van Rossum6d204072001-10-21 00:44:31 +00005207 "x.__init__(...) initializes x; "
Guido van Rossumc8e56452001-10-22 00:43:43 +00005208 "see x.__class__.__doc__ for signature",
5209 PyWrapperFlag_KEYWORDS),
5210 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005211 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005212 {NULL}
5213};
5214
Guido van Rossumc334df52002-04-04 23:44:47 +00005215/* Given a type pointer and an offset gotten from a slotdef entry, return a
5216 pointer to the actual slot. This is not quite the same as simply adding
5217 the offset to the type pointer, since it takes care to indirect through the
5218 proper indirection pointer (as_buffer, etc.); it returns NULL if the
5219 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005220static void **
Martin v. Löwis18e16552006-02-15 17:27:45 +00005221slotptr(PyTypeObject *type, int ioffset)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005222{
5223 char *ptr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005224 long offset = ioffset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005225
Guido van Rossume5c691a2003-03-07 15:13:17 +00005226 /* Note: this depends on the order of the members of PyHeapTypeObject! */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005227 assert(offset >= 0);
Guido van Rossume5c691a2003-03-07 15:13:17 +00005228 assert(offset < offsetof(PyHeapTypeObject, as_buffer));
5229 if (offset >= offsetof(PyHeapTypeObject, as_sequence)) {
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005230 ptr = (void *)type->tp_as_sequence;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005231 offset -= offsetof(PyHeapTypeObject, as_sequence);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005232 }
Guido van Rossume5c691a2003-03-07 15:13:17 +00005233 else if (offset >= offsetof(PyHeapTypeObject, as_mapping)) {
Guido van Rossum09638c12002-06-13 19:17:46 +00005234 ptr = (void *)type->tp_as_mapping;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005235 offset -= offsetof(PyHeapTypeObject, as_mapping);
Guido van Rossum09638c12002-06-13 19:17:46 +00005236 }
Guido van Rossume5c691a2003-03-07 15:13:17 +00005237 else if (offset >= offsetof(PyHeapTypeObject, as_number)) {
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005238 ptr = (void *)type->tp_as_number;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005239 offset -= offsetof(PyHeapTypeObject, as_number);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005240 }
5241 else {
5242 ptr = (void *)type;
5243 }
5244 if (ptr != NULL)
5245 ptr += offset;
5246 return (void **)ptr;
5247}
Guido van Rossumf040ede2001-08-07 16:40:56 +00005248
Guido van Rossumc334df52002-04-04 23:44:47 +00005249/* Length of array of slotdef pointers used to store slots with the
5250 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
5251 the same __name__, for any __name__. Since that's a static property, it is
5252 appropriate to declare fixed-size arrays for this. */
5253#define MAX_EQUIV 10
5254
5255/* Return a slot pointer for a given name, but ONLY if the attribute has
5256 exactly one slot function. The name must be an interned string. */
5257static void **
5258resolve_slotdups(PyTypeObject *type, PyObject *name)
5259{
5260 /* XXX Maybe this could be optimized more -- but is it worth it? */
5261
5262 /* pname and ptrs act as a little cache */
5263 static PyObject *pname;
5264 static slotdef *ptrs[MAX_EQUIV];
5265 slotdef *p, **pp;
5266 void **res, **ptr;
5267
5268 if (pname != name) {
5269 /* Collect all slotdefs that match name into ptrs. */
5270 pname = name;
5271 pp = ptrs;
5272 for (p = slotdefs; p->name_strobj; p++) {
5273 if (p->name_strobj == name)
5274 *pp++ = p;
5275 }
5276 *pp = NULL;
5277 }
5278
5279 /* Look in all matching slots of the type; if exactly one of these has
5280 a filled-in slot, return its value. Otherwise return NULL. */
5281 res = NULL;
5282 for (pp = ptrs; *pp; pp++) {
5283 ptr = slotptr(type, (*pp)->offset);
5284 if (ptr == NULL || *ptr == NULL)
5285 continue;
5286 if (res != NULL)
5287 return NULL;
5288 res = ptr;
5289 }
5290 return res;
5291}
5292
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005293/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This
Guido van Rossumc334df52002-04-04 23:44:47 +00005294 does some incredibly complex thinking and then sticks something into the
5295 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
5296 interests, and then stores a generic wrapper or a specific function into
5297 the slot.) Return a pointer to the next slotdef with a different offset,
5298 because that's convenient for fixup_slot_dispatchers(). */
5299static slotdef *
5300update_one_slot(PyTypeObject *type, slotdef *p)
5301{
5302 PyObject *descr;
5303 PyWrapperDescrObject *d;
5304 void *generic = NULL, *specific = NULL;
5305 int use_generic = 0;
5306 int offset = p->offset;
5307 void **ptr = slotptr(type, offset);
5308
5309 if (ptr == NULL) {
5310 do {
5311 ++p;
5312 } while (p->offset == offset);
5313 return p;
5314 }
5315 do {
5316 descr = _PyType_Lookup(type, p->name_strobj);
5317 if (descr == NULL)
5318 continue;
5319 if (descr->ob_type == &PyWrapperDescr_Type) {
5320 void **tptr = resolve_slotdups(type, p->name_strobj);
5321 if (tptr == NULL || tptr == ptr)
5322 generic = p->function;
5323 d = (PyWrapperDescrObject *)descr;
5324 if (d->d_base->wrapper == p->wrapper &&
5325 PyType_IsSubtype(type, d->d_type))
5326 {
5327 if (specific == NULL ||
5328 specific == d->d_wrapped)
5329 specific = d->d_wrapped;
5330 else
5331 use_generic = 1;
5332 }
5333 }
Guido van Rossum721f62e2002-08-09 02:14:34 +00005334 else if (descr->ob_type == &PyCFunction_Type &&
5335 PyCFunction_GET_FUNCTION(descr) ==
5336 (PyCFunction)tp_new_wrapper &&
5337 strcmp(p->name, "__new__") == 0)
5338 {
5339 /* The __new__ wrapper is not a wrapper descriptor,
5340 so must be special-cased differently.
5341 If we don't do this, creating an instance will
5342 always use slot_tp_new which will look up
5343 __new__ in the MRO which will call tp_new_wrapper
5344 which will look through the base classes looking
5345 for a static base and call its tp_new (usually
5346 PyType_GenericNew), after performing various
5347 sanity checks and constructing a new argument
5348 list. Cut all that nonsense short -- this speeds
5349 up instance creation tremendously. */
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005350 specific = (void *)type->tp_new;
Guido van Rossum721f62e2002-08-09 02:14:34 +00005351 /* XXX I'm not 100% sure that there isn't a hole
5352 in this reasoning that requires additional
5353 sanity checks. I'll buy the first person to
5354 point out a bug in this reasoning a beer. */
5355 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005356 else {
5357 use_generic = 1;
5358 generic = p->function;
5359 }
5360 } while ((++p)->offset == offset);
5361 if (specific && !use_generic)
5362 *ptr = specific;
5363 else
5364 *ptr = generic;
5365 return p;
5366}
5367
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005368/* In the type, update the slots whose slotdefs are gathered in the pp array.
5369 This is a callback for update_subclasses(). */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005370static int
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005371update_slots_callback(PyTypeObject *type, void *data)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005372{
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005373 slotdef **pp = (slotdef **)data;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005374
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005375 for (; *pp; pp++)
Guido van Rossumc334df52002-04-04 23:44:47 +00005376 update_one_slot(type, *pp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005377 return 0;
5378}
5379
Guido van Rossumc334df52002-04-04 23:44:47 +00005380/* Comparison function for qsort() to compare slotdefs by their offset, and
5381 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005382static int
5383slotdef_cmp(const void *aa, const void *bb)
5384{
5385 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
5386 int c = a->offset - b->offset;
5387 if (c != 0)
5388 return c;
5389 else
Martin v. Löwis18e16552006-02-15 17:27:45 +00005390 /* Cannot use a-b, as this gives off_t,
5391 which may lose precision when converted to int. */
5392 return (a > b) ? 1 : (a < b) ? -1 : 0;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005393}
5394
Guido van Rossumc334df52002-04-04 23:44:47 +00005395/* Initialize the slotdefs table by adding interned string objects for the
5396 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005397static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005398init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005399{
5400 slotdef *p;
5401 static int initialized = 0;
5402
5403 if (initialized)
5404 return;
5405 for (p = slotdefs; p->name; p++) {
5406 p->name_strobj = PyString_InternFromString(p->name);
5407 if (!p->name_strobj)
Guido van Rossumc334df52002-04-04 23:44:47 +00005408 Py_FatalError("Out of memory interning slotdef names");
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005409 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005410 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
5411 slotdef_cmp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005412 initialized = 1;
5413}
5414
Guido van Rossumc334df52002-04-04 23:44:47 +00005415/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005416static int
5417update_slot(PyTypeObject *type, PyObject *name)
5418{
Guido van Rossumc334df52002-04-04 23:44:47 +00005419 slotdef *ptrs[MAX_EQUIV];
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005420 slotdef *p;
5421 slotdef **pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005422 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005423
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005424 init_slotdefs();
5425 pp = ptrs;
5426 for (p = slotdefs; p->name; p++) {
5427 /* XXX assume name is interned! */
5428 if (p->name_strobj == name)
5429 *pp++ = p;
5430 }
5431 *pp = NULL;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005432 for (pp = ptrs; *pp; pp++) {
5433 p = *pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005434 offset = p->offset;
5435 while (p > slotdefs && (p-1)->offset == offset)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005436 --p;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005437 *pp = p;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005438 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005439 if (ptrs[0] == NULL)
5440 return 0; /* Not an attribute that affects any slots */
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005441 return update_subclasses(type, name,
5442 update_slots_callback, (void *)ptrs);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005443}
5444
Guido van Rossumc334df52002-04-04 23:44:47 +00005445/* Store the proper functions in the slot dispatches at class (type)
5446 definition time, based upon which operations the class overrides in its
5447 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00005448static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005449fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005450{
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005451 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005452
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005453 init_slotdefs();
Guido van Rossumc334df52002-04-04 23:44:47 +00005454 for (p = slotdefs; p->name; )
5455 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00005456}
Guido van Rossum705f0f52001-08-24 16:47:00 +00005457
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005458static void
5459update_all_slots(PyTypeObject* type)
5460{
5461 slotdef *p;
5462
5463 init_slotdefs();
5464 for (p = slotdefs; p->name; p++) {
5465 /* update_slot returns int but can't actually fail */
5466 update_slot(type, p->name_strobj);
5467 }
5468}
5469
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005470/* recurse_down_subclasses() and update_subclasses() are mutually
5471 recursive functions to call a callback for all subclasses,
5472 but refraining from recursing into subclasses that define 'name'. */
5473
5474static int
5475update_subclasses(PyTypeObject *type, PyObject *name,
5476 update_callback callback, void *data)
5477{
5478 if (callback(type, data) < 0)
5479 return -1;
5480 return recurse_down_subclasses(type, name, callback, data);
5481}
5482
5483static int
5484recurse_down_subclasses(PyTypeObject *type, PyObject *name,
5485 update_callback callback, void *data)
5486{
5487 PyTypeObject *subclass;
5488 PyObject *ref, *subclasses, *dict;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005489 Py_ssize_t i, n;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005490
5491 subclasses = type->tp_subclasses;
5492 if (subclasses == NULL)
5493 return 0;
5494 assert(PyList_Check(subclasses));
5495 n = PyList_GET_SIZE(subclasses);
5496 for (i = 0; i < n; i++) {
5497 ref = PyList_GET_ITEM(subclasses, i);
5498 assert(PyWeakref_CheckRef(ref));
5499 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
5500 assert(subclass != NULL);
5501 if ((PyObject *)subclass == Py_None)
5502 continue;
5503 assert(PyType_Check(subclass));
5504 /* Avoid recursing down into unaffected classes */
5505 dict = subclass->tp_dict;
5506 if (dict != NULL && PyDict_Check(dict) &&
5507 PyDict_GetItem(dict, name) != NULL)
5508 continue;
5509 if (update_subclasses(subclass, name, callback, data) < 0)
5510 return -1;
5511 }
5512 return 0;
5513}
5514
Guido van Rossum6d204072001-10-21 00:44:31 +00005515/* This function is called by PyType_Ready() to populate the type's
5516 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00005517 function slot (like tp_repr) that's defined in the type, one or more
5518 corresponding descriptors are added in the type's tp_dict dictionary
5519 under the appropriate name (like __repr__). Some function slots
5520 cause more than one descriptor to be added (for example, the nb_add
5521 slot adds both __add__ and __radd__ descriptors) and some function
5522 slots compete for the same descriptor (for example both sq_item and
5523 mp_subscript generate a __getitem__ descriptor).
5524
5525 In the latter case, the first slotdef entry encoutered wins. Since
Tim Petersbf9b2442003-03-23 05:35:36 +00005526 slotdef entries are sorted by the offset of the slot in the
Guido van Rossume5c691a2003-03-07 15:13:17 +00005527 PyHeapTypeObject, this gives us some control over disambiguating
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005528 between competing slots: the members of PyHeapTypeObject are listed
5529 from most general to least general, so the most general slot is
5530 preferred. In particular, because as_mapping comes before as_sequence,
5531 for a type that defines both mp_subscript and sq_item, mp_subscript
5532 wins.
Guido van Rossum09638c12002-06-13 19:17:46 +00005533
5534 This only adds new descriptors and doesn't overwrite entries in
5535 tp_dict that were previously defined. The descriptors contain a
5536 reference to the C function they must call, so that it's safe if they
5537 are copied into a subtype's __dict__ and the subtype has a different
5538 C function in its slot -- calling the method defined by the
5539 descriptor will call the C function that was used to create it,
5540 rather than the C function present in the slot when it is called.
5541 (This is important because a subtype may have a C function in the
5542 slot that calls the method from the dictionary, and we want to avoid
5543 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00005544
5545static int
5546add_operators(PyTypeObject *type)
5547{
5548 PyObject *dict = type->tp_dict;
5549 slotdef *p;
5550 PyObject *descr;
5551 void **ptr;
5552
5553 init_slotdefs();
5554 for (p = slotdefs; p->name; p++) {
5555 if (p->wrapper == NULL)
5556 continue;
5557 ptr = slotptr(type, p->offset);
5558 if (!ptr || !*ptr)
5559 continue;
5560 if (PyDict_GetItem(dict, p->name_strobj))
5561 continue;
5562 descr = PyDescr_NewWrapper(type, p, *ptr);
5563 if (descr == NULL)
5564 return -1;
5565 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
5566 return -1;
5567 Py_DECREF(descr);
5568 }
5569 if (type->tp_new != NULL) {
5570 if (add_tp_new_wrapper(type) < 0)
5571 return -1;
5572 }
5573 return 0;
5574}
5575
Guido van Rossum705f0f52001-08-24 16:47:00 +00005576
5577/* Cooperative 'super' */
5578
5579typedef struct {
5580 PyObject_HEAD
Guido van Rossume705ef12001-08-29 15:47:06 +00005581 PyTypeObject *type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005582 PyObject *obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005583 PyTypeObject *obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005584} superobject;
5585
Guido van Rossum6f799372001-09-20 20:46:19 +00005586static PyMemberDef super_members[] = {
5587 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
5588 "the class invoking super()"},
5589 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
5590 "the instance invoking super(); may be None"},
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005591 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00005592 "the type of the instance invoking super(); may be None"},
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005593 {0}
5594};
5595
Guido van Rossum705f0f52001-08-24 16:47:00 +00005596static void
5597super_dealloc(PyObject *self)
5598{
5599 superobject *su = (superobject *)self;
5600
Guido van Rossum048eb752001-10-02 21:24:57 +00005601 _PyObject_GC_UNTRACK(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005602 Py_XDECREF(su->obj);
5603 Py_XDECREF(su->type);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005604 Py_XDECREF(su->obj_type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005605 self->ob_type->tp_free(self);
5606}
5607
5608static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005609super_repr(PyObject *self)
5610{
5611 superobject *su = (superobject *)self;
5612
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005613 if (su->obj_type)
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005614 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005615 "<super: <class '%s'>, <%s object>>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005616 su->type ? su->type->tp_name : "NULL",
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005617 su->obj_type->tp_name);
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005618 else
5619 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005620 "<super: <class '%s'>, NULL>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005621 su->type ? su->type->tp_name : "NULL");
5622}
5623
5624static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00005625super_getattro(PyObject *self, PyObject *name)
5626{
5627 superobject *su = (superobject *)self;
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005628 int skip = su->obj_type == NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005629
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005630 if (!skip) {
5631 /* We want __class__ to return the class of the super object
5632 (i.e. super, or a subclass), not the class of su->obj. */
5633 skip = (PyString_Check(name) &&
5634 PyString_GET_SIZE(name) == 9 &&
5635 strcmp(PyString_AS_STRING(name), "__class__") == 0);
5636 }
5637
5638 if (!skip) {
Tim Petersa91e9642001-11-14 23:32:33 +00005639 PyObject *mro, *res, *tmp, *dict;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005640 PyTypeObject *starttype;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005641 descrgetfunc f;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005642 Py_ssize_t i, n;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005643
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005644 starttype = su->obj_type;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005645 mro = starttype->tp_mro;
5646
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005647 if (mro == NULL)
5648 n = 0;
5649 else {
5650 assert(PyTuple_Check(mro));
5651 n = PyTuple_GET_SIZE(mro);
5652 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005653 for (i = 0; i < n; i++) {
Guido van Rossume705ef12001-08-29 15:47:06 +00005654 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
Guido van Rossum705f0f52001-08-24 16:47:00 +00005655 break;
5656 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005657 i++;
5658 res = NULL;
5659 for (; i < n; i++) {
5660 tmp = PyTuple_GET_ITEM(mro, i);
Tim Petersa91e9642001-11-14 23:32:33 +00005661 if (PyType_Check(tmp))
5662 dict = ((PyTypeObject *)tmp)->tp_dict;
5663 else if (PyClass_Check(tmp))
5664 dict = ((PyClassObject *)tmp)->cl_dict;
5665 else
5666 continue;
5667 res = PyDict_GetItem(dict, name);
Guido van Rossum6cc5bb62003-04-16 20:01:36 +00005668 if (res != NULL) {
Guido van Rossum705f0f52001-08-24 16:47:00 +00005669 Py_INCREF(res);
5670 f = res->ob_type->tp_descr_get;
5671 if (f != NULL) {
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005672 tmp = f(res,
5673 /* Only pass 'obj' param if
5674 this is instance-mode super
5675 (See SF ID #743627)
5676 */
Hye-Shik Changff365c92004-03-25 16:37:03 +00005677 (su->obj == (PyObject *)
5678 su->obj_type
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005679 ? (PyObject *)NULL
5680 : su->obj),
Guido van Rossumd4641072002-04-03 02:13:37 +00005681 (PyObject *)starttype);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005682 Py_DECREF(res);
5683 res = tmp;
5684 }
5685 return res;
5686 }
5687 }
5688 }
5689 return PyObject_GenericGetAttr(self, name);
5690}
5691
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005692static PyTypeObject *
Guido van Rossum5b443c62001-12-03 15:38:28 +00005693supercheck(PyTypeObject *type, PyObject *obj)
5694{
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005695 /* Check that a super() call makes sense. Return a type object.
5696
5697 obj can be a new-style class, or an instance of one:
5698
5699 - If it is a class, it must be a subclass of 'type'. This case is
5700 used for class methods; the return value is obj.
5701
5702 - If it is an instance, it must be an instance of 'type'. This is
5703 the normal case; the return value is obj.__class__.
5704
5705 But... when obj is an instance, we want to allow for the case where
5706 obj->ob_type is not a subclass of type, but obj.__class__ is!
5707 This will allow using super() with a proxy for obj.
5708 */
5709
Guido van Rossum8e80a722003-02-18 19:22:22 +00005710 /* Check for first bullet above (special case) */
5711 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
5712 Py_INCREF(obj);
5713 return (PyTypeObject *)obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005714 }
Guido van Rossum8e80a722003-02-18 19:22:22 +00005715
5716 /* Normal case */
5717 if (PyType_IsSubtype(obj->ob_type, type)) {
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005718 Py_INCREF(obj->ob_type);
5719 return obj->ob_type;
5720 }
5721 else {
5722 /* Try the slow way */
5723 static PyObject *class_str = NULL;
5724 PyObject *class_attr;
5725
5726 if (class_str == NULL) {
5727 class_str = PyString_FromString("__class__");
5728 if (class_str == NULL)
5729 return NULL;
5730 }
5731
5732 class_attr = PyObject_GetAttr(obj, class_str);
5733
5734 if (class_attr != NULL &&
5735 PyType_Check(class_attr) &&
5736 (PyTypeObject *)class_attr != obj->ob_type)
5737 {
5738 int ok = PyType_IsSubtype(
5739 (PyTypeObject *)class_attr, type);
5740 if (ok)
5741 return (PyTypeObject *)class_attr;
5742 }
5743
5744 if (class_attr == NULL)
5745 PyErr_Clear();
5746 else
5747 Py_DECREF(class_attr);
5748 }
5749
Tim Peters97e5ff52003-02-18 19:32:50 +00005750 PyErr_SetString(PyExc_TypeError,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005751 "super(type, obj): "
5752 "obj must be an instance or subtype of type");
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005753 return NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005754}
5755
Guido van Rossum705f0f52001-08-24 16:47:00 +00005756static PyObject *
5757super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
5758{
5759 superobject *su = (superobject *)self;
5760 superobject *new;
5761
5762 if (obj == NULL || obj == Py_None || su->obj != NULL) {
5763 /* Not binding to an object, or already bound */
5764 Py_INCREF(self);
5765 return self;
5766 }
Guido van Rossum5b443c62001-12-03 15:38:28 +00005767 if (su->ob_type != &PySuper_Type)
Armin Rigo7726dc02005-05-15 15:32:08 +00005768 /* If su is an instance of a (strict) subclass of super,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005769 call its type */
5770 return PyObject_CallFunction((PyObject *)su->ob_type,
5771 "OO", su->type, obj);
5772 else {
5773 /* Inline the common case */
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005774 PyTypeObject *obj_type = supercheck(su->type, obj);
5775 if (obj_type == NULL)
Guido van Rossum5b443c62001-12-03 15:38:28 +00005776 return NULL;
5777 new = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
5778 NULL, NULL);
5779 if (new == NULL)
5780 return NULL;
5781 Py_INCREF(su->type);
5782 Py_INCREF(obj);
5783 new->type = su->type;
5784 new->obj = obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005785 new->obj_type = obj_type;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005786 return (PyObject *)new;
5787 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005788}
5789
5790static int
5791super_init(PyObject *self, PyObject *args, PyObject *kwds)
5792{
5793 superobject *su = (superobject *)self;
Guido van Rossume705ef12001-08-29 15:47:06 +00005794 PyTypeObject *type;
5795 PyObject *obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005796 PyTypeObject *obj_type = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005797
5798 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
5799 return -1;
5800 if (obj == Py_None)
5801 obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005802 if (obj != NULL) {
5803 obj_type = supercheck(type, obj);
5804 if (obj_type == NULL)
5805 return -1;
5806 Py_INCREF(obj);
5807 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005808 Py_INCREF(type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005809 su->type = type;
5810 su->obj = obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005811 su->obj_type = obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005812 return 0;
5813}
5814
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005815PyDoc_STRVAR(super_doc,
Guido van Rossum705f0f52001-08-24 16:47:00 +00005816"super(type) -> unbound super object\n"
5817"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00005818"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00005819"Typical use to call a cooperative superclass method:\n"
5820"class C(B):\n"
5821" def meth(self, arg):\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005822" super(C, self).meth(arg)");
Guido van Rossum705f0f52001-08-24 16:47:00 +00005823
Guido van Rossum048eb752001-10-02 21:24:57 +00005824static int
5825super_traverse(PyObject *self, visitproc visit, void *arg)
5826{
5827 superobject *su = (superobject *)self;
5828 int err;
5829
5830#define VISIT(SLOT) \
5831 if (SLOT) { \
5832 err = visit((PyObject *)(SLOT), arg); \
5833 if (err) \
5834 return err; \
5835 }
5836
5837 VISIT(su->obj);
5838 VISIT(su->type);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005839 VISIT(su->obj_type);
Guido van Rossum048eb752001-10-02 21:24:57 +00005840
5841#undef VISIT
5842
5843 return 0;
5844}
5845
Guido van Rossum705f0f52001-08-24 16:47:00 +00005846PyTypeObject PySuper_Type = {
5847 PyObject_HEAD_INIT(&PyType_Type)
5848 0, /* ob_size */
5849 "super", /* tp_name */
5850 sizeof(superobject), /* tp_basicsize */
5851 0, /* tp_itemsize */
5852 /* methods */
5853 super_dealloc, /* tp_dealloc */
5854 0, /* tp_print */
5855 0, /* tp_getattr */
5856 0, /* tp_setattr */
5857 0, /* tp_compare */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005858 super_repr, /* tp_repr */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005859 0, /* tp_as_number */
5860 0, /* tp_as_sequence */
5861 0, /* tp_as_mapping */
5862 0, /* tp_hash */
5863 0, /* tp_call */
5864 0, /* tp_str */
5865 super_getattro, /* tp_getattro */
5866 0, /* tp_setattro */
5867 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00005868 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
5869 Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005870 super_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00005871 super_traverse, /* tp_traverse */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005872 0, /* tp_clear */
5873 0, /* tp_richcompare */
5874 0, /* tp_weaklistoffset */
5875 0, /* tp_iter */
5876 0, /* tp_iternext */
5877 0, /* tp_methods */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005878 super_members, /* tp_members */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005879 0, /* tp_getset */
5880 0, /* tp_base */
5881 0, /* tp_dict */
5882 super_descr_get, /* tp_descr_get */
5883 0, /* tp_descr_set */
5884 0, /* tp_dictoffset */
5885 super_init, /* tp_init */
5886 PyType_GenericAlloc, /* tp_alloc */
5887 PyType_GenericNew, /* tp_new */
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00005888 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005889};