blob: dbb9ada5eb6ead335192bfc6daf20a78f09b02c2 [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(
Armin Rigo7ccbca92006-10-04 12:17:45 +0000101 type->tp_name, (Py_ssize_t)(s - type->tp_name));
Michael W. Hudsonade8c8b2002-11-27 16:29:26 +0000102 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
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000130static PyTypeObject *most_derived_metaclass(PyTypeObject *, PyObject *);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000131static PyTypeObject *best_base(PyObject *);
132static int mro_internal(PyTypeObject *);
133static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
134static int add_subclass(PyTypeObject*, PyTypeObject*);
135static void remove_subclass(PyTypeObject *, PyTypeObject *);
136static void update_all_slots(PyTypeObject *);
137
Guido van Rossum8d24ee92003-03-24 23:49:49 +0000138typedef int (*update_callback)(PyTypeObject *, void *);
139static int update_subclasses(PyTypeObject *type, PyObject *name,
140 update_callback callback, void *data);
141static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
142 update_callback callback, void *data);
143
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000144static int
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000145mro_subclasses(PyTypeObject *type, PyObject* temp)
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000146{
147 PyTypeObject *subclass;
148 PyObject *ref, *subclasses, *old_mro;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000149 Py_ssize_t i, n;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000150
151 subclasses = type->tp_subclasses;
152 if (subclasses == NULL)
153 return 0;
154 assert(PyList_Check(subclasses));
155 n = PyList_GET_SIZE(subclasses);
156 for (i = 0; i < n; i++) {
157 ref = PyList_GET_ITEM(subclasses, i);
158 assert(PyWeakref_CheckRef(ref));
159 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
160 assert(subclass != NULL);
161 if ((PyObject *)subclass == Py_None)
162 continue;
163 assert(PyType_Check(subclass));
164 old_mro = subclass->tp_mro;
165 if (mro_internal(subclass) < 0) {
166 subclass->tp_mro = old_mro;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000167 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000168 }
169 else {
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000170 PyObject* tuple;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000171 tuple = PyTuple_Pack(2, subclass, old_mro);
Guido van Rossum19a02ba2003-04-15 22:09:45 +0000172 Py_DECREF(old_mro);
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000173 if (!tuple)
174 return -1;
175 if (PyList_Append(temp, tuple) < 0)
176 return -1;
Guido van Rossum19a02ba2003-04-15 22:09:45 +0000177 Py_DECREF(tuple);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000178 }
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000179 if (mro_subclasses(subclass, temp) < 0)
180 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000181 }
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000182 return 0;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000183}
184
185static int
186type_set_bases(PyTypeObject *type, PyObject *value, void *context)
187{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000188 Py_ssize_t i;
189 int r = 0;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000190 PyObject *ob, *temp;
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000191 PyTypeObject *new_base, *old_base, *metatype;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000192 PyObject *old_bases, *old_mro;
193
194 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
195 PyErr_Format(PyExc_TypeError,
196 "can't set %s.__bases__", type->tp_name);
197 return -1;
198 }
199 if (!value) {
200 PyErr_Format(PyExc_TypeError,
201 "can't delete %s.__bases__", type->tp_name);
202 return -1;
203 }
204 if (!PyTuple_Check(value)) {
205 PyErr_Format(PyExc_TypeError,
206 "can only assign tuple to %s.__bases__, not %s",
207 type->tp_name, value->ob_type->tp_name);
208 return -1;
209 }
Guido van Rossum3bbc0ee2002-12-13 17:49:38 +0000210 if (PyTuple_GET_SIZE(value) == 0) {
211 PyErr_Format(PyExc_TypeError,
212 "can only assign non-empty tuple to %s.__bases__, not ()",
213 type->tp_name);
214 return -1;
215 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000216 for (i = 0; i < PyTuple_GET_SIZE(value); i++) {
217 ob = PyTuple_GET_ITEM(value, i);
218 if (!PyClass_Check(ob) && !PyType_Check(ob)) {
219 PyErr_Format(
220 PyExc_TypeError,
221 "%s.__bases__ must be tuple of old- or new-style classes, not '%s'",
222 type->tp_name, ob->ob_type->tp_name);
223 return -1;
224 }
Michael W. Hudsoncaf17be2002-11-27 10:24:44 +0000225 if (PyType_Check(ob)) {
226 if (PyType_IsSubtype((PyTypeObject*)ob, type)) {
227 PyErr_SetString(PyExc_TypeError,
228 "a __bases__ item causes an inheritance cycle");
229 return -1;
230 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000231 }
232 }
233
Jeremy Hyltonfa955692007-02-27 18:29:45 +0000234
235 metatype = most_derived_metaclass(type->ob_type, value);
236 if (metatype == NULL)
237 return -1;
238 if (metatype != type->ob_type) {
239 PyErr_SetString(PyExc_TypeError,
240 "assignment to __bases__ may not change "
241 "metatype");
242 return -1;
243 }
244
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000245 new_base = best_base(value);
246
247 if (!new_base) {
248 return -1;
249 }
250
251 if (!compatible_for_assignment(type->tp_base, new_base, "__bases__"))
252 return -1;
253
254 Py_INCREF(new_base);
255 Py_INCREF(value);
256
257 old_bases = type->tp_bases;
258 old_base = type->tp_base;
259 old_mro = type->tp_mro;
260
261 type->tp_bases = value;
262 type->tp_base = new_base;
263
264 if (mro_internal(type) < 0) {
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000265 goto bail;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000266 }
267
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000268 temp = PyList_New(0);
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000269 if (!temp)
270 goto bail;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000271
272 r = mro_subclasses(type, temp);
273
274 if (r < 0) {
275 for (i = 0; i < PyList_Size(temp); i++) {
276 PyTypeObject* cls;
277 PyObject* mro;
Raymond Hettinger8ae46892003-10-12 19:09:37 +0000278 PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
279 "", 2, 2, &cls, &mro);
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000280 Py_DECREF(cls->tp_mro);
281 cls->tp_mro = mro;
282 Py_INCREF(cls->tp_mro);
283 }
284 Py_DECREF(temp);
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000285 goto bail;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000286 }
287
288 Py_DECREF(temp);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000289
290 /* any base that was in __bases__ but now isn't, we
Raymond Hettingera8285862002-12-14 17:17:56 +0000291 need to remove |type| from its tp_subclasses.
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000292 conversely, any class now in __bases__ that wasn't
Raymond Hettingera8285862002-12-14 17:17:56 +0000293 needs to have |type| added to its subclasses. */
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000294
295 /* for now, sod that: just remove from all old_bases,
296 add to all new_bases */
297
298 for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) {
299 ob = PyTuple_GET_ITEM(old_bases, i);
300 if (PyType_Check(ob)) {
301 remove_subclass(
302 (PyTypeObject*)ob, type);
303 }
304 }
305
306 for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) {
307 ob = PyTuple_GET_ITEM(value, i);
308 if (PyType_Check(ob)) {
309 if (add_subclass((PyTypeObject*)ob, type) < 0)
310 r = -1;
311 }
312 }
313
314 update_all_slots(type);
315
316 Py_DECREF(old_bases);
317 Py_DECREF(old_base);
318 Py_DECREF(old_mro);
319
320 return r;
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000321
322 bail:
Michael W. Hudsone723e452003-08-07 14:58:10 +0000323 Py_DECREF(type->tp_bases);
324 Py_DECREF(type->tp_base);
325 if (type->tp_mro != old_mro) {
326 Py_DECREF(type->tp_mro);
327 }
328
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000329 type->tp_bases = old_bases;
330 type->tp_base = old_base;
331 type->tp_mro = old_mro;
Tim Petersea7f75d2002-12-07 21:39:16 +0000332
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000333 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000334}
335
336static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000337type_dict(PyTypeObject *type, void *context)
338{
339 if (type->tp_dict == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 Py_INCREF(Py_None);
341 return Py_None;
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000342 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000343 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000344}
345
Tim Peters24008312002-03-17 18:56:20 +0000346static PyObject *
347type_get_doc(PyTypeObject *type, void *context)
348{
349 PyObject *result;
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000350 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
Tim Peters24008312002-03-17 18:56:20 +0000351 return PyString_FromString(type->tp_doc);
Tim Peters24008312002-03-17 18:56:20 +0000352 result = PyDict_GetItemString(type->tp_dict, "__doc__");
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000353 if (result == NULL) {
354 result = Py_None;
355 Py_INCREF(result);
356 }
357 else if (result->ob_type->tp_descr_get) {
Tim Peters2b858972002-04-18 04:12:28 +0000358 result = result->ob_type->tp_descr_get(result, NULL,
359 (PyObject *)type);
Guido van Rossum6ca7d412002-04-18 00:22:00 +0000360 }
361 else {
362 Py_INCREF(result);
363 }
Tim Peters24008312002-03-17 18:56:20 +0000364 return result;
365}
366
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000367static PyGetSetDef type_getsets[] = {
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000368 {"__name__", (getter)type_name, (setter)type_set_name, NULL},
369 {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
Guido van Rossum3926a632001-09-25 16:25:58 +0000370 {"__module__", (getter)type_module, (setter)type_set_module, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000371 {"__dict__", (getter)type_dict, NULL, NULL},
Tim Peters24008312002-03-17 18:56:20 +0000372 {"__doc__", (getter)type_get_doc, NULL, NULL},
Tim Peters6d6c1a32001-08-02 04:15:00 +0000373 {0}
374};
375
Martin v. Löwis0163d6d2001-06-09 07:34:05 +0000376static int
377type_compare(PyObject *v, PyObject *w)
378{
379 /* This is called with type objects only. So we
380 can just compare the addresses. */
381 Py_uintptr_t vv = (Py_uintptr_t)v;
382 Py_uintptr_t ww = (Py_uintptr_t)w;
383 return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
384}
385
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000387type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388{
Barry Warsaw7ce36942001-08-24 18:34:26 +0000389 PyObject *mod, *name, *rtn;
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000390 char *kind;
Guido van Rossumc3542212001-08-16 09:18:56 +0000391
392 mod = type_module(type, NULL);
393 if (mod == NULL)
394 PyErr_Clear();
395 else if (!PyString_Check(mod)) {
396 Py_DECREF(mod);
397 mod = NULL;
398 }
399 name = type_name(type, NULL);
400 if (name == NULL)
401 return NULL;
Barry Warsaw7ce36942001-08-24 18:34:26 +0000402
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000403 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
404 kind = "class";
405 else
406 kind = "type";
407
Barry Warsaw7ce36942001-08-24 18:34:26 +0000408 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__")) {
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000409 rtn = PyString_FromFormat("<%s '%s.%s'>",
410 kind,
Barry Warsaw7ce36942001-08-24 18:34:26 +0000411 PyString_AS_STRING(mod),
412 PyString_AS_STRING(name));
413 }
Guido van Rossumc3542212001-08-16 09:18:56 +0000414 else
Guido van Rossuma4cb7882001-09-25 03:56:29 +0000415 rtn = PyString_FromFormat("<%s '%s'>", kind, type->tp_name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000416
Guido van Rossumc3542212001-08-16 09:18:56 +0000417 Py_XDECREF(mod);
418 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000419 return rtn;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420}
421
Tim Peters6d6c1a32001-08-02 04:15:00 +0000422static PyObject *
423type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
424{
425 PyObject *obj;
426
427 if (type->tp_new == NULL) {
428 PyErr_Format(PyExc_TypeError,
429 "cannot create '%.100s' instances",
430 type->tp_name);
431 return NULL;
432 }
433
Tim Peters3f996e72001-09-13 19:18:27 +0000434 obj = type->tp_new(type, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000435 if (obj != NULL) {
Guido van Rossumf76de622001-10-18 15:49:21 +0000436 /* Ugly exception: when the call was type(something),
437 don't call tp_init on the result. */
438 if (type == &PyType_Type &&
439 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
440 (kwds == NULL ||
441 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
442 return obj;
Guido van Rossum8ace1ab2002-04-06 01:05:01 +0000443 /* If the returned object is not an instance of type,
444 it won't be initialized. */
445 if (!PyType_IsSubtype(obj->ob_type, type))
446 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000447 type = obj->ob_type;
Jeremy Hylton719841e2002-07-16 19:39:38 +0000448 if (PyType_HasFeature(type, Py_TPFLAGS_HAVE_CLASS) &&
449 type->tp_init != NULL &&
Tim Peters6d6c1a32001-08-02 04:15:00 +0000450 type->tp_init(obj, args, kwds) < 0) {
451 Py_DECREF(obj);
452 obj = NULL;
453 }
454 }
455 return obj;
456}
457
458PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000459PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000460{
Tim Peters6d6c1a32001-08-02 04:15:00 +0000461 PyObject *obj;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000462 const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
463 /* note that we need to add one, for the sentinel */
Tim Peters406fe3b2001-10-06 19:04:01 +0000464
465 if (PyType_IS_GC(type))
Neil Schemenauer09a2ae52002-04-12 03:06:53 +0000466 obj = _PyObject_GC_Malloc(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000467 else
Anthony Baxtera6286212006-04-11 07:42:36 +0000468 obj = (PyObject *)PyObject_MALLOC(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000469
Neil Schemenauerc806c882001-08-29 23:54:54 +0000470 if (obj == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000471 return PyErr_NoMemory();
Tim Peters406fe3b2001-10-06 19:04:01 +0000472
Neil Schemenauerc806c882001-08-29 23:54:54 +0000473 memset(obj, '\0', size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000474
Tim Peters6d6c1a32001-08-02 04:15:00 +0000475 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
476 Py_INCREF(type);
Tim Peters406fe3b2001-10-06 19:04:01 +0000477
Tim Peters6d6c1a32001-08-02 04:15:00 +0000478 if (type->tp_itemsize == 0)
479 PyObject_INIT(obj, type);
480 else
481 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000482
Tim Peters6d6c1a32001-08-02 04:15:00 +0000483 if (PyType_IS_GC(type))
Neil Schemenauerc806c882001-08-29 23:54:54 +0000484 _PyObject_GC_TRACK(obj);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000485 return obj;
486}
487
488PyObject *
489PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
490{
491 return type->tp_alloc(type, 0);
492}
493
Guido van Rossum9475a232001-10-05 20:51:39 +0000494/* Helpers for subtyping */
495
496static int
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000497traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
498{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000499 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000500 PyMemberDef *mp;
501
502 n = type->ob_size;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000503 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000504 for (i = 0; i < n; i++, mp++) {
505 if (mp->type == T_OBJECT_EX) {
506 char *addr = (char *)self + mp->offset;
507 PyObject *obj = *(PyObject **)addr;
508 if (obj != NULL) {
509 int err = visit(obj, arg);
510 if (err)
511 return err;
512 }
513 }
514 }
515 return 0;
516}
517
518static int
Guido van Rossum9475a232001-10-05 20:51:39 +0000519subtype_traverse(PyObject *self, visitproc visit, void *arg)
520{
521 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000522 traverseproc basetraverse;
Guido van Rossum9475a232001-10-05 20:51:39 +0000523
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000524 /* Find the nearest base with a different tp_traverse,
525 and traverse slots while we're at it */
Guido van Rossum9475a232001-10-05 20:51:39 +0000526 type = self->ob_type;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000527 base = type;
528 while ((basetraverse = base->tp_traverse) == subtype_traverse) {
529 if (base->ob_size) {
530 int err = traverse_slots(base, self, visit, arg);
531 if (err)
532 return err;
533 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000534 base = base->tp_base;
535 assert(base);
536 }
537
538 if (type->tp_dictoffset != base->tp_dictoffset) {
539 PyObject **dictptr = _PyObject_GetDictPtr(self);
Thomas Woutersc6e55062006-04-15 21:47:09 +0000540 if (dictptr && *dictptr)
541 Py_VISIT(*dictptr);
Guido van Rossum9475a232001-10-05 20:51:39 +0000542 }
543
Thomas Woutersc6e55062006-04-15 21:47:09 +0000544 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
Guido van Rossuma3862092002-06-10 15:24:42 +0000545 /* For a heaptype, the instances count as references
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000546 to the type. Traverse the type so the collector
Guido van Rossuma3862092002-06-10 15:24:42 +0000547 can find cycles involving this link. */
Thomas Woutersc6e55062006-04-15 21:47:09 +0000548 Py_VISIT(type);
Guido van Rossuma3862092002-06-10 15:24:42 +0000549
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000550 if (basetraverse)
551 return basetraverse(self, visit, arg);
552 return 0;
553}
554
555static void
556clear_slots(PyTypeObject *type, PyObject *self)
557{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000558 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000559 PyMemberDef *mp;
560
561 n = type->ob_size;
Guido van Rossume5c691a2003-03-07 15:13:17 +0000562 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000563 for (i = 0; i < n; i++, mp++) {
564 if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
565 char *addr = (char *)self + mp->offset;
566 PyObject *obj = *(PyObject **)addr;
567 if (obj != NULL) {
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000568 *(PyObject **)addr = NULL;
Thomas Woutersedf17d82006-04-15 17:28:34 +0000569 Py_DECREF(obj);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000570 }
571 }
572 }
573}
574
575static int
576subtype_clear(PyObject *self)
577{
578 PyTypeObject *type, *base;
579 inquiry baseclear;
580
581 /* Find the nearest base with a different tp_clear
582 and clear slots while we're at it */
583 type = self->ob_type;
584 base = type;
585 while ((baseclear = base->tp_clear) == subtype_clear) {
586 if (base->ob_size)
587 clear_slots(base, self);
588 base = base->tp_base;
589 assert(base);
590 }
591
Guido van Rossuma3862092002-06-10 15:24:42 +0000592 /* There's no need to clear the instance dict (if any);
593 the collector will call its tp_clear handler. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000594
595 if (baseclear)
596 return baseclear(self);
Guido van Rossum9475a232001-10-05 20:51:39 +0000597 return 0;
598}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000599
600static void
601subtype_dealloc(PyObject *self)
602{
Guido van Rossum14227b42001-12-06 02:35:58 +0000603 PyTypeObject *type, *base;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000604 destructor basedealloc;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000605
Guido van Rossum22b13872002-08-06 21:41:44 +0000606 /* Extract the type; we expect it to be a heap type */
607 type = self->ob_type;
608 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000609
Guido van Rossum22b13872002-08-06 21:41:44 +0000610 /* Test whether the type has GC exactly once */
611
612 if (!PyType_IS_GC(type)) {
613 /* It's really rare to find a dynamic type that doesn't have
614 GC; it can only happen when deriving from 'object' and not
615 adding any slots or instance variables. This allows
616 certain simplifications: there's no need to call
617 clear_slots(), or DECREF the dict, or clear weakrefs. */
618
619 /* Maybe call finalizer; exit early if resurrected */
Guido van Rossumfebd61d2002-08-08 20:55:20 +0000620 if (type->tp_del) {
621 type->tp_del(self);
622 if (self->ob_refcnt > 0)
623 return;
624 }
Guido van Rossum22b13872002-08-06 21:41:44 +0000625
626 /* Find the nearest base with a different tp_dealloc */
627 base = type;
628 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
629 assert(base->ob_size == 0);
630 base = base->tp_base;
631 assert(base);
632 }
633
634 /* Call the base tp_dealloc() */
635 assert(basedealloc);
636 basedealloc(self);
637
638 /* Can't reference self beyond this point */
639 Py_DECREF(type);
640
641 /* Done */
642 return;
643 }
644
645 /* We get here only if the type has GC */
646
647 /* UnTrack and re-Track around the trashcan macro, alas */
Andrew M. Kuchlingc9172d32003-02-06 15:22:49 +0000648 /* See explanation at end of function for full disclosure */
Guido van Rossum0906e072002-08-07 20:42:09 +0000649 PyObject_GC_UnTrack(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000650 ++_PyTrash_delete_nesting;
Guido van Rossum22b13872002-08-06 21:41:44 +0000651 Py_TRASHCAN_SAFE_BEGIN(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000652 --_PyTrash_delete_nesting;
Tim Petersf7f9e992003-11-13 21:59:32 +0000653 /* DO NOT restore GC tracking at this point. weakref callbacks
654 * (if any, and whether directly here or indirectly in something we
655 * call) may trigger GC, and if self is tracked at that point, it
656 * will look like trash to GC and GC will try to delete self again.
Tim Petersadd09b42003-11-12 20:43:28 +0000657 */
Guido van Rossum22b13872002-08-06 21:41:44 +0000658
Guido van Rossum59195fd2003-06-13 20:54:40 +0000659 /* Find the nearest base with a different tp_dealloc */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000660 base = type;
661 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
Tim Peters6d6c1a32001-08-02 04:15:00 +0000662 base = base->tp_base;
663 assert(base);
Guido van Rossum14227b42001-12-06 02:35:58 +0000664 }
665
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000666 /* If we added a weaklist, we clear it. Do this *before* calling
Guido van Rossum59195fd2003-06-13 20:54:40 +0000667 the finalizer (__del__), clearing slots, or clearing the instance
668 dict. */
669
Guido van Rossum1987c662003-05-29 14:29:23 +0000670 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
671 PyObject_ClearWeakRefs(self);
672
673 /* Maybe call finalizer; exit early if resurrected */
674 if (type->tp_del) {
Tim Petersf7f9e992003-11-13 21:59:32 +0000675 _PyObject_GC_TRACK(self);
Guido van Rossum1987c662003-05-29 14:29:23 +0000676 type->tp_del(self);
677 if (self->ob_refcnt > 0)
Tim Petersf7f9e992003-11-13 21:59:32 +0000678 goto endlabel; /* resurrected */
679 else
680 _PyObject_GC_UNTRACK(self);
Brett Cannonf5bee302007-01-23 23:21:22 +0000681 /* New weakrefs could be created during the finalizer call.
682 If this occurs, clear them out without calling their
683 finalizers since they might rely on part of the object
684 being finalized that has already been destroyed. */
685 if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
686 /* Modeled after GET_WEAKREFS_LISTPTR() */
687 PyWeakReference **list = (PyWeakReference **) \
688 PyObject_GET_WEAKREFS_LISTPTR(self);
689 while (*list)
690 _PyWeakref_ClearRef(*list);
691 }
Guido van Rossum1987c662003-05-29 14:29:23 +0000692 }
693
Guido van Rossum59195fd2003-06-13 20:54:40 +0000694 /* Clear slots up to the nearest base with a different tp_dealloc */
695 base = type;
696 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
697 if (base->ob_size)
698 clear_slots(base, self);
699 base = base->tp_base;
700 assert(base);
701 }
702
Tim Peters6d6c1a32001-08-02 04:15:00 +0000703 /* If we added a dict, DECREF it */
Guido van Rossum6fb3fde2001-08-30 20:00:07 +0000704 if (type->tp_dictoffset && !base->tp_dictoffset) {
705 PyObject **dictptr = _PyObject_GetDictPtr(self);
706 if (dictptr != NULL) {
707 PyObject *dict = *dictptr;
708 if (dict != NULL) {
709 Py_DECREF(dict);
710 *dictptr = NULL;
711 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000712 }
713 }
714
Tim Peters0bd743c2003-11-13 22:50:00 +0000715 /* Call the base tp_dealloc(); first retrack self if
716 * basedealloc knows about gc.
717 */
718 if (PyType_IS_GC(base))
719 _PyObject_GC_TRACK(self);
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000720 assert(basedealloc);
721 basedealloc(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000722
723 /* Can't reference self beyond this point */
Guido van Rossum22b13872002-08-06 21:41:44 +0000724 Py_DECREF(type);
725
Guido van Rossum0906e072002-08-07 20:42:09 +0000726 endlabel:
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000727 ++_PyTrash_delete_nesting;
Guido van Rossum22b13872002-08-06 21:41:44 +0000728 Py_TRASHCAN_SAFE_END(self);
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000729 --_PyTrash_delete_nesting;
730
731 /* Explanation of the weirdness around the trashcan macros:
732
733 Q. What do the trashcan macros do?
734
735 A. Read the comment titled "Trashcan mechanism" in object.h.
736 For one, this explains why there must be a call to GC-untrack
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000737 before the trashcan begin macro. Without understanding the
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000738 trashcan code, the answers to the following questions don't make
739 sense.
740
741 Q. Why do we GC-untrack before the trashcan and then immediately
742 GC-track again afterward?
743
744 A. In the case that the base class is GC-aware, the base class
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000745 probably GC-untracks the object. If it does that using the
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000746 UNTRACK macro, this will crash when the object is already
747 untracked. Because we don't know what the base class does, the
748 only safe thing is to make sure the object is tracked when we
749 call the base class dealloc. But... The trashcan begin macro
750 requires that the object is *untracked* before it is called. So
751 the dance becomes:
752
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000753 GC untrack
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000754 trashcan begin
755 GC track
756
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000757 Q. Why did the last question say "immediately GC-track again"?
758 It's nowhere near immediately.
Tim Petersf7f9e992003-11-13 21:59:32 +0000759
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000760 A. Because the code *used* to re-track immediately. Bad Idea.
761 self has a refcount of 0, and if gc ever gets its hands on it
762 (which can happen if any weakref callback gets invoked), it
763 looks like trash to gc too, and gc also tries to delete self
764 then. But we're already deleting self. Double dealloction is
765 a subtle disaster.
Tim Petersf7f9e992003-11-13 21:59:32 +0000766
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000767 Q. Why the bizarre (net-zero) manipulation of
768 _PyTrash_delete_nesting around the trashcan macros?
769
770 A. Some base classes (e.g. list) also use the trashcan mechanism.
771 The following scenario used to be possible:
772
773 - suppose the trashcan level is one below the trashcan limit
774
775 - subtype_dealloc() is called
776
777 - the trashcan limit is not yet reached, so the trashcan level
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000778 is incremented and the code between trashcan begin and end is
779 executed
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000780
781 - this destroys much of the object's contents, including its
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000782 slots and __dict__
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000783
784 - basedealloc() is called; this is really list_dealloc(), or
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000785 some other type which also uses the trashcan macros
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000786
787 - the trashcan limit is now reached, so the object is put on the
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000788 trashcan's to-be-deleted-later list
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000789
790 - basedealloc() returns
791
792 - subtype_dealloc() decrefs the object's type
793
794 - subtype_dealloc() returns
795
796 - later, the trashcan code starts deleting the objects from its
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000797 to-be-deleted-later list
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000798
799 - subtype_dealloc() is called *AGAIN* for the same object
800
801 - at the very least (if the destroyed slots and __dict__ don't
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000802 cause problems) the object's type gets decref'ed a second
803 time, which is *BAD*!!!
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000804
805 The remedy is to make sure that if the code between trashcan
806 begin and end in subtype_dealloc() is called, the code between
807 trashcan begin and end in basedealloc() will also be called.
808 This is done by decrementing the level after passing into the
809 trashcan block, and incrementing it just before leaving the
810 block.
811
812 But now it's possible that a chain of objects consisting solely
813 of objects whose deallocator is subtype_dealloc() will defeat
814 the trashcan mechanism completely: the decremented level means
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000815 that the effective level never reaches the limit. Therefore, we
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000816 *increment* the level *before* entering the trashcan block, and
817 matchingly decrement it after leaving. This means the trashcan
818 code will trigger a little early, but that's no big deal.
819
820 Q. Are there any live examples of code in need of all this
821 complexity?
822
823 A. Yes. See SF bug 668433 for code that crashed (when Python was
824 compiled in debug mode) before the trashcan level manipulations
825 were added. For more discussion, see SF patches 581742, 575073
826 and bug 574207.
827 */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828}
829
Jeremy Hylton938ace62002-07-17 16:30:39 +0000830static PyTypeObject *solid_base(PyTypeObject *type);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000831
Tim Peters6d6c1a32001-08-02 04:15:00 +0000832/* type test with subclassing support */
833
834int
835PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
836{
837 PyObject *mro;
838
Guido van Rossum9478d072001-09-07 18:52:13 +0000839 if (!(a->tp_flags & Py_TPFLAGS_HAVE_CLASS))
840 return b == a || b == &PyBaseObject_Type;
841
Tim Peters6d6c1a32001-08-02 04:15:00 +0000842 mro = a->tp_mro;
843 if (mro != NULL) {
844 /* Deal with multiple inheritance without recursion
845 by walking the MRO tuple */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000846 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000847 assert(PyTuple_Check(mro));
848 n = PyTuple_GET_SIZE(mro);
849 for (i = 0; i < n; i++) {
850 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
851 return 1;
852 }
853 return 0;
854 }
855 else {
856 /* a is not completely initilized yet; follow tp_base */
857 do {
858 if (a == b)
859 return 1;
860 a = a->tp_base;
861 } while (a != NULL);
862 return b == &PyBaseObject_Type;
863 }
864}
865
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000866/* Internal routines to do a method lookup in the type
Guido van Rossum60718732001-08-28 17:47:51 +0000867 without looking in the instance dictionary
868 (so we can't use PyObject_GetAttr) but still binding
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000869 it to the instance. The arguments are the object,
Guido van Rossum60718732001-08-28 17:47:51 +0000870 the method name as a C string, and the address of a
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000871 static variable used to cache the interned Python string.
872
873 Two variants:
874
875 - lookup_maybe() returns NULL without raising an exception
876 when the _PyType_Lookup() call fails;
877
878 - lookup_method() always raises an exception upon errors.
879*/
Guido van Rossum60718732001-08-28 17:47:51 +0000880
881static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000882lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
Guido van Rossum60718732001-08-28 17:47:51 +0000883{
884 PyObject *res;
885
886 if (*attrobj == NULL) {
887 *attrobj = PyString_InternFromString(attrstr);
888 if (*attrobj == NULL)
889 return NULL;
890 }
891 res = _PyType_Lookup(self->ob_type, *attrobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000892 if (res != NULL) {
Guido van Rossum60718732001-08-28 17:47:51 +0000893 descrgetfunc f;
894 if ((f = res->ob_type->tp_descr_get) == NULL)
895 Py_INCREF(res);
896 else
897 res = f(res, self, (PyObject *)(self->ob_type));
898 }
899 return res;
900}
901
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000902static PyObject *
903lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
904{
905 PyObject *res = lookup_maybe(self, attrstr, attrobj);
906 if (res == NULL && !PyErr_Occurred())
907 PyErr_SetObject(PyExc_AttributeError, *attrobj);
908 return res;
909}
910
Guido van Rossum2730b132001-08-28 18:22:14 +0000911/* A variation of PyObject_CallMethod that uses lookup_method()
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +0000912 instead of PyObject_GetAttrString(). This uses the same convention
Guido van Rossum2730b132001-08-28 18:22:14 +0000913 as lookup_method to cache the interned name string object. */
914
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000915static PyObject *
Guido van Rossum2730b132001-08-28 18:22:14 +0000916call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
917{
918 va_list va;
919 PyObject *args, *func = 0, *retval;
Guido van Rossum2730b132001-08-28 18:22:14 +0000920 va_start(va, format);
921
Guido van Rossumda21c012001-10-03 00:50:18 +0000922 func = lookup_maybe(o, name, nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000923 if (func == NULL) {
924 va_end(va);
925 if (!PyErr_Occurred())
Guido van Rossumda21c012001-10-03 00:50:18 +0000926 PyErr_SetObject(PyExc_AttributeError, *nameobj);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000927 return NULL;
928 }
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000929
930 if (format && *format)
931 args = Py_VaBuildValue(format, va);
932 else
933 args = PyTuple_New(0);
934
935 va_end(va);
936
937 if (args == NULL)
938 return NULL;
939
940 assert(PyTuple_Check(args));
941 retval = PyObject_Call(func, args, NULL);
942
943 Py_DECREF(args);
944 Py_DECREF(func);
945
946 return retval;
947}
948
949/* Clone of call_method() that returns NotImplemented when the lookup fails. */
950
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000951static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000952call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
953{
954 va_list va;
955 PyObject *args, *func = 0, *retval;
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000956 va_start(va, format);
957
Guido van Rossumda21c012001-10-03 00:50:18 +0000958 func = lookup_maybe(o, name, nameobj);
Guido van Rossum2730b132001-08-28 18:22:14 +0000959 if (func == NULL) {
960 va_end(va);
Guido van Rossumf21c6be2001-09-14 17:51:50 +0000961 if (!PyErr_Occurred()) {
962 Py_INCREF(Py_NotImplemented);
963 return Py_NotImplemented;
964 }
Guido van Rossum717ce002001-09-14 16:58:08 +0000965 return NULL;
Guido van Rossum2730b132001-08-28 18:22:14 +0000966 }
967
968 if (format && *format)
969 args = Py_VaBuildValue(format, va);
970 else
971 args = PyTuple_New(0);
972
973 va_end(va);
974
Guido van Rossum717ce002001-09-14 16:58:08 +0000975 if (args == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +0000976 return NULL;
977
Guido van Rossum717ce002001-09-14 16:58:08 +0000978 assert(PyTuple_Check(args));
979 retval = PyObject_Call(func, args, NULL);
Guido van Rossum2730b132001-08-28 18:22:14 +0000980
981 Py_DECREF(args);
982 Py_DECREF(func);
983
984 return retval;
985}
986
Tim Petersa91e9642001-11-14 23:32:33 +0000987static int
988fill_classic_mro(PyObject *mro, PyObject *cls)
989{
990 PyObject *bases, *base;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000991 Py_ssize_t i, n;
Tim Petersa91e9642001-11-14 23:32:33 +0000992
993 assert(PyList_Check(mro));
994 assert(PyClass_Check(cls));
995 i = PySequence_Contains(mro, cls);
996 if (i < 0)
997 return -1;
998 if (!i) {
999 if (PyList_Append(mro, cls) < 0)
1000 return -1;
1001 }
1002 bases = ((PyClassObject *)cls)->cl_bases;
1003 assert(bases && PyTuple_Check(bases));
1004 n = PyTuple_GET_SIZE(bases);
1005 for (i = 0; i < n; i++) {
1006 base = PyTuple_GET_ITEM(bases, i);
1007 if (fill_classic_mro(mro, base) < 0)
1008 return -1;
1009 }
1010 return 0;
1011}
1012
1013static PyObject *
1014classic_mro(PyObject *cls)
1015{
1016 PyObject *mro;
1017
1018 assert(PyClass_Check(cls));
1019 mro = PyList_New(0);
1020 if (mro != NULL) {
1021 if (fill_classic_mro(mro, cls) == 0)
1022 return mro;
1023 Py_DECREF(mro);
1024 }
1025 return NULL;
1026}
1027
Tim Petersea7f75d2002-12-07 21:39:16 +00001028/*
Guido van Rossum1f121312002-11-14 19:49:16 +00001029 Method resolution order algorithm C3 described in
1030 "A Monotonic Superclass Linearization for Dylan",
1031 by Kim Barrett, Bob Cassel, Paul Haahr,
Tim Petersea7f75d2002-12-07 21:39:16 +00001032 David A. Moon, Keith Playford, and P. Tucker Withington.
Guido van Rossum1f121312002-11-14 19:49:16 +00001033 (OOPSLA 1996)
1034
Guido van Rossum98f33732002-11-25 21:36:54 +00001035 Some notes about the rules implied by C3:
1036
Tim Petersea7f75d2002-12-07 21:39:16 +00001037 No duplicate bases.
Guido van Rossum98f33732002-11-25 21:36:54 +00001038 It isn't legal to repeat a class in a list of base classes.
1039
1040 The next three properties are the 3 constraints in "C3".
1041
Tim Petersea7f75d2002-12-07 21:39:16 +00001042 Local precendece order.
Guido van Rossum98f33732002-11-25 21:36:54 +00001043 If A precedes B in C's MRO, then A will precede B in the MRO of all
1044 subclasses of C.
1045
1046 Monotonicity.
1047 The MRO of a class must be an extension without reordering of the
1048 MRO of each of its superclasses.
1049
1050 Extended Precedence Graph (EPG).
1051 Linearization is consistent if there is a path in the EPG from
1052 each class to all its successors in the linearization. See
1053 the paper for definition of EPG.
Guido van Rossum1f121312002-11-14 19:49:16 +00001054 */
1055
Tim Petersea7f75d2002-12-07 21:39:16 +00001056static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001057tail_contains(PyObject *list, int whence, PyObject *o) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001058 Py_ssize_t j, size;
Guido van Rossum1f121312002-11-14 19:49:16 +00001059 size = PyList_GET_SIZE(list);
1060
1061 for (j = whence+1; j < size; j++) {
1062 if (PyList_GET_ITEM(list, j) == o)
1063 return 1;
1064 }
1065 return 0;
1066}
1067
Guido van Rossum98f33732002-11-25 21:36:54 +00001068static PyObject *
1069class_name(PyObject *cls)
1070{
1071 PyObject *name = PyObject_GetAttrString(cls, "__name__");
1072 if (name == NULL) {
1073 PyErr_Clear();
1074 Py_XDECREF(name);
1075 name = PyObject_Repr(cls);
1076 }
1077 if (name == NULL)
1078 return NULL;
1079 if (!PyString_Check(name)) {
1080 Py_DECREF(name);
1081 return NULL;
1082 }
1083 return name;
1084}
1085
1086static int
1087check_duplicates(PyObject *list)
1088{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001089 Py_ssize_t i, j, n;
Guido van Rossum98f33732002-11-25 21:36:54 +00001090 /* Let's use a quadratic time algorithm,
1091 assuming that the bases lists is short.
1092 */
1093 n = PyList_GET_SIZE(list);
1094 for (i = 0; i < n; i++) {
1095 PyObject *o = PyList_GET_ITEM(list, i);
1096 for (j = i + 1; j < n; j++) {
1097 if (PyList_GET_ITEM(list, j) == o) {
1098 o = class_name(o);
1099 PyErr_Format(PyExc_TypeError,
1100 "duplicate base class %s",
1101 o ? PyString_AS_STRING(o) : "?");
1102 Py_XDECREF(o);
1103 return -1;
1104 }
1105 }
1106 }
1107 return 0;
1108}
1109
1110/* Raise a TypeError for an MRO order disagreement.
1111
1112 It's hard to produce a good error message. In the absence of better
1113 insight into error reporting, report the classes that were candidates
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001114 to be put next into the MRO. There is some conflict between the
Guido van Rossum98f33732002-11-25 21:36:54 +00001115 order in which they should be put in the MRO, but it's hard to
1116 diagnose what constraint can't be satisfied.
1117*/
1118
1119static void
1120set_mro_error(PyObject *to_merge, int *remain)
1121{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001122 Py_ssize_t i, n, off, to_merge_size;
Guido van Rossum98f33732002-11-25 21:36:54 +00001123 char buf[1000];
1124 PyObject *k, *v;
1125 PyObject *set = PyDict_New();
Georg Brandl5c170fd2006-03-17 19:03:25 +00001126 if (!set) return;
Guido van Rossum98f33732002-11-25 21:36:54 +00001127
1128 to_merge_size = PyList_GET_SIZE(to_merge);
1129 for (i = 0; i < to_merge_size; i++) {
1130 PyObject *L = PyList_GET_ITEM(to_merge, i);
1131 if (remain[i] < PyList_GET_SIZE(L)) {
1132 PyObject *c = PyList_GET_ITEM(L, remain[i]);
Georg Brandl5c170fd2006-03-17 19:03:25 +00001133 if (PyDict_SetItem(set, c, Py_None) < 0) {
1134 Py_DECREF(set);
Guido van Rossum98f33732002-11-25 21:36:54 +00001135 return;
Georg Brandl5c170fd2006-03-17 19:03:25 +00001136 }
Guido van Rossum98f33732002-11-25 21:36:54 +00001137 }
1138 }
1139 n = PyDict_Size(set);
1140
Raymond Hettingerf394df42003-04-06 19:13:41 +00001141 off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
1142consistent method resolution\norder (MRO) for bases");
Guido van Rossum98f33732002-11-25 21:36:54 +00001143 i = 0;
Skip Montanaro429433b2006-04-18 00:35:43 +00001144 while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
Guido van Rossum98f33732002-11-25 21:36:54 +00001145 PyObject *name = class_name(k);
1146 off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s",
1147 name ? PyString_AS_STRING(name) : "?");
1148 Py_XDECREF(name);
Skip Montanaro429433b2006-04-18 00:35:43 +00001149 if (--n && (size_t)(off+1) < sizeof(buf)) {
Guido van Rossum98f33732002-11-25 21:36:54 +00001150 buf[off++] = ',';
1151 buf[off] = '\0';
1152 }
1153 }
1154 PyErr_SetString(PyExc_TypeError, buf);
1155 Py_DECREF(set);
1156}
1157
Tim Petersea7f75d2002-12-07 21:39:16 +00001158static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001159pmerge(PyObject *acc, PyObject* to_merge) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001160 Py_ssize_t i, j, to_merge_size, empty_cnt;
Guido van Rossum1f121312002-11-14 19:49:16 +00001161 int *remain;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001162 int ok;
Tim Petersea7f75d2002-12-07 21:39:16 +00001163
Guido van Rossum1f121312002-11-14 19:49:16 +00001164 to_merge_size = PyList_GET_SIZE(to_merge);
1165
Guido van Rossum98f33732002-11-25 21:36:54 +00001166 /* remain stores an index into each sublist of to_merge.
1167 remain[i] is the index of the next base in to_merge[i]
1168 that is not included in acc.
1169 */
Anthony Baxtera6286212006-04-11 07:42:36 +00001170 remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size);
Guido van Rossum1f121312002-11-14 19:49:16 +00001171 if (remain == NULL)
1172 return -1;
1173 for (i = 0; i < to_merge_size; i++)
1174 remain[i] = 0;
1175
1176 again:
1177 empty_cnt = 0;
1178 for (i = 0; i < to_merge_size; i++) {
1179 PyObject *candidate;
Tim Petersea7f75d2002-12-07 21:39:16 +00001180
Guido van Rossum1f121312002-11-14 19:49:16 +00001181 PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
1182
1183 if (remain[i] >= PyList_GET_SIZE(cur_list)) {
1184 empty_cnt++;
1185 continue;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001186 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001187
Guido van Rossum98f33732002-11-25 21:36:54 +00001188 /* Choose next candidate for MRO.
1189
1190 The input sequences alone can determine the choice.
1191 If not, choose the class which appears in the MRO
1192 of the earliest direct superclass of the new class.
1193 */
1194
Guido van Rossum1f121312002-11-14 19:49:16 +00001195 candidate = PyList_GET_ITEM(cur_list, remain[i]);
1196 for (j = 0; j < to_merge_size; j++) {
1197 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
Guido van Rossum98f33732002-11-25 21:36:54 +00001198 if (tail_contains(j_lst, remain[j], candidate)) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001199 goto skip; /* continue outer loop */
Guido van Rossum98f33732002-11-25 21:36:54 +00001200 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001201 }
1202 ok = PyList_Append(acc, candidate);
1203 if (ok < 0) {
1204 PyMem_Free(remain);
1205 return -1;
1206 }
1207 for (j = 0; j < to_merge_size; j++) {
1208 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
Guido van Rossum768158c2002-12-31 16:33:01 +00001209 if (remain[j] < PyList_GET_SIZE(j_lst) &&
1210 PyList_GET_ITEM(j_lst, remain[j]) == candidate) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001211 remain[j]++;
1212 }
1213 }
1214 goto again;
Tim Peters9a6b8d82002-11-14 23:22:33 +00001215 skip: ;
Guido van Rossum1f121312002-11-14 19:49:16 +00001216 }
1217
Guido van Rossum98f33732002-11-25 21:36:54 +00001218 if (empty_cnt == to_merge_size) {
1219 PyMem_FREE(remain);
Guido van Rossum1f121312002-11-14 19:49:16 +00001220 return 0;
Guido van Rossum98f33732002-11-25 21:36:54 +00001221 }
1222 set_mro_error(to_merge, remain);
1223 PyMem_FREE(remain);
Guido van Rossum1f121312002-11-14 19:49:16 +00001224 return -1;
1225}
1226
Tim Peters6d6c1a32001-08-02 04:15:00 +00001227static PyObject *
1228mro_implementation(PyTypeObject *type)
1229{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001230 Py_ssize_t i, n;
1231 int ok;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001232 PyObject *bases, *result;
Guido van Rossum1f121312002-11-14 19:49:16 +00001233 PyObject *to_merge, *bases_aslist;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001234
Guido van Rossum63517572002-06-18 16:44:57 +00001235 if(type->tp_dict == NULL) {
1236 if(PyType_Ready(type) < 0)
1237 return NULL;
1238 }
1239
Guido van Rossum98f33732002-11-25 21:36:54 +00001240 /* Find a superclass linearization that honors the constraints
1241 of the explicit lists of bases and the constraints implied by
Tim Petersea7f75d2002-12-07 21:39:16 +00001242 each base class.
Guido van Rossum98f33732002-11-25 21:36:54 +00001243
1244 to_merge is a list of lists, where each list is a superclass
1245 linearization implied by a base class. The last element of
1246 to_merge is the declared list of bases.
1247 */
1248
Tim Peters6d6c1a32001-08-02 04:15:00 +00001249 bases = type->tp_bases;
1250 n = PyTuple_GET_SIZE(bases);
Guido van Rossum1f121312002-11-14 19:49:16 +00001251
1252 to_merge = PyList_New(n+1);
1253 if (to_merge == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001254 return NULL;
Guido van Rossum1f121312002-11-14 19:49:16 +00001255
Tim Peters6d6c1a32001-08-02 04:15:00 +00001256 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001257 PyObject *base = PyTuple_GET_ITEM(bases, i);
1258 PyObject *parentMRO;
1259 if (PyType_Check(base))
1260 parentMRO = PySequence_List(
1261 ((PyTypeObject*)base)->tp_mro);
1262 else
1263 parentMRO = classic_mro(base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001264 if (parentMRO == NULL) {
Guido van Rossum1f121312002-11-14 19:49:16 +00001265 Py_DECREF(to_merge);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001266 return NULL;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001267 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001268
1269 PyList_SET_ITEM(to_merge, i, parentMRO);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001270 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001271
1272 bases_aslist = PySequence_List(bases);
1273 if (bases_aslist == NULL) {
1274 Py_DECREF(to_merge);
1275 return NULL;
1276 }
Guido van Rossum98f33732002-11-25 21:36:54 +00001277 /* This is just a basic sanity check. */
1278 if (check_duplicates(bases_aslist) < 0) {
1279 Py_DECREF(to_merge);
1280 Py_DECREF(bases_aslist);
1281 return NULL;
1282 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001283 PyList_SET_ITEM(to_merge, n, bases_aslist);
1284
1285 result = Py_BuildValue("[O]", (PyObject *)type);
1286 if (result == NULL) {
1287 Py_DECREF(to_merge);
1288 return NULL;
1289 }
1290
1291 ok = pmerge(result, to_merge);
1292 Py_DECREF(to_merge);
1293 if (ok < 0) {
1294 Py_DECREF(result);
1295 return NULL;
1296 }
1297
Tim Peters6d6c1a32001-08-02 04:15:00 +00001298 return result;
1299}
1300
1301static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001302mro_external(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001303{
1304 PyTypeObject *type = (PyTypeObject *)self;
1305
Tim Peters6d6c1a32001-08-02 04:15:00 +00001306 return mro_implementation(type);
1307}
1308
1309static int
1310mro_internal(PyTypeObject *type)
1311{
1312 PyObject *mro, *result, *tuple;
Armin Rigo037d1e02005-12-29 17:07:39 +00001313 int checkit = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001314
1315 if (type->ob_type == &PyType_Type) {
1316 result = mro_implementation(type);
1317 }
1318 else {
Guido van Rossum60718732001-08-28 17:47:51 +00001319 static PyObject *mro_str;
Armin Rigo037d1e02005-12-29 17:07:39 +00001320 checkit = 1;
Guido van Rossum60718732001-08-28 17:47:51 +00001321 mro = lookup_method((PyObject *)type, "mro", &mro_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001322 if (mro == NULL)
1323 return -1;
1324 result = PyObject_CallObject(mro, NULL);
1325 Py_DECREF(mro);
1326 }
1327 if (result == NULL)
1328 return -1;
1329 tuple = PySequence_Tuple(result);
1330 Py_DECREF(result);
Armin Rigo037d1e02005-12-29 17:07:39 +00001331 if (tuple == NULL)
1332 return -1;
1333 if (checkit) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001334 Py_ssize_t i, len;
Armin Rigo037d1e02005-12-29 17:07:39 +00001335 PyObject *cls;
1336 PyTypeObject *solid;
1337
1338 solid = solid_base(type);
1339
1340 len = PyTuple_GET_SIZE(tuple);
1341
1342 for (i = 0; i < len; i++) {
1343 PyTypeObject *t;
1344 cls = PyTuple_GET_ITEM(tuple, i);
1345 if (PyClass_Check(cls))
1346 continue;
1347 else if (!PyType_Check(cls)) {
1348 PyErr_Format(PyExc_TypeError,
1349 "mro() returned a non-class ('%.500s')",
1350 cls->ob_type->tp_name);
Neal Norwitz50bf51a2006-01-02 02:46:54 +00001351 Py_DECREF(tuple);
Armin Rigo037d1e02005-12-29 17:07:39 +00001352 return -1;
1353 }
1354 t = (PyTypeObject*)cls;
1355 if (!PyType_IsSubtype(solid, solid_base(t))) {
1356 PyErr_Format(PyExc_TypeError,
1357 "mro() returned base with unsuitable layout ('%.500s')",
1358 t->tp_name);
Neal Norwitz50bf51a2006-01-02 02:46:54 +00001359 Py_DECREF(tuple);
Armin Rigo037d1e02005-12-29 17:07:39 +00001360 return -1;
1361 }
1362 }
1363 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001364 type->tp_mro = tuple;
1365 return 0;
1366}
1367
1368
1369/* Calculate the best base amongst multiple base classes.
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001370 This is the first one that's on the path to the "solid base".
1371
1372 Requires that all base classes be types or classic classes.
1373
1374 Will return NULL with TypeError set if
1375 1) the base classes have conflicting layout instances, or
1376 2) all the bases are classic classes.
1377*/
Tim Peters6d6c1a32001-08-02 04:15:00 +00001378
1379static PyTypeObject *
1380best_base(PyObject *bases)
1381{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001382 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001383 PyTypeObject *base, *winner, *candidate, *base_i;
Tim Petersa91e9642001-11-14 23:32:33 +00001384 PyObject *base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001385
1386 assert(PyTuple_Check(bases));
1387 n = PyTuple_GET_SIZE(bases);
1388 assert(n > 0);
Tim Petersa91e9642001-11-14 23:32:33 +00001389 base = NULL;
1390 winner = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001391 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00001392 base_proto = PyTuple_GET_ITEM(bases, i);
1393 if (PyClass_Check(base_proto))
1394 continue;
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001395 assert(PyType_Check(base_proto));
Tim Petersa91e9642001-11-14 23:32:33 +00001396 base_i = (PyTypeObject *)base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001397 if (base_i->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00001398 if (PyType_Ready(base_i) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001399 return NULL;
1400 }
1401 candidate = solid_base(base_i);
Tim Petersa91e9642001-11-14 23:32:33 +00001402 if (winner == NULL) {
1403 winner = candidate;
1404 base = base_i;
1405 }
1406 else if (PyType_IsSubtype(winner, candidate))
Tim Peters6d6c1a32001-08-02 04:15:00 +00001407 ;
1408 else if (PyType_IsSubtype(candidate, winner)) {
1409 winner = candidate;
1410 base = base_i;
1411 }
1412 else {
1413 PyErr_SetString(
1414 PyExc_TypeError,
1415 "multiple bases have "
1416 "instance lay-out conflict");
1417 return NULL;
1418 }
1419 }
Guido van Rossume54616c2001-12-14 04:19:56 +00001420 if (base == NULL)
1421 PyErr_SetString(PyExc_TypeError,
1422 "a new-style class can't have only classic bases");
Tim Peters6d6c1a32001-08-02 04:15:00 +00001423 return base;
1424}
1425
1426static int
1427extra_ivars(PyTypeObject *type, PyTypeObject *base)
1428{
Neil Schemenauerc806c882001-08-29 23:54:54 +00001429 size_t t_size = type->tp_basicsize;
1430 size_t b_size = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001431
Guido van Rossum9676b222001-08-17 20:32:36 +00001432 assert(t_size >= b_size); /* Else type smaller than base! */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001433 if (type->tp_itemsize || base->tp_itemsize) {
1434 /* If itemsize is involved, stricter rules */
1435 return t_size != b_size ||
1436 type->tp_itemsize != base->tp_itemsize;
1437 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001438 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
1439 type->tp_weaklistoffset + sizeof(PyObject *) == t_size)
1440 t_size -= sizeof(PyObject *);
1441 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
1442 type->tp_dictoffset + sizeof(PyObject *) == t_size)
1443 t_size -= sizeof(PyObject *);
1444
1445 return t_size != b_size;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001446}
1447
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001448/* Return the type object that will determine the layout of the instance. */
1449
Tim Peters6d6c1a32001-08-02 04:15:00 +00001450static PyTypeObject *
1451solid_base(PyTypeObject *type)
1452{
1453 PyTypeObject *base;
1454
1455 if (type->tp_base)
1456 base = solid_base(type->tp_base);
1457 else
1458 base = &PyBaseObject_Type;
1459 if (extra_ivars(type, base))
1460 return type;
1461 else
1462 return base;
1463}
1464
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001465/* Determine the proper metatype to deal with this, and check some
1466 error cases while we're at it. Note that if some other metatype
1467 wins to contract, it's possible that its instances are not types.
1468
1469 Error cases of interest: 1. The metaclass is not a subclass of a
1470 base class. 2. A non-type, non-classic base class appears before
1471 type.
1472*/
1473
1474static PyTypeObject *
1475most_derived_metaclass(PyTypeObject *metatype, PyObject *bases)
1476{
1477 Py_ssize_t nbases, i;
1478 PyTypeObject *winner;
1479 /* types_ordered: One of three states possible:
1480 0 type is in bases
1481 1 non-types also in bases
1482 2 type follows non-type in bases (error)
1483 */
1484 int types_ordered = 0;
1485
1486 nbases = PyTuple_GET_SIZE(bases);
1487 winner = metatype;
1488 for (i = 0; i < nbases; i++) {
1489 PyObject *tmp = PyTuple_GET_ITEM(bases, i);
1490 PyTypeObject *tmptype = tmp->ob_type;
1491 if (tmptype == &PyClass_Type)
1492 continue; /* Special case classic classes */
1493 if (!PyType_Check(tmp)) {
1494 PyErr_SetString(PyExc_TypeError,
1495 "bases must be types");
1496 return NULL;
1497 }
1498 if (PyObject_IsSubclass(tmp, (PyObject*)&PyType_Type)) {
1499 if (types_ordered == 1) {
1500 types_ordered = 2;
1501 }
1502 }
1503 else if (!types_ordered)
1504 types_ordered = 1;
1505 if (winner == tmptype)
1506 continue;
1507 if (PyType_IsSubtype(winner, tmptype))
1508 continue;
1509 if (PyType_IsSubtype(tmptype, winner)) {
1510 winner = tmptype;
1511 continue;
1512 }
1513 PyErr_SetString(PyExc_TypeError,
1514 "metaclass conflict: "
1515 "the metaclass of a derived class "
1516 "must be a (non-strict) subclass "
1517 "of the metaclasses of all its bases");
1518 return NULL;
1519 }
1520 if (types_ordered == 2) {
1521 PyErr_SetString(PyExc_TypeError,
1522 "metaclass conflict: "
1523 "type must occur in bases before other "
1524 "non-classic base classes");
1525 return NULL;
1526 }
1527 return winner;
1528}
1529
Jeremy Hylton938ace62002-07-17 16:30:39 +00001530static void object_dealloc(PyObject *);
1531static int object_init(PyObject *, PyObject *, PyObject *);
1532static int update_slot(PyTypeObject *, PyObject *);
1533static void fixup_slot_dispatchers(PyTypeObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001534
1535static PyObject *
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001536subtype_dict(PyObject *obj, void *context)
1537{
1538 PyObject **dictptr = _PyObject_GetDictPtr(obj);
1539 PyObject *dict;
1540
1541 if (dictptr == NULL) {
1542 PyErr_SetString(PyExc_AttributeError,
1543 "This object has no __dict__");
1544 return NULL;
1545 }
1546 dict = *dictptr;
Guido van Rossum3926a632001-09-25 16:25:58 +00001547 if (dict == NULL)
1548 *dictptr = dict = PyDict_New();
1549 Py_XINCREF(dict);
1550 return dict;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001551}
1552
Guido van Rossum6661be32001-10-26 04:26:12 +00001553static int
1554subtype_setdict(PyObject *obj, PyObject *value, void *context)
1555{
1556 PyObject **dictptr = _PyObject_GetDictPtr(obj);
1557 PyObject *dict;
1558
1559 if (dictptr == NULL) {
1560 PyErr_SetString(PyExc_AttributeError,
1561 "This object has no __dict__");
1562 return -1;
1563 }
Guido van Rossumd331cb52001-12-05 19:46:42 +00001564 if (value != NULL && !PyDict_Check(value)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001565 PyErr_Format(PyExc_TypeError,
1566 "__dict__ must be set to a dictionary, "
1567 "not a '%.200s'", value->ob_type->tp_name);
Guido van Rossum6661be32001-10-26 04:26:12 +00001568 return -1;
1569 }
1570 dict = *dictptr;
Guido van Rossumd331cb52001-12-05 19:46:42 +00001571 Py_XINCREF(value);
Guido van Rossum6661be32001-10-26 04:26:12 +00001572 *dictptr = value;
1573 Py_XDECREF(dict);
1574 return 0;
1575}
1576
Guido van Rossumad47da02002-08-12 19:05:44 +00001577static PyObject *
1578subtype_getweakref(PyObject *obj, void *context)
1579{
1580 PyObject **weaklistptr;
1581 PyObject *result;
1582
1583 if (obj->ob_type->tp_weaklistoffset == 0) {
1584 PyErr_SetString(PyExc_AttributeError,
Fred Drake7a36f5f2006-08-04 05:17:21 +00001585 "This object has no __weakref__");
Guido van Rossumad47da02002-08-12 19:05:44 +00001586 return NULL;
1587 }
1588 assert(obj->ob_type->tp_weaklistoffset > 0);
1589 assert(obj->ob_type->tp_weaklistoffset + sizeof(PyObject *) <=
Guido van Rossum3747a0f2002-08-12 19:25:08 +00001590 (size_t)(obj->ob_type->tp_basicsize));
Guido van Rossumad47da02002-08-12 19:05:44 +00001591 weaklistptr = (PyObject **)
Guido van Rossum3747a0f2002-08-12 19:25:08 +00001592 ((char *)obj + obj->ob_type->tp_weaklistoffset);
Guido van Rossumad47da02002-08-12 19:05:44 +00001593 if (*weaklistptr == NULL)
1594 result = Py_None;
1595 else
1596 result = *weaklistptr;
1597 Py_INCREF(result);
1598 return result;
1599}
1600
Guido van Rossum373c7412003-01-07 13:41:37 +00001601/* Three variants on the subtype_getsets list. */
1602
1603static PyGetSetDef subtype_getsets_full[] = {
Guido van Rossumad47da02002-08-12 19:05:44 +00001604 {"__dict__", subtype_dict, subtype_setdict,
Neal Norwitz858e34f2002-08-13 17:18:45 +00001605 PyDoc_STR("dictionary for instance variables (if defined)")},
Guido van Rossumad47da02002-08-12 19:05:44 +00001606 {"__weakref__", subtype_getweakref, NULL,
Neal Norwitz858e34f2002-08-13 17:18:45 +00001607 PyDoc_STR("list of weak references to the object (if defined)")},
Guido van Rossumad47da02002-08-12 19:05:44 +00001608 {0}
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001609};
1610
Guido van Rossum373c7412003-01-07 13:41:37 +00001611static PyGetSetDef subtype_getsets_dict_only[] = {
1612 {"__dict__", subtype_dict, subtype_setdict,
1613 PyDoc_STR("dictionary for instance variables (if defined)")},
1614 {0}
1615};
1616
1617static PyGetSetDef subtype_getsets_weakref_only[] = {
1618 {"__weakref__", subtype_getweakref, NULL,
1619 PyDoc_STR("list of weak references to the object (if defined)")},
1620 {0}
1621};
1622
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001623static int
1624valid_identifier(PyObject *s)
1625{
Guido van Rossum03013a02002-07-16 14:30:28 +00001626 unsigned char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001627 Py_ssize_t i, n;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001628
1629 if (!PyString_Check(s)) {
Georg Brandlccff7852006-06-18 22:17:29 +00001630 PyErr_Format(PyExc_TypeError,
1631 "__slots__ items must be strings, not '%.200s'",
1632 s->ob_type->tp_name);
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001633 return 0;
1634 }
Guido van Rossum03013a02002-07-16 14:30:28 +00001635 p = (unsigned char *) PyString_AS_STRING(s);
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001636 n = PyString_GET_SIZE(s);
1637 /* We must reject an empty name. As a hack, we bump the
1638 length to 1 so that the loop will balk on the trailing \0. */
1639 if (n == 0)
1640 n = 1;
1641 for (i = 0; i < n; i++, p++) {
1642 if (!(i == 0 ? isalpha(*p) : isalnum(*p)) && *p != '_') {
1643 PyErr_SetString(PyExc_TypeError,
1644 "__slots__ must be identifiers");
1645 return 0;
1646 }
1647 }
1648 return 1;
1649}
1650
Martin v. Löwisd919a592002-10-14 21:07:28 +00001651#ifdef Py_USING_UNICODE
1652/* Replace Unicode objects in slots. */
1653
1654static PyObject *
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001655_unicode_to_string(PyObject *slots, Py_ssize_t nslots)
Martin v. Löwisd919a592002-10-14 21:07:28 +00001656{
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001657 PyObject *tmp = NULL;
1658 PyObject *slot_name, *new_name;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001659 Py_ssize_t i;
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001660
Martin v. Löwisd919a592002-10-14 21:07:28 +00001661 for (i = 0; i < nslots; i++) {
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001662 if (PyUnicode_Check(slot_name = PyTuple_GET_ITEM(slots, i))) {
1663 if (tmp == NULL) {
1664 tmp = PySequence_List(slots);
Martin v. Löwisd919a592002-10-14 21:07:28 +00001665 if (tmp == NULL)
1666 return NULL;
1667 }
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001668 new_name = _PyUnicode_AsDefaultEncodedString(slot_name,
1669 NULL);
1670 if (new_name == NULL) {
Martin v. Löwisd919a592002-10-14 21:07:28 +00001671 Py_DECREF(tmp);
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001672 return NULL;
Martin v. Löwisd919a592002-10-14 21:07:28 +00001673 }
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001674 Py_INCREF(new_name);
1675 PyList_SET_ITEM(tmp, i, new_name);
1676 Py_DECREF(slot_name);
Martin v. Löwisd919a592002-10-14 21:07:28 +00001677 }
1678 }
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001679 if (tmp != NULL) {
1680 slots = PyList_AsTuple(tmp);
1681 Py_DECREF(tmp);
1682 }
1683 return slots;
Martin v. Löwisd919a592002-10-14 21:07:28 +00001684}
1685#endif
1686
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001687static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001688type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
1689{
1690 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001691 static char *kwlist[] = {"name", "bases", "dict", 0};
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001692 PyObject *slots, *tmp, *newslots;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001693 PyTypeObject *type, *base, *tmptype, *winner;
Guido van Rossume5c691a2003-03-07 15:13:17 +00001694 PyHeapTypeObject *et;
Guido van Rossum6f799372001-09-20 20:46:19 +00001695 PyMemberDef *mp;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001696 Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
Guido van Rossumad47da02002-08-12 19:05:44 +00001697 int j, may_add_dict, may_add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001698
Tim Peters3abca122001-10-27 19:37:48 +00001699 assert(args != NULL && PyTuple_Check(args));
1700 assert(kwds == NULL || PyDict_Check(kwds));
1701
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001702 /* Special case: type(x) should return x->ob_type */
Tim Peters3abca122001-10-27 19:37:48 +00001703 {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001704 const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1705 const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
Tim Peters3abca122001-10-27 19:37:48 +00001706
1707 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
1708 PyObject *x = PyTuple_GET_ITEM(args, 0);
1709 Py_INCREF(x->ob_type);
1710 return (PyObject *) x->ob_type;
1711 }
1712
1713 /* SF bug 475327 -- if that didn't trigger, we need 3
1714 arguments. but PyArg_ParseTupleAndKeywords below may give
1715 a msg saying type() needs exactly 3. */
1716 if (nargs + nkwds != 3) {
1717 PyErr_SetString(PyExc_TypeError,
1718 "type() takes 1 or 3 arguments");
1719 return NULL;
1720 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001721 }
1722
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001723 /* Check arguments: (name, bases, dict) */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001724 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
1725 &name,
1726 &PyTuple_Type, &bases,
1727 &PyDict_Type, &dict))
1728 return NULL;
1729
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001730 winner = most_derived_metaclass(metatype, bases);
1731 if (winner == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001732 return NULL;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001733 if (winner != metatype) {
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001734 if (winner->tp_new != type_new) /* Pass it to the winner */ {
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001735 return winner->tp_new(winner, args, kwds);
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001736 }
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001737 metatype = winner;
1738 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001739
1740 /* Adjust for empty tuple bases */
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001741 nbases = PyTuple_GET_SIZE(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001742 if (nbases == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001743 bases = PyTuple_Pack(1, &PyBaseObject_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001744 if (bases == NULL)
1745 return NULL;
1746 nbases = 1;
1747 }
1748 else
1749 Py_INCREF(bases);
1750
1751 /* XXX From here until type is allocated, "return NULL" leaks bases! */
1752
1753 /* Calculate best base, and check that all bases are type objects */
1754 base = best_base(bases);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001755 if (base == NULL) {
1756 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001757 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001758 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001759 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
1760 PyErr_Format(PyExc_TypeError,
1761 "type '%.100s' is not an acceptable base type",
1762 base->tp_name);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001763 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001764 return NULL;
1765 }
1766
Tim Peters6d6c1a32001-08-02 04:15:00 +00001767 /* Check for a __slots__ sequence variable in dict, and count it */
1768 slots = PyDict_GetItemString(dict, "__slots__");
1769 nslots = 0;
Guido van Rossum9676b222001-08-17 20:32:36 +00001770 add_dict = 0;
1771 add_weak = 0;
Guido van Rossumad47da02002-08-12 19:05:44 +00001772 may_add_dict = base->tp_dictoffset == 0;
1773 may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0;
1774 if (slots == NULL) {
1775 if (may_add_dict) {
1776 add_dict++;
1777 }
1778 if (may_add_weak) {
1779 add_weak++;
1780 }
1781 }
1782 else {
1783 /* Have slots */
1784
Tim Peters6d6c1a32001-08-02 04:15:00 +00001785 /* Make it into a tuple */
1786 if (PyString_Check(slots))
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001787 slots = PyTuple_Pack(1, slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001788 else
1789 slots = PySequence_Tuple(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001790 if (slots == NULL) {
1791 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001792 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001793 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001794 assert(PyTuple_Check(slots));
1795
1796 /* Are slots allowed? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001797 nslots = PyTuple_GET_SIZE(slots);
Jeremy Hylton1c7a0ea2003-07-16 16:08:23 +00001798 if (nslots > 0 && base->tp_itemsize != 0) {
Guido van Rossumc4141872001-08-30 04:43:35 +00001799 PyErr_Format(PyExc_TypeError,
1800 "nonempty __slots__ "
1801 "not supported for subtype of '%s'",
1802 base->tp_name);
Guido van Rossumad47da02002-08-12 19:05:44 +00001803 bad_slots:
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001804 Py_DECREF(bases);
Guido van Rossumad47da02002-08-12 19:05:44 +00001805 Py_DECREF(slots);
Guido van Rossumc4141872001-08-30 04:43:35 +00001806 return NULL;
1807 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001808
Martin v. Löwisd919a592002-10-14 21:07:28 +00001809#ifdef Py_USING_UNICODE
1810 tmp = _unicode_to_string(slots, nslots);
Žiga Seilnacht71436f02007-03-14 12:24:09 +00001811 if (tmp == NULL)
1812 goto bad_slots;
Martin v. Löwis13b1a5c2002-10-14 21:11:34 +00001813 if (tmp != slots) {
1814 Py_DECREF(slots);
1815 slots = tmp;
1816 }
Martin v. Löwisd919a592002-10-14 21:07:28 +00001817#endif
Guido van Rossumad47da02002-08-12 19:05:44 +00001818 /* Check for valid slot names and two special cases */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001819 for (i = 0; i < nslots; i++) {
Guido van Rossumad47da02002-08-12 19:05:44 +00001820 PyObject *tmp = PyTuple_GET_ITEM(slots, i);
1821 char *s;
1822 if (!valid_identifier(tmp))
1823 goto bad_slots;
1824 assert(PyString_Check(tmp));
1825 s = PyString_AS_STRING(tmp);
1826 if (strcmp(s, "__dict__") == 0) {
1827 if (!may_add_dict || add_dict) {
1828 PyErr_SetString(PyExc_TypeError,
1829 "__dict__ slot disallowed: "
1830 "we already got one");
1831 goto bad_slots;
1832 }
1833 add_dict++;
1834 }
1835 if (strcmp(s, "__weakref__") == 0) {
1836 if (!may_add_weak || add_weak) {
1837 PyErr_SetString(PyExc_TypeError,
1838 "__weakref__ slot disallowed: "
1839 "either we already got one, "
1840 "or __itemsize__ != 0");
1841 goto bad_slots;
1842 }
1843 add_weak++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001844 }
1845 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001846
Guido van Rossumad47da02002-08-12 19:05:44 +00001847 /* Copy slots into yet another tuple, demangling names */
1848 newslots = PyTuple_New(nslots - add_dict - add_weak);
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001849 if (newslots == NULL)
Guido van Rossumad47da02002-08-12 19:05:44 +00001850 goto bad_slots;
1851 for (i = j = 0; i < nslots; i++) {
1852 char *s;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001853 tmp = PyTuple_GET_ITEM(slots, i);
Guido van Rossumad47da02002-08-12 19:05:44 +00001854 s = PyString_AS_STRING(tmp);
1855 if ((add_dict && strcmp(s, "__dict__") == 0) ||
1856 (add_weak && strcmp(s, "__weakref__") == 0))
1857 continue;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001858 tmp =_Py_Mangle(name, tmp);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001859 if (!tmp)
1860 goto bad_slots;
Guido van Rossumad47da02002-08-12 19:05:44 +00001861 PyTuple_SET_ITEM(newslots, j, tmp);
1862 j++;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001863 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001864 assert(j == nslots - add_dict - add_weak);
1865 nslots = j;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001866 Py_DECREF(slots);
1867 slots = newslots;
1868
Guido van Rossumad47da02002-08-12 19:05:44 +00001869 /* Secondary bases may provide weakrefs or dict */
1870 if (nbases > 1 &&
1871 ((may_add_dict && !add_dict) ||
1872 (may_add_weak && !add_weak))) {
1873 for (i = 0; i < nbases; i++) {
1874 tmp = PyTuple_GET_ITEM(bases, i);
1875 if (tmp == (PyObject *)base)
1876 continue; /* Skip primary base */
1877 if (PyClass_Check(tmp)) {
1878 /* Classic base class provides both */
1879 if (may_add_dict && !add_dict)
1880 add_dict++;
1881 if (may_add_weak && !add_weak)
1882 add_weak++;
1883 break;
1884 }
1885 assert(PyType_Check(tmp));
1886 tmptype = (PyTypeObject *)tmp;
1887 if (may_add_dict && !add_dict &&
1888 tmptype->tp_dictoffset != 0)
1889 add_dict++;
1890 if (may_add_weak && !add_weak &&
1891 tmptype->tp_weaklistoffset != 0)
1892 add_weak++;
1893 if (may_add_dict && !add_dict)
1894 continue;
1895 if (may_add_weak && !add_weak)
1896 continue;
1897 /* Nothing more to check */
1898 break;
1899 }
1900 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001901 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001902
1903 /* XXX From here until type is safely allocated,
1904 "return NULL" may leak slots! */
1905
1906 /* Allocate the type object */
1907 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
Guido van Rossumad47da02002-08-12 19:05:44 +00001908 if (type == NULL) {
1909 Py_XDECREF(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001910 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001911 return NULL;
Guido van Rossumad47da02002-08-12 19:05:44 +00001912 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001913
1914 /* Keep name and slots alive in the extended type object */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001915 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001916 Py_INCREF(name);
Georg Brandlc255c7b2006-02-20 22:27:28 +00001917 et->ht_name = name;
1918 et->ht_slots = slots;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001919
Guido van Rossumdc91b992001-08-08 22:26:22 +00001920 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001921 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
1922 Py_TPFLAGS_BASETYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00001923 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
1924 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00001925
1926 /* It's a new-style number unless it specifically inherits any
1927 old-style numeric behavior */
1928 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
1929 (base->tp_as_number == NULL))
1930 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
1931
1932 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001933 type->tp_as_number = &et->as_number;
1934 type->tp_as_sequence = &et->as_sequence;
1935 type->tp_as_mapping = &et->as_mapping;
1936 type->tp_as_buffer = &et->as_buffer;
1937 type->tp_name = PyString_AS_STRING(name);
1938
1939 /* Set tp_base and tp_bases */
1940 type->tp_bases = bases;
1941 Py_INCREF(base);
1942 type->tp_base = base;
1943
Guido van Rossum687ae002001-10-15 22:03:32 +00001944 /* Initialize tp_dict from passed-in dict */
1945 type->tp_dict = dict = PyDict_Copy(dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001946 if (dict == NULL) {
1947 Py_DECREF(type);
1948 return NULL;
1949 }
1950
Guido van Rossumc3542212001-08-16 09:18:56 +00001951 /* Set __module__ in the dict */
1952 if (PyDict_GetItemString(dict, "__module__") == NULL) {
1953 tmp = PyEval_GetGlobals();
1954 if (tmp != NULL) {
1955 tmp = PyDict_GetItemString(tmp, "__name__");
1956 if (tmp != NULL) {
1957 if (PyDict_SetItemString(dict, "__module__",
1958 tmp) < 0)
1959 return NULL;
1960 }
1961 }
1962 }
1963
Tim Peters2f93e282001-10-04 05:27:00 +00001964 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
Tim Peters24008312002-03-17 18:56:20 +00001965 and is a string. The __doc__ accessor will first look for tp_doc;
1966 if that fails, it will still look into __dict__.
Tim Peters2f93e282001-10-04 05:27:00 +00001967 */
1968 {
1969 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
1970 if (doc != NULL && PyString_Check(doc)) {
1971 const size_t n = (size_t)PyString_GET_SIZE(doc);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001972 char *tp_doc = (char *)PyObject_MALLOC(n+1);
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001973 if (tp_doc == NULL) {
Tim Peters2f93e282001-10-04 05:27:00 +00001974 Py_DECREF(type);
1975 return NULL;
1976 }
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001977 memcpy(tp_doc, PyString_AS_STRING(doc), n+1);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001978 type->tp_doc = tp_doc;
Tim Peters2f93e282001-10-04 05:27:00 +00001979 }
1980 }
1981
Tim Peters6d6c1a32001-08-02 04:15:00 +00001982 /* Special-case __new__: if it's a plain function,
1983 make it a static function */
1984 tmp = PyDict_GetItemString(dict, "__new__");
1985 if (tmp != NULL && PyFunction_Check(tmp)) {
1986 tmp = PyStaticMethod_New(tmp);
1987 if (tmp == NULL) {
1988 Py_DECREF(type);
1989 return NULL;
1990 }
1991 PyDict_SetItemString(dict, "__new__", tmp);
1992 Py_DECREF(tmp);
1993 }
1994
1995 /* Add descriptors for custom slots from __slots__, or for __dict__ */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001996 mp = PyHeapType_GET_MEMBERS(et);
Neil Schemenauerc806c882001-08-29 23:54:54 +00001997 slotoffset = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001998 if (slots != NULL) {
1999 for (i = 0; i < nslots; i++, mp++) {
2000 mp->name = PyString_AS_STRING(
2001 PyTuple_GET_ITEM(slots, i));
Guido van Rossum64b206c2001-12-04 17:13:22 +00002002 mp->type = T_OBJECT_EX;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002003 mp->offset = slotoffset;
Žiga Seilnacht89032082007-03-11 15:54:54 +00002004
2005 /* __dict__ and __weakref__ are already filtered out */
2006 assert(strcmp(mp->name, "__dict__") != 0);
2007 assert(strcmp(mp->name, "__weakref__") != 0);
2008
Tim Peters6d6c1a32001-08-02 04:15:00 +00002009 slotoffset += sizeof(PyObject *);
2010 }
2011 }
Guido van Rossumad47da02002-08-12 19:05:44 +00002012 if (add_dict) {
2013 if (base->tp_itemsize)
2014 type->tp_dictoffset = -(long)sizeof(PyObject *);
2015 else
2016 type->tp_dictoffset = slotoffset;
2017 slotoffset += sizeof(PyObject *);
2018 }
2019 if (add_weak) {
2020 assert(!base->tp_itemsize);
2021 type->tp_weaklistoffset = slotoffset;
2022 slotoffset += sizeof(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002023 }
2024 type->tp_basicsize = slotoffset;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00002025 type->tp_itemsize = base->tp_itemsize;
Guido van Rossume5c691a2003-03-07 15:13:17 +00002026 type->tp_members = PyHeapType_GET_MEMBERS(et);
Guido van Rossum373c7412003-01-07 13:41:37 +00002027
2028 if (type->tp_weaklistoffset && type->tp_dictoffset)
2029 type->tp_getset = subtype_getsets_full;
2030 else if (type->tp_weaklistoffset && !type->tp_dictoffset)
2031 type->tp_getset = subtype_getsets_weakref_only;
2032 else if (!type->tp_weaklistoffset && type->tp_dictoffset)
2033 type->tp_getset = subtype_getsets_dict_only;
2034 else
2035 type->tp_getset = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002036
2037 /* Special case some slots */
2038 if (type->tp_dictoffset != 0 || nslots > 0) {
2039 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
2040 type->tp_getattro = PyObject_GenericGetAttr;
2041 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
2042 type->tp_setattro = PyObject_GenericSetAttr;
2043 }
2044 type->tp_dealloc = subtype_dealloc;
2045
Guido van Rossum9475a232001-10-05 20:51:39 +00002046 /* Enable GC unless there are really no instance variables possible */
2047 if (!(type->tp_basicsize == sizeof(PyObject) &&
2048 type->tp_itemsize == 0))
2049 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
2050
Tim Peters6d6c1a32001-08-02 04:15:00 +00002051 /* Always override allocation strategy to use regular heap */
2052 type->tp_alloc = PyType_GenericAlloc;
Guido van Rossum048eb752001-10-02 21:24:57 +00002053 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002054 type->tp_free = PyObject_GC_Del;
Guido van Rossum9475a232001-10-05 20:51:39 +00002055 type->tp_traverse = subtype_traverse;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00002056 type->tp_clear = subtype_clear;
Guido van Rossum048eb752001-10-02 21:24:57 +00002057 }
2058 else
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002059 type->tp_free = PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002060
2061 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002062 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002063 Py_DECREF(type);
2064 return NULL;
2065 }
2066
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002067 /* Put the proper slots in place */
2068 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00002069
Tim Peters6d6c1a32001-08-02 04:15:00 +00002070 return (PyObject *)type;
2071}
2072
2073/* Internal API to look for a name through the MRO.
2074 This returns a borrowed reference, and doesn't set an exception! */
2075PyObject *
2076_PyType_Lookup(PyTypeObject *type, PyObject *name)
2077{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002078 Py_ssize_t i, n;
Tim Petersa91e9642001-11-14 23:32:33 +00002079 PyObject *mro, *res, *base, *dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002080
Guido van Rossum687ae002001-10-15 22:03:32 +00002081 /* Look in tp_dict of types in MRO */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002082 mro = type->tp_mro;
Guido van Rossum23094982002-06-10 14:30:43 +00002083
2084 /* If mro is NULL, the type is either not yet initialized
2085 by PyType_Ready(), or already cleared by type_clear().
2086 Either way the safest thing to do is to return NULL. */
2087 if (mro == NULL)
2088 return NULL;
2089
Tim Peters6d6c1a32001-08-02 04:15:00 +00002090 assert(PyTuple_Check(mro));
2091 n = PyTuple_GET_SIZE(mro);
2092 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002093 base = PyTuple_GET_ITEM(mro, i);
2094 if (PyClass_Check(base))
2095 dict = ((PyClassObject *)base)->cl_dict;
2096 else {
2097 assert(PyType_Check(base));
2098 dict = ((PyTypeObject *)base)->tp_dict;
2099 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002100 assert(dict && PyDict_Check(dict));
2101 res = PyDict_GetItem(dict, name);
2102 if (res != NULL)
2103 return res;
2104 }
2105 return NULL;
2106}
2107
2108/* This is similar to PyObject_GenericGetAttr(),
2109 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
2110static PyObject *
2111type_getattro(PyTypeObject *type, PyObject *name)
2112{
2113 PyTypeObject *metatype = type->ob_type;
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002114 PyObject *meta_attribute, *attribute;
2115 descrgetfunc meta_get;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002116
2117 /* Initialize this type (we'll assume the metatype is initialized) */
2118 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002119 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002120 return NULL;
2121 }
2122
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002123 /* No readable descriptor found yet */
2124 meta_get = NULL;
Tim Peters34592512002-07-11 06:23:50 +00002125
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002126 /* Look for the attribute in the metatype */
2127 meta_attribute = _PyType_Lookup(metatype, name);
2128
2129 if (meta_attribute != NULL) {
2130 meta_get = meta_attribute->ob_type->tp_descr_get;
Tim Peters34592512002-07-11 06:23:50 +00002131
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002132 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
2133 /* Data descriptors implement tp_descr_set to intercept
2134 * writes. Assume the attribute is not overridden in
2135 * type's tp_dict (and bases): call the descriptor now.
2136 */
2137 return meta_get(meta_attribute, (PyObject *)type,
2138 (PyObject *)metatype);
2139 }
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002140 Py_INCREF(meta_attribute);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002141 }
2142
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002143 /* No data descriptor found on metatype. Look in tp_dict of this
2144 * type and its bases */
2145 attribute = _PyType_Lookup(type, name);
2146 if (attribute != NULL) {
2147 /* Implement descriptor functionality, if any */
2148 descrgetfunc local_get = attribute->ob_type->tp_descr_get;
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002149
2150 Py_XDECREF(meta_attribute);
2151
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002152 if (local_get != NULL) {
2153 /* NULL 2nd argument indicates the descriptor was
2154 * found on the target object itself (or a base) */
2155 return local_get(attribute, (PyObject *)NULL,
2156 (PyObject *)type);
2157 }
Tim Peters34592512002-07-11 06:23:50 +00002158
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002159 Py_INCREF(attribute);
2160 return attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002161 }
2162
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002163 /* No attribute found in local __dict__ (or bases): use the
2164 * descriptor from the metatype, if any */
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002165 if (meta_get != NULL) {
2166 PyObject *res;
2167 res = meta_get(meta_attribute, (PyObject *)type,
2168 (PyObject *)metatype);
2169 Py_DECREF(meta_attribute);
2170 return res;
2171 }
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002172
2173 /* If an ordinary attribute was found on the metatype, return it now */
2174 if (meta_attribute != NULL) {
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002175 return meta_attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002176 }
2177
2178 /* Give up */
2179 PyErr_Format(PyExc_AttributeError,
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002180 "type object '%.50s' has no attribute '%.400s'",
2181 type->tp_name, PyString_AS_STRING(name));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002182 return NULL;
2183}
2184
2185static int
2186type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
2187{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002188 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2189 PyErr_Format(
2190 PyExc_TypeError,
2191 "can't set attributes of built-in/extension type '%s'",
2192 type->tp_name);
2193 return -1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002194 }
Guido van Rossum8d24ee92003-03-24 23:49:49 +00002195 /* XXX Example of how I expect this to be used...
2196 if (update_subclasses(type, name, invalidate_cache, NULL) < 0)
2197 return -1;
2198 */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002199 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
2200 return -1;
2201 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002202}
2203
2204static void
2205type_dealloc(PyTypeObject *type)
2206{
Guido van Rossume5c691a2003-03-07 15:13:17 +00002207 PyHeapTypeObject *et;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002208
2209 /* Assert this is a heap-allocated type object */
2210 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002211 _PyObject_GC_UNTRACK(type);
Guido van Rossum1c450732001-10-08 15:18:27 +00002212 PyObject_ClearWeakRefs((PyObject *)type);
Guido van Rossume5c691a2003-03-07 15:13:17 +00002213 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002214 Py_XDECREF(type->tp_base);
2215 Py_XDECREF(type->tp_dict);
2216 Py_XDECREF(type->tp_bases);
2217 Py_XDECREF(type->tp_mro);
Guido van Rossum687ae002001-10-15 22:03:32 +00002218 Py_XDECREF(type->tp_cache);
Guido van Rossum1c450732001-10-08 15:18:27 +00002219 Py_XDECREF(type->tp_subclasses);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002220 /* A type's tp_doc is heap allocated, unlike the tp_doc slots
2221 * of most other objects. It's okay to cast it to char *.
2222 */
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002223 PyObject_Free((char *)type->tp_doc);
Georg Brandlc255c7b2006-02-20 22:27:28 +00002224 Py_XDECREF(et->ht_name);
2225 Py_XDECREF(et->ht_slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002226 type->ob_type->tp_free((PyObject *)type);
2227}
2228
Guido van Rossum1c450732001-10-08 15:18:27 +00002229static PyObject *
2230type_subclasses(PyTypeObject *type, PyObject *args_ignored)
2231{
2232 PyObject *list, *raw, *ref;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002233 Py_ssize_t i, n;
Guido van Rossum1c450732001-10-08 15:18:27 +00002234
2235 list = PyList_New(0);
2236 if (list == NULL)
2237 return NULL;
2238 raw = type->tp_subclasses;
2239 if (raw == NULL)
2240 return list;
2241 assert(PyList_Check(raw));
2242 n = PyList_GET_SIZE(raw);
2243 for (i = 0; i < n; i++) {
2244 ref = PyList_GET_ITEM(raw, i);
Tim Peters44383382001-10-08 16:49:26 +00002245 assert(PyWeakref_CheckRef(ref));
Guido van Rossum1c450732001-10-08 15:18:27 +00002246 ref = PyWeakref_GET_OBJECT(ref);
2247 if (ref != Py_None) {
2248 if (PyList_Append(list, ref) < 0) {
2249 Py_DECREF(list);
2250 return NULL;
2251 }
2252 }
2253 }
2254 return list;
2255}
2256
Tim Peters6d6c1a32001-08-02 04:15:00 +00002257static PyMethodDef type_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002258 {"mro", (PyCFunction)mro_external, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002259 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
Guido van Rossum1c450732001-10-08 15:18:27 +00002260 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002261 PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002262 {0}
2263};
2264
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002265PyDoc_STRVAR(type_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266"type(object) -> the object's type\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002267"type(name, bases, dict) -> a new type");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002268
Guido van Rossum048eb752001-10-02 21:24:57 +00002269static int
2270type_traverse(PyTypeObject *type, visitproc visit, void *arg)
2271{
Guido van Rossuma3862092002-06-10 15:24:42 +00002272 /* Because of type_is_gc(), the collector only calls this
2273 for heaptypes. */
2274 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002275
Thomas Woutersc6e55062006-04-15 21:47:09 +00002276 Py_VISIT(type->tp_dict);
2277 Py_VISIT(type->tp_cache);
2278 Py_VISIT(type->tp_mro);
2279 Py_VISIT(type->tp_bases);
2280 Py_VISIT(type->tp_base);
Guido van Rossuma3862092002-06-10 15:24:42 +00002281
2282 /* There's no need to visit type->tp_subclasses or
Georg Brandlc255c7b2006-02-20 22:27:28 +00002283 ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
Guido van Rossuma3862092002-06-10 15:24:42 +00002284 in cycles; tp_subclasses is a list of weak references,
2285 and slots is a tuple of strings. */
Guido van Rossum048eb752001-10-02 21:24:57 +00002286
Guido van Rossum048eb752001-10-02 21:24:57 +00002287 return 0;
2288}
2289
2290static int
2291type_clear(PyTypeObject *type)
2292{
Guido van Rossuma3862092002-06-10 15:24:42 +00002293 /* Because of type_is_gc(), the collector only calls this
2294 for heaptypes. */
2295 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002296
Guido van Rossuma3862092002-06-10 15:24:42 +00002297 /* The only field we need to clear is tp_mro, which is part of a
2298 hard cycle (its first element is the class itself) that won't
2299 be broken otherwise (it's a tuple and tuples don't have a
2300 tp_clear handler). None of the other fields need to be
2301 cleared, and here's why:
Guido van Rossum048eb752001-10-02 21:24:57 +00002302
Guido van Rossuma3862092002-06-10 15:24:42 +00002303 tp_dict:
2304 It is a dict, so the collector will call its tp_clear.
2305
2306 tp_cache:
2307 Not used; if it were, it would be a dict.
2308
2309 tp_bases, tp_base:
2310 If these are involved in a cycle, there must be at least
2311 one other, mutable object in the cycle, e.g. a base
2312 class's dict; the cycle will be broken that way.
2313
2314 tp_subclasses:
2315 A list of weak references can't be part of a cycle; and
2316 lists have their own tp_clear.
2317
Guido van Rossume5c691a2003-03-07 15:13:17 +00002318 slots (in PyHeapTypeObject):
Guido van Rossuma3862092002-06-10 15:24:42 +00002319 A tuple of strings can't be part of a cycle.
2320 */
2321
Thomas Woutersedf17d82006-04-15 17:28:34 +00002322 Py_CLEAR(type->tp_mro);
Guido van Rossum048eb752001-10-02 21:24:57 +00002323
2324 return 0;
2325}
2326
2327static int
2328type_is_gc(PyTypeObject *type)
2329{
2330 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
2331}
2332
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002333PyTypeObject PyType_Type = {
2334 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002335 0, /* ob_size */
2336 "type", /* tp_name */
Guido van Rossume5c691a2003-03-07 15:13:17 +00002337 sizeof(PyHeapTypeObject), /* tp_basicsize */
Guido van Rossum6f799372001-09-20 20:46:19 +00002338 sizeof(PyMemberDef), /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002339 (destructor)type_dealloc, /* tp_dealloc */
2340 0, /* tp_print */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002341 0, /* tp_getattr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002342 0, /* tp_setattr */
2343 type_compare, /* tp_compare */
2344 (reprfunc)type_repr, /* tp_repr */
2345 0, /* tp_as_number */
2346 0, /* tp_as_sequence */
2347 0, /* tp_as_mapping */
2348 (hashfunc)_Py_HashPointer, /* tp_hash */
2349 (ternaryfunc)type_call, /* tp_call */
2350 0, /* tp_str */
2351 (getattrofunc)type_getattro, /* tp_getattro */
2352 (setattrofunc)type_setattro, /* tp_setattro */
2353 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00002354 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002355 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002356 type_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00002357 (traverseproc)type_traverse, /* tp_traverse */
2358 (inquiry)type_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002359 0, /* tp_richcompare */
Guido van Rossum1c450732001-10-08 15:18:27 +00002360 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002361 0, /* tp_iter */
2362 0, /* tp_iternext */
2363 type_methods, /* tp_methods */
2364 type_members, /* tp_members */
2365 type_getsets, /* tp_getset */
2366 0, /* tp_base */
2367 0, /* tp_dict */
2368 0, /* tp_descr_get */
2369 0, /* tp_descr_set */
2370 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
2371 0, /* tp_init */
2372 0, /* tp_alloc */
2373 type_new, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002374 PyObject_GC_Del, /* tp_free */
Guido van Rossum048eb752001-10-02 21:24:57 +00002375 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002376};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002377
2378
2379/* The base type of all types (eventually)... except itself. */
2380
2381static int
2382object_init(PyObject *self, PyObject *args, PyObject *kwds)
2383{
2384 return 0;
2385}
2386
Guido van Rossum298e4212003-02-13 16:30:16 +00002387/* If we don't have a tp_new for a new-style class, new will use this one.
2388 Therefore this should take no arguments/keywords. However, this new may
2389 also be inherited by objects that define a tp_init but no tp_new. These
2390 objects WILL pass argumets to tp_new, because it gets the same args as
2391 tp_init. So only allow arguments if we aren't using the default init, in
2392 which case we expect init to handle argument parsing. */
2393static PyObject *
2394object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2395{
2396 if (type->tp_init == object_init && (PyTuple_GET_SIZE(args) ||
2397 (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)))) {
2398 PyErr_SetString(PyExc_TypeError,
2399 "default __new__ takes no parameters");
2400 return NULL;
2401 }
2402 return type->tp_alloc(type, 0);
2403}
2404
Tim Peters6d6c1a32001-08-02 04:15:00 +00002405static void
2406object_dealloc(PyObject *self)
2407{
2408 self->ob_type->tp_free(self);
2409}
2410
Guido van Rossum8e248182001-08-12 05:17:56 +00002411static PyObject *
2412object_repr(PyObject *self)
2413{
Guido van Rossum76e69632001-08-16 18:52:43 +00002414 PyTypeObject *type;
Barry Warsaw7ce36942001-08-24 18:34:26 +00002415 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002416
Guido van Rossum76e69632001-08-16 18:52:43 +00002417 type = self->ob_type;
2418 mod = type_module(type, NULL);
2419 if (mod == NULL)
2420 PyErr_Clear();
2421 else if (!PyString_Check(mod)) {
2422 Py_DECREF(mod);
2423 mod = NULL;
2424 }
2425 name = type_name(type, NULL);
2426 if (name == NULL)
2427 return NULL;
2428 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002429 rtn = PyString_FromFormat("<%s.%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002430 PyString_AS_STRING(mod),
2431 PyString_AS_STRING(name),
2432 self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002433 else
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002434 rtn = PyString_FromFormat("<%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002435 type->tp_name, self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002436 Py_XDECREF(mod);
2437 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +00002438 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002439}
2440
Guido van Rossumb8f63662001-08-15 23:57:02 +00002441static PyObject *
2442object_str(PyObject *self)
2443{
2444 unaryfunc f;
2445
2446 f = self->ob_type->tp_repr;
2447 if (f == NULL)
2448 f = object_repr;
2449 return f(self);
2450}
2451
Guido van Rossum8e248182001-08-12 05:17:56 +00002452static long
2453object_hash(PyObject *self)
2454{
2455 return _Py_HashPointer(self);
2456}
Guido van Rossum8e248182001-08-12 05:17:56 +00002457
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002458static PyObject *
2459object_get_class(PyObject *self, void *closure)
2460{
2461 Py_INCREF(self->ob_type);
2462 return (PyObject *)(self->ob_type);
2463}
2464
2465static int
2466equiv_structs(PyTypeObject *a, PyTypeObject *b)
2467{
2468 return a == b ||
2469 (a != NULL &&
2470 b != NULL &&
2471 a->tp_basicsize == b->tp_basicsize &&
2472 a->tp_itemsize == b->tp_itemsize &&
2473 a->tp_dictoffset == b->tp_dictoffset &&
2474 a->tp_weaklistoffset == b->tp_weaklistoffset &&
2475 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
2476 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
2477}
2478
2479static int
2480same_slots_added(PyTypeObject *a, PyTypeObject *b)
2481{
2482 PyTypeObject *base = a->tp_base;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002483 Py_ssize_t size;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002484
2485 if (base != b->tp_base)
2486 return 0;
2487 if (equiv_structs(a, base) && equiv_structs(b, base))
2488 return 1;
2489 size = base->tp_basicsize;
2490 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
2491 size += sizeof(PyObject *);
2492 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
2493 size += sizeof(PyObject *);
2494 return size == a->tp_basicsize && size == b->tp_basicsize;
2495}
2496
2497static int
Anthony Baxtera6286212006-04-11 07:42:36 +00002498compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002499{
2500 PyTypeObject *newbase, *oldbase;
2501
Anthony Baxtera6286212006-04-11 07:42:36 +00002502 if (newto->tp_dealloc != oldto->tp_dealloc ||
2503 newto->tp_free != oldto->tp_free)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002504 {
2505 PyErr_Format(PyExc_TypeError,
2506 "%s assignment: "
2507 "'%s' deallocator differs from '%s'",
2508 attr,
Anthony Baxtera6286212006-04-11 07:42:36 +00002509 newto->tp_name,
2510 oldto->tp_name);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002511 return 0;
2512 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002513 newbase = newto;
2514 oldbase = oldto;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002515 while (equiv_structs(newbase, newbase->tp_base))
2516 newbase = newbase->tp_base;
2517 while (equiv_structs(oldbase, oldbase->tp_base))
2518 oldbase = oldbase->tp_base;
2519 if (newbase != oldbase &&
2520 (newbase->tp_base != oldbase->tp_base ||
2521 !same_slots_added(newbase, oldbase))) {
2522 PyErr_Format(PyExc_TypeError,
2523 "%s assignment: "
2524 "'%s' object layout differs from '%s'",
2525 attr,
Anthony Baxtera6286212006-04-11 07:42:36 +00002526 newto->tp_name,
2527 oldto->tp_name);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002528 return 0;
2529 }
Tim Petersea7f75d2002-12-07 21:39:16 +00002530
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002531 return 1;
2532}
2533
2534static int
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002535object_set_class(PyObject *self, PyObject *value, void *closure)
2536{
Anthony Baxtera6286212006-04-11 07:42:36 +00002537 PyTypeObject *oldto = self->ob_type;
2538 PyTypeObject *newto;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002539
Guido van Rossumb6b89422002-04-15 01:03:30 +00002540 if (value == NULL) {
2541 PyErr_SetString(PyExc_TypeError,
2542 "can't delete __class__ attribute");
2543 return -1;
2544 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002545 if (!PyType_Check(value)) {
2546 PyErr_Format(PyExc_TypeError,
2547 "__class__ must be set to new-style class, not '%s' object",
2548 value->ob_type->tp_name);
2549 return -1;
2550 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002551 newto = (PyTypeObject *)value;
2552 if (!(newto->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
2553 !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE))
Guido van Rossum40af8892002-08-10 05:42:07 +00002554 {
2555 PyErr_Format(PyExc_TypeError,
2556 "__class__ assignment: only for heap types");
2557 return -1;
2558 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002559 if (compatible_for_assignment(newto, oldto, "__class__")) {
2560 Py_INCREF(newto);
2561 self->ob_type = newto;
2562 Py_DECREF(oldto);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002563 return 0;
2564 }
2565 else {
Guido van Rossum9ee4b942002-05-24 18:47:47 +00002566 return -1;
2567 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002568}
2569
2570static PyGetSetDef object_getsets[] = {
2571 {"__class__", object_get_class, object_set_class,
Neal Norwitz858e34f2002-08-13 17:18:45 +00002572 PyDoc_STR("the object's class")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002573 {0}
2574};
2575
Guido van Rossumc53f0092003-02-18 22:05:12 +00002576
Guido van Rossum036f9992003-02-21 22:02:54 +00002577/* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
2578 We fall back to helpers in copy_reg for:
2579 - pickle protocols < 2
2580 - calculating the list of slot names (done only once per class)
2581 - the __newobj__ function (which is used as a token but never called)
2582*/
2583
2584static PyObject *
2585import_copy_reg(void)
2586{
2587 static PyObject *copy_reg_str;
Guido van Rossum3926a632001-09-25 16:25:58 +00002588
2589 if (!copy_reg_str) {
2590 copy_reg_str = PyString_InternFromString("copy_reg");
2591 if (copy_reg_str == NULL)
2592 return NULL;
2593 }
Guido van Rossum036f9992003-02-21 22:02:54 +00002594
2595 return PyImport_Import(copy_reg_str);
2596}
2597
2598static PyObject *
2599slotnames(PyObject *cls)
2600{
2601 PyObject *clsdict;
2602 PyObject *copy_reg;
2603 PyObject *slotnames;
2604
2605 if (!PyType_Check(cls)) {
2606 Py_INCREF(Py_None);
2607 return Py_None;
2608 }
2609
2610 clsdict = ((PyTypeObject *)cls)->tp_dict;
2611 slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
Armin Rigoec862b92005-09-24 22:58:41 +00002612 if (slotnames != NULL && PyList_Check(slotnames)) {
Guido van Rossum036f9992003-02-21 22:02:54 +00002613 Py_INCREF(slotnames);
2614 return slotnames;
2615 }
2616
2617 copy_reg = import_copy_reg();
2618 if (copy_reg == NULL)
2619 return NULL;
2620
2621 slotnames = PyObject_CallMethod(copy_reg, "_slotnames", "O", cls);
2622 Py_DECREF(copy_reg);
2623 if (slotnames != NULL &&
2624 slotnames != Py_None &&
2625 !PyList_Check(slotnames))
2626 {
2627 PyErr_SetString(PyExc_TypeError,
2628 "copy_reg._slotnames didn't return a list or None");
2629 Py_DECREF(slotnames);
2630 slotnames = NULL;
2631 }
2632
2633 return slotnames;
2634}
2635
2636static PyObject *
2637reduce_2(PyObject *obj)
2638{
2639 PyObject *cls, *getnewargs;
2640 PyObject *args = NULL, *args2 = NULL;
2641 PyObject *getstate = NULL, *state = NULL, *names = NULL;
2642 PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
2643 PyObject *copy_reg = NULL, *newobj = NULL, *res = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002644 Py_ssize_t i, n;
Guido van Rossum036f9992003-02-21 22:02:54 +00002645
2646 cls = PyObject_GetAttrString(obj, "__class__");
2647 if (cls == NULL)
2648 return NULL;
2649
2650 getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
2651 if (getnewargs != NULL) {
2652 args = PyObject_CallObject(getnewargs, NULL);
2653 Py_DECREF(getnewargs);
2654 if (args != NULL && !PyTuple_Check(args)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002655 PyErr_Format(PyExc_TypeError,
2656 "__getnewargs__ should return a tuple, "
2657 "not '%.200s'", args->ob_type->tp_name);
Guido van Rossum036f9992003-02-21 22:02:54 +00002658 goto end;
2659 }
2660 }
2661 else {
2662 PyErr_Clear();
2663 args = PyTuple_New(0);
2664 }
2665 if (args == NULL)
2666 goto end;
2667
2668 getstate = PyObject_GetAttrString(obj, "__getstate__");
2669 if (getstate != NULL) {
2670 state = PyObject_CallObject(getstate, NULL);
2671 Py_DECREF(getstate);
Neal Norwitze2fdc612003-06-08 13:19:58 +00002672 if (state == NULL)
2673 goto end;
Guido van Rossum036f9992003-02-21 22:02:54 +00002674 }
2675 else {
Jim Fulton8a1a5942004-02-08 04:21:26 +00002676 PyErr_Clear();
Guido van Rossum036f9992003-02-21 22:02:54 +00002677 state = PyObject_GetAttrString(obj, "__dict__");
2678 if (state == NULL) {
2679 PyErr_Clear();
2680 state = Py_None;
2681 Py_INCREF(state);
2682 }
2683 names = slotnames(cls);
2684 if (names == NULL)
2685 goto end;
2686 if (names != Py_None) {
2687 assert(PyList_Check(names));
2688 slots = PyDict_New();
2689 if (slots == NULL)
2690 goto end;
2691 n = 0;
2692 /* Can't pre-compute the list size; the list
2693 is stored on the class so accessible to other
2694 threads, which may be run by DECREF */
2695 for (i = 0; i < PyList_GET_SIZE(names); i++) {
2696 PyObject *name, *value;
2697 name = PyList_GET_ITEM(names, i);
2698 value = PyObject_GetAttr(obj, name);
2699 if (value == NULL)
2700 PyErr_Clear();
2701 else {
2702 int err = PyDict_SetItem(slots, name,
2703 value);
2704 Py_DECREF(value);
2705 if (err)
2706 goto end;
2707 n++;
2708 }
2709 }
2710 if (n) {
2711 state = Py_BuildValue("(NO)", state, slots);
2712 if (state == NULL)
2713 goto end;
2714 }
2715 }
2716 }
2717
2718 if (!PyList_Check(obj)) {
2719 listitems = Py_None;
2720 Py_INCREF(listitems);
2721 }
2722 else {
2723 listitems = PyObject_GetIter(obj);
2724 if (listitems == NULL)
2725 goto end;
2726 }
2727
2728 if (!PyDict_Check(obj)) {
2729 dictitems = Py_None;
2730 Py_INCREF(dictitems);
2731 }
2732 else {
2733 dictitems = PyObject_CallMethod(obj, "iteritems", "");
2734 if (dictitems == NULL)
2735 goto end;
2736 }
2737
2738 copy_reg = import_copy_reg();
2739 if (copy_reg == NULL)
2740 goto end;
2741 newobj = PyObject_GetAttrString(copy_reg, "__newobj__");
2742 if (newobj == NULL)
2743 goto end;
2744
2745 n = PyTuple_GET_SIZE(args);
2746 args2 = PyTuple_New(n+1);
2747 if (args2 == NULL)
2748 goto end;
2749 PyTuple_SET_ITEM(args2, 0, cls);
2750 cls = NULL;
2751 for (i = 0; i < n; i++) {
2752 PyObject *v = PyTuple_GET_ITEM(args, i);
2753 Py_INCREF(v);
2754 PyTuple_SET_ITEM(args2, i+1, v);
2755 }
2756
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002757 res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
Guido van Rossum036f9992003-02-21 22:02:54 +00002758
2759 end:
2760 Py_XDECREF(cls);
2761 Py_XDECREF(args);
2762 Py_XDECREF(args2);
Jeremy Hyltond06483c2003-04-09 21:01:42 +00002763 Py_XDECREF(slots);
Guido van Rossum036f9992003-02-21 22:02:54 +00002764 Py_XDECREF(state);
2765 Py_XDECREF(names);
2766 Py_XDECREF(listitems);
2767 Py_XDECREF(dictitems);
2768 Py_XDECREF(copy_reg);
2769 Py_XDECREF(newobj);
2770 return res;
2771}
2772
2773static PyObject *
2774object_reduce_ex(PyObject *self, PyObject *args)
2775{
2776 /* Call copy_reg._reduce_ex(self, proto) */
2777 PyObject *reduce, *copy_reg, *res;
2778 int proto = 0;
2779
2780 if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
2781 return NULL;
2782
2783 reduce = PyObject_GetAttrString(self, "__reduce__");
2784 if (reduce == NULL)
2785 PyErr_Clear();
2786 else {
2787 PyObject *cls, *clsreduce, *objreduce;
2788 int override;
2789 cls = PyObject_GetAttrString(self, "__class__");
2790 if (cls == NULL) {
2791 Py_DECREF(reduce);
2792 return NULL;
2793 }
2794 clsreduce = PyObject_GetAttrString(cls, "__reduce__");
2795 Py_DECREF(cls);
2796 if (clsreduce == NULL) {
2797 Py_DECREF(reduce);
2798 return NULL;
2799 }
2800 objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
2801 "__reduce__");
2802 override = (clsreduce != objreduce);
2803 Py_DECREF(clsreduce);
2804 if (override) {
2805 res = PyObject_CallObject(reduce, NULL);
2806 Py_DECREF(reduce);
2807 return res;
2808 }
2809 else
2810 Py_DECREF(reduce);
2811 }
2812
2813 if (proto >= 2)
2814 return reduce_2(self);
2815
2816 copy_reg = import_copy_reg();
Guido van Rossum3926a632001-09-25 16:25:58 +00002817 if (!copy_reg)
2818 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00002819
Guido van Rossumc53f0092003-02-18 22:05:12 +00002820 res = PyEval_CallMethod(copy_reg, "_reduce_ex", "(Oi)", self, proto);
Guido van Rossum3926a632001-09-25 16:25:58 +00002821 Py_DECREF(copy_reg);
Guido van Rossum036f9992003-02-21 22:02:54 +00002822
Guido van Rossum3926a632001-09-25 16:25:58 +00002823 return res;
2824}
2825
2826static PyMethodDef object_methods[] = {
Guido van Rossumc53f0092003-02-18 22:05:12 +00002827 {"__reduce_ex__", object_reduce_ex, METH_VARARGS,
2828 PyDoc_STR("helper for pickle")},
2829 {"__reduce__", object_reduce_ex, METH_VARARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002830 PyDoc_STR("helper for pickle")},
Guido van Rossum3926a632001-09-25 16:25:58 +00002831 {0}
2832};
2833
Guido van Rossum036f9992003-02-21 22:02:54 +00002834
Tim Peters6d6c1a32001-08-02 04:15:00 +00002835PyTypeObject PyBaseObject_Type = {
2836 PyObject_HEAD_INIT(&PyType_Type)
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002837 0, /* ob_size */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002838 "object", /* tp_name */
2839 sizeof(PyObject), /* tp_basicsize */
2840 0, /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00002841 object_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002842 0, /* tp_print */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002843 0, /* tp_getattr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002844 0, /* tp_setattr */
2845 0, /* tp_compare */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002846 object_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002847 0, /* tp_as_number */
2848 0, /* tp_as_sequence */
2849 0, /* tp_as_mapping */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002850 object_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002851 0, /* tp_call */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002852 object_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002853 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +00002854 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002855 0, /* tp_as_buffer */
2856 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002857 PyDoc_STR("The most base type"), /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002858 0, /* tp_traverse */
2859 0, /* tp_clear */
2860 0, /* tp_richcompare */
2861 0, /* tp_weaklistoffset */
2862 0, /* tp_iter */
2863 0, /* tp_iternext */
Guido van Rossum3926a632001-09-25 16:25:58 +00002864 object_methods, /* tp_methods */
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002865 0, /* tp_members */
2866 object_getsets, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002867 0, /* tp_base */
2868 0, /* tp_dict */
2869 0, /* tp_descr_get */
2870 0, /* tp_descr_set */
2871 0, /* tp_dictoffset */
2872 object_init, /* tp_init */
2873 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossum298e4212003-02-13 16:30:16 +00002874 object_new, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002875 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002876};
2877
2878
2879/* Initialize the __dict__ in a type object */
2880
2881static int
2882add_methods(PyTypeObject *type, PyMethodDef *meth)
2883{
Guido van Rossum687ae002001-10-15 22:03:32 +00002884 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002885
2886 for (; meth->ml_name != NULL; meth++) {
2887 PyObject *descr;
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002888 if (PyDict_GetItemString(dict, meth->ml_name) &&
2889 !(meth->ml_flags & METH_COEXIST))
2890 continue;
Fred Drake7bf97152002-03-28 05:33:33 +00002891 if (meth->ml_flags & METH_CLASS) {
2892 if (meth->ml_flags & METH_STATIC) {
2893 PyErr_SetString(PyExc_ValueError,
2894 "method cannot be both class and static");
2895 return -1;
2896 }
Tim Petersbca1cbc2002-12-09 22:56:13 +00002897 descr = PyDescr_NewClassMethod(type, meth);
Fred Drake7bf97152002-03-28 05:33:33 +00002898 }
2899 else if (meth->ml_flags & METH_STATIC) {
Guido van Rossum9af48ff2003-02-11 17:12:46 +00002900 PyObject *cfunc = PyCFunction_New(meth, NULL);
2901 if (cfunc == NULL)
2902 return -1;
2903 descr = PyStaticMethod_New(cfunc);
2904 Py_DECREF(cfunc);
Fred Drake7bf97152002-03-28 05:33:33 +00002905 }
2906 else {
2907 descr = PyDescr_NewMethod(type, meth);
2908 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002909 if (descr == NULL)
2910 return -1;
Fred Drake7bf97152002-03-28 05:33:33 +00002911 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002912 return -1;
2913 Py_DECREF(descr);
2914 }
2915 return 0;
2916}
2917
2918static int
Guido van Rossum6f799372001-09-20 20:46:19 +00002919add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002920{
Guido van Rossum687ae002001-10-15 22:03:32 +00002921 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002922
2923 for (; memb->name != NULL; memb++) {
2924 PyObject *descr;
2925 if (PyDict_GetItemString(dict, memb->name))
2926 continue;
2927 descr = PyDescr_NewMember(type, memb);
2928 if (descr == NULL)
2929 return -1;
2930 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
2931 return -1;
2932 Py_DECREF(descr);
2933 }
2934 return 0;
2935}
2936
2937static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00002938add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002939{
Guido van Rossum687ae002001-10-15 22:03:32 +00002940 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002941
2942 for (; gsp->name != NULL; gsp++) {
2943 PyObject *descr;
2944 if (PyDict_GetItemString(dict, gsp->name))
2945 continue;
2946 descr = PyDescr_NewGetSet(type, gsp);
2947
2948 if (descr == NULL)
2949 return -1;
2950 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
2951 return -1;
2952 Py_DECREF(descr);
2953 }
2954 return 0;
2955}
2956
Guido van Rossum13d52f02001-08-10 21:24:08 +00002957static void
2958inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002959{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002960 Py_ssize_t oldsize, newsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002961
Guido van Rossum13d52f02001-08-10 21:24:08 +00002962 /* Special flag magic */
2963 if (!type->tp_as_buffer && base->tp_as_buffer) {
2964 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
2965 type->tp_flags |=
2966 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
2967 }
2968 if (!type->tp_as_sequence && base->tp_as_sequence) {
2969 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
2970 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
2971 }
2972 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
2973 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
2974 if ((!type->tp_as_number && base->tp_as_number) ||
2975 (!type->tp_as_sequence && base->tp_as_sequence)) {
2976 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
2977 if (!type->tp_as_number && !type->tp_as_sequence) {
2978 type->tp_flags |= base->tp_flags &
2979 Py_TPFLAGS_HAVE_INPLACEOPS;
2980 }
2981 }
2982 /* Wow */
2983 }
2984 if (!type->tp_as_number && base->tp_as_number) {
2985 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
2986 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
2987 }
2988
2989 /* Copying basicsize is connected to the GC flags */
Neil Schemenauerc806c882001-08-29 23:54:54 +00002990 oldsize = base->tp_basicsize;
2991 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
2992 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
2993 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
Guido van Rossum13d52f02001-08-10 21:24:08 +00002994 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
2995 (!type->tp_traverse && !type->tp_clear)) {
Neil Schemenauerc806c882001-08-29 23:54:54 +00002996 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum13d52f02001-08-10 21:24:08 +00002997 if (type->tp_traverse == NULL)
2998 type->tp_traverse = base->tp_traverse;
2999 if (type->tp_clear == NULL)
3000 type->tp_clear = base->tp_clear;
3001 }
3002 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
Guido van Rossumf884b742001-12-17 17:14:22 +00003003 /* The condition below could use some explanation.
3004 It appears that tp_new is not inherited for static types
3005 whose base class is 'object'; this seems to be a precaution
3006 so that old extension types don't suddenly become
3007 callable (object.__new__ wouldn't insure the invariants
3008 that the extension type's own factory function ensures).
3009 Heap types, of course, are under our control, so they do
3010 inherit tp_new; static extension types that specify some
3011 other built-in type as the default are considered
3012 new-style-aware so they also inherit object.__new__. */
Guido van Rossum13d52f02001-08-10 21:24:08 +00003013 if (base != &PyBaseObject_Type ||
3014 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
3015 if (type->tp_new == NULL)
3016 type->tp_new = base->tp_new;
3017 }
3018 }
Neil Schemenauerc806c882001-08-29 23:54:54 +00003019 type->tp_basicsize = newsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00003020
3021 /* Copy other non-function slots */
3022
3023#undef COPYVAL
3024#define COPYVAL(SLOT) \
3025 if (type->SLOT == 0) type->SLOT = base->SLOT
3026
3027 COPYVAL(tp_itemsize);
3028 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
3029 COPYVAL(tp_weaklistoffset);
3030 }
3031 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
3032 COPYVAL(tp_dictoffset);
3033 }
Neal Norwitzee3a1b52007-02-25 19:44:48 +00003034
3035 /* Setup fast subclass flags */
3036 if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException))
3037 type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
3038 else if (PyType_IsSubtype(base, &PyType_Type))
3039 type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
3040 else if (PyType_IsSubtype(base, &PyInt_Type))
3041 type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS;
3042 else if (PyType_IsSubtype(base, &PyLong_Type))
3043 type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
3044 else if (PyType_IsSubtype(base, &PyString_Type))
3045 type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS;
3046 else if (PyType_IsSubtype(base, &PyUnicode_Type))
3047 type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
3048 else if (PyType_IsSubtype(base, &PyTuple_Type))
3049 type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
3050 else if (PyType_IsSubtype(base, &PyList_Type))
3051 type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
3052 else if (PyType_IsSubtype(base, &PyDict_Type))
3053 type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003054}
3055
3056static void
3057inherit_slots(PyTypeObject *type, PyTypeObject *base)
3058{
3059 PyTypeObject *basebase;
3060
3061#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00003062#undef COPYSLOT
3063#undef COPYNUM
3064#undef COPYSEQ
3065#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00003066#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00003067
3068#define SLOTDEFINED(SLOT) \
3069 (base->SLOT != 0 && \
3070 (basebase == NULL || base->SLOT != basebase->SLOT))
3071
Tim Peters6d6c1a32001-08-02 04:15:00 +00003072#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00003073 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00003074
3075#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
3076#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
3077#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003078#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003079
Guido van Rossum13d52f02001-08-10 21:24:08 +00003080 /* This won't inherit indirect slots (from tp_as_number etc.)
3081 if type doesn't provide the space. */
3082
3083 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
3084 basebase = base->tp_base;
3085 if (basebase->tp_as_number == NULL)
3086 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003087 COPYNUM(nb_add);
3088 COPYNUM(nb_subtract);
3089 COPYNUM(nb_multiply);
3090 COPYNUM(nb_divide);
3091 COPYNUM(nb_remainder);
3092 COPYNUM(nb_divmod);
3093 COPYNUM(nb_power);
3094 COPYNUM(nb_negative);
3095 COPYNUM(nb_positive);
3096 COPYNUM(nb_absolute);
3097 COPYNUM(nb_nonzero);
3098 COPYNUM(nb_invert);
3099 COPYNUM(nb_lshift);
3100 COPYNUM(nb_rshift);
3101 COPYNUM(nb_and);
3102 COPYNUM(nb_xor);
3103 COPYNUM(nb_or);
3104 COPYNUM(nb_coerce);
3105 COPYNUM(nb_int);
3106 COPYNUM(nb_long);
3107 COPYNUM(nb_float);
3108 COPYNUM(nb_oct);
3109 COPYNUM(nb_hex);
3110 COPYNUM(nb_inplace_add);
3111 COPYNUM(nb_inplace_subtract);
3112 COPYNUM(nb_inplace_multiply);
3113 COPYNUM(nb_inplace_divide);
3114 COPYNUM(nb_inplace_remainder);
3115 COPYNUM(nb_inplace_power);
3116 COPYNUM(nb_inplace_lshift);
3117 COPYNUM(nb_inplace_rshift);
3118 COPYNUM(nb_inplace_and);
3119 COPYNUM(nb_inplace_xor);
3120 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00003121 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
3122 COPYNUM(nb_true_divide);
3123 COPYNUM(nb_floor_divide);
3124 COPYNUM(nb_inplace_true_divide);
3125 COPYNUM(nb_inplace_floor_divide);
3126 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003127 if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
3128 COPYNUM(nb_index);
3129 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003130 }
3131
Guido van Rossum13d52f02001-08-10 21:24:08 +00003132 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
3133 basebase = base->tp_base;
3134 if (basebase->tp_as_sequence == NULL)
3135 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003136 COPYSEQ(sq_length);
3137 COPYSEQ(sq_concat);
3138 COPYSEQ(sq_repeat);
3139 COPYSEQ(sq_item);
3140 COPYSEQ(sq_slice);
3141 COPYSEQ(sq_ass_item);
3142 COPYSEQ(sq_ass_slice);
3143 COPYSEQ(sq_contains);
3144 COPYSEQ(sq_inplace_concat);
3145 COPYSEQ(sq_inplace_repeat);
3146 }
3147
Guido van Rossum13d52f02001-08-10 21:24:08 +00003148 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
3149 basebase = base->tp_base;
3150 if (basebase->tp_as_mapping == NULL)
3151 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003152 COPYMAP(mp_length);
3153 COPYMAP(mp_subscript);
3154 COPYMAP(mp_ass_subscript);
3155 }
3156
Tim Petersfc57ccb2001-10-12 02:38:24 +00003157 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
3158 basebase = base->tp_base;
3159 if (basebase->tp_as_buffer == NULL)
3160 basebase = NULL;
3161 COPYBUF(bf_getreadbuffer);
3162 COPYBUF(bf_getwritebuffer);
3163 COPYBUF(bf_getsegcount);
3164 COPYBUF(bf_getcharbuffer);
3165 }
3166
Guido van Rossum13d52f02001-08-10 21:24:08 +00003167 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003168
Tim Peters6d6c1a32001-08-02 04:15:00 +00003169 COPYSLOT(tp_dealloc);
3170 COPYSLOT(tp_print);
3171 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
3172 type->tp_getattr = base->tp_getattr;
3173 type->tp_getattro = base->tp_getattro;
3174 }
3175 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
3176 type->tp_setattr = base->tp_setattr;
3177 type->tp_setattro = base->tp_setattro;
3178 }
3179 /* tp_compare see tp_richcompare */
3180 COPYSLOT(tp_repr);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003181 /* tp_hash see tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003182 COPYSLOT(tp_call);
3183 COPYSLOT(tp_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003184 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003185 if (type->tp_compare == NULL &&
3186 type->tp_richcompare == NULL &&
3187 type->tp_hash == NULL)
3188 {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003189 type->tp_compare = base->tp_compare;
3190 type->tp_richcompare = base->tp_richcompare;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003191 type->tp_hash = base->tp_hash;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003192 }
3193 }
3194 else {
3195 COPYSLOT(tp_compare);
3196 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003197 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
3198 COPYSLOT(tp_iter);
3199 COPYSLOT(tp_iternext);
3200 }
3201 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
3202 COPYSLOT(tp_descr_get);
3203 COPYSLOT(tp_descr_set);
3204 COPYSLOT(tp_dictoffset);
3205 COPYSLOT(tp_init);
3206 COPYSLOT(tp_alloc);
Guido van Rossumcc8fe042002-04-05 17:10:16 +00003207 COPYSLOT(tp_is_gc);
Tim Peters3cfe7542003-05-21 21:29:48 +00003208 if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
3209 (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
3210 /* They agree about gc. */
3211 COPYSLOT(tp_free);
3212 }
3213 else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3214 type->tp_free == NULL &&
3215 base->tp_free == _PyObject_Del) {
3216 /* A bit of magic to plug in the correct default
3217 * tp_free function when a derived class adds gc,
3218 * didn't define tp_free, and the base uses the
3219 * default non-gc tp_free.
3220 */
3221 type->tp_free = PyObject_GC_Del;
3222 }
3223 /* else they didn't agree about gc, and there isn't something
3224 * obvious to be done -- the type is on its own.
3225 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003226 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003227}
3228
Jeremy Hylton938ace62002-07-17 16:30:39 +00003229static int add_operators(PyTypeObject *);
Guido van Rossum13d52f02001-08-10 21:24:08 +00003230
Tim Peters6d6c1a32001-08-02 04:15:00 +00003231int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00003232PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003233{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003234 PyObject *dict, *bases;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003235 PyTypeObject *base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003236 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003237
Guido van Rossumcab05802002-06-10 15:29:03 +00003238 if (type->tp_flags & Py_TPFLAGS_READY) {
3239 assert(type->tp_dict != NULL);
Guido van Rossumd614f972001-08-10 17:39:49 +00003240 return 0;
Guido van Rossumcab05802002-06-10 15:29:03 +00003241 }
Guido van Rossumd614f972001-08-10 17:39:49 +00003242 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00003243
3244 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003245
Tim Peters36eb4df2003-03-23 03:33:13 +00003246#ifdef Py_TRACE_REFS
3247 /* PyType_Ready is the closest thing we have to a choke point
3248 * for type objects, so is the best place I can think of to try
3249 * to get type objects into the doubly-linked list of all objects.
3250 * Still, not all type objects go thru PyType_Ready.
3251 */
Tim Peters7571a0f2003-03-23 17:52:28 +00003252 _Py_AddToAllObjects((PyObject *)type, 0);
Tim Peters36eb4df2003-03-23 03:33:13 +00003253#endif
3254
Tim Peters6d6c1a32001-08-02 04:15:00 +00003255 /* Initialize tp_base (defaults to BaseObject unless that's us) */
3256 base = type->tp_base;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003257 if (base == NULL && type != &PyBaseObject_Type) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003258 base = type->tp_base = &PyBaseObject_Type;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003259 Py_INCREF(base);
3260 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003261
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003262 /* Now the only way base can still be NULL is if type is
3263 * &PyBaseObject_Type.
3264 */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003265
Guido van Rossum323a9cf2002-08-14 17:26:30 +00003266 /* Initialize the base class */
3267 if (base && base->tp_dict == NULL) {
3268 if (PyType_Ready(base) < 0)
3269 goto error;
3270 }
3271
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003272 /* Initialize ob_type if NULL. This means extensions that want to be
Guido van Rossum0986d822002-04-08 01:38:42 +00003273 compilable separately on Windows can call PyType_Ready() instead of
3274 initializing the ob_type field of their type objects. */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003275 /* The test for base != NULL is really unnecessary, since base is only
3276 NULL when type is &PyBaseObject_Type, and we know its ob_type is
3277 not NULL (it's initialized to &PyType_Type). But coverity doesn't
3278 know that. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003279 if (type->ob_type == NULL && base != NULL)
Guido van Rossum0986d822002-04-08 01:38:42 +00003280 type->ob_type = base->ob_type;
3281
Tim Peters6d6c1a32001-08-02 04:15:00 +00003282 /* Initialize tp_bases */
3283 bases = type->tp_bases;
3284 if (bases == NULL) {
3285 if (base == NULL)
3286 bases = PyTuple_New(0);
3287 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003288 bases = PyTuple_Pack(1, base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003289 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003290 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003291 type->tp_bases = bases;
3292 }
3293
Guido van Rossum687ae002001-10-15 22:03:32 +00003294 /* Initialize tp_dict */
3295 dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003296 if (dict == NULL) {
3297 dict = PyDict_New();
3298 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003299 goto error;
Guido van Rossum687ae002001-10-15 22:03:32 +00003300 type->tp_dict = dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003301 }
3302
Guido van Rossum687ae002001-10-15 22:03:32 +00003303 /* Add type-specific descriptors to tp_dict */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003304 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003305 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003306 if (type->tp_methods != NULL) {
3307 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003308 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003309 }
3310 if (type->tp_members != NULL) {
3311 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003312 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003313 }
3314 if (type->tp_getset != NULL) {
3315 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003316 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003317 }
3318
Tim Peters6d6c1a32001-08-02 04:15:00 +00003319 /* Calculate method resolution order */
3320 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00003321 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003322 }
3323
Guido van Rossum13d52f02001-08-10 21:24:08 +00003324 /* Inherit special flags from dominant base */
3325 if (type->tp_base != NULL)
3326 inherit_special(type, type->tp_base);
3327
Tim Peters6d6c1a32001-08-02 04:15:00 +00003328 /* Initialize tp_dict properly */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003329 bases = type->tp_mro;
3330 assert(bases != NULL);
3331 assert(PyTuple_Check(bases));
3332 n = PyTuple_GET_SIZE(bases);
3333 for (i = 1; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003334 PyObject *b = PyTuple_GET_ITEM(bases, i);
3335 if (PyType_Check(b))
3336 inherit_slots(type, (PyTypeObject *)b);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003337 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003338
Tim Peters3cfe7542003-05-21 21:29:48 +00003339 /* Sanity check for tp_free. */
3340 if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
3341 (type->tp_free == NULL || type->tp_free == PyObject_Del)) {
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003342 /* This base class needs to call tp_free, but doesn't have
3343 * one, or its tp_free is for non-gc'ed objects.
3344 */
Tim Peters3cfe7542003-05-21 21:29:48 +00003345 PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
3346 "gc and is a base type but has inappropriate "
3347 "tp_free slot",
3348 type->tp_name);
3349 goto error;
3350 }
3351
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003352 /* if the type dictionary doesn't contain a __doc__, set it from
3353 the tp_doc slot.
3354 */
3355 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
3356 if (type->tp_doc != NULL) {
3357 PyObject *doc = PyString_FromString(type->tp_doc);
Neal Norwitze1fdb322006-07-21 05:32:28 +00003358 if (doc == NULL)
3359 goto error;
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003360 PyDict_SetItemString(type->tp_dict, "__doc__", doc);
3361 Py_DECREF(doc);
3362 } else {
Guido van Rossumd4641072002-04-03 02:13:37 +00003363 PyDict_SetItemString(type->tp_dict,
3364 "__doc__", Py_None);
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003365 }
3366 }
3367
Guido van Rossum13d52f02001-08-10 21:24:08 +00003368 /* Some more special stuff */
3369 base = type->tp_base;
3370 if (base != NULL) {
3371 if (type->tp_as_number == NULL)
3372 type->tp_as_number = base->tp_as_number;
3373 if (type->tp_as_sequence == NULL)
3374 type->tp_as_sequence = base->tp_as_sequence;
3375 if (type->tp_as_mapping == NULL)
3376 type->tp_as_mapping = base->tp_as_mapping;
Guido van Rossumeea47182003-02-11 20:39:59 +00003377 if (type->tp_as_buffer == NULL)
3378 type->tp_as_buffer = base->tp_as_buffer;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003379 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003380
Guido van Rossum1c450732001-10-08 15:18:27 +00003381 /* Link into each base class's list of subclasses */
3382 bases = type->tp_bases;
3383 n = PyTuple_GET_SIZE(bases);
3384 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003385 PyObject *b = PyTuple_GET_ITEM(bases, i);
3386 if (PyType_Check(b) &&
3387 add_subclass((PyTypeObject *)b, type) < 0)
Guido van Rossum1c450732001-10-08 15:18:27 +00003388 goto error;
3389 }
3390
Guido van Rossum13d52f02001-08-10 21:24:08 +00003391 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00003392 assert(type->tp_dict != NULL);
3393 type->tp_flags =
3394 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003395 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00003396
3397 error:
3398 type->tp_flags &= ~Py_TPFLAGS_READYING;
3399 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003400}
3401
Guido van Rossum1c450732001-10-08 15:18:27 +00003402static int
3403add_subclass(PyTypeObject *base, PyTypeObject *type)
3404{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003405 Py_ssize_t i;
3406 int result;
Anthony Baxtera6286212006-04-11 07:42:36 +00003407 PyObject *list, *ref, *newobj;
Guido van Rossum1c450732001-10-08 15:18:27 +00003408
3409 list = base->tp_subclasses;
3410 if (list == NULL) {
3411 base->tp_subclasses = list = PyList_New(0);
3412 if (list == NULL)
3413 return -1;
3414 }
3415 assert(PyList_Check(list));
Anthony Baxtera6286212006-04-11 07:42:36 +00003416 newobj = PyWeakref_NewRef((PyObject *)type, NULL);
Guido van Rossum1c450732001-10-08 15:18:27 +00003417 i = PyList_GET_SIZE(list);
3418 while (--i >= 0) {
3419 ref = PyList_GET_ITEM(list, i);
3420 assert(PyWeakref_CheckRef(ref));
Guido van Rossum3930bc32002-10-18 13:51:49 +00003421 if (PyWeakref_GET_OBJECT(ref) == Py_None)
Anthony Baxtera6286212006-04-11 07:42:36 +00003422 return PyList_SetItem(list, i, newobj);
Guido van Rossum1c450732001-10-08 15:18:27 +00003423 }
Anthony Baxtera6286212006-04-11 07:42:36 +00003424 result = PyList_Append(list, newobj);
3425 Py_DECREF(newobj);
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003426 return result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003427}
3428
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003429static void
3430remove_subclass(PyTypeObject *base, PyTypeObject *type)
3431{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003432 Py_ssize_t i;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003433 PyObject *list, *ref;
3434
3435 list = base->tp_subclasses;
3436 if (list == NULL) {
3437 return;
3438 }
3439 assert(PyList_Check(list));
3440 i = PyList_GET_SIZE(list);
3441 while (--i >= 0) {
3442 ref = PyList_GET_ITEM(list, i);
3443 assert(PyWeakref_CheckRef(ref));
3444 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
3445 /* this can't fail, right? */
3446 PySequence_DelItem(list, i);
3447 return;
3448 }
3449 }
3450}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003451
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003452static int
3453check_num_args(PyObject *ob, int n)
3454{
3455 if (!PyTuple_CheckExact(ob)) {
3456 PyErr_SetString(PyExc_SystemError,
3457 "PyArg_UnpackTuple() argument list is not a tuple");
3458 return 0;
3459 }
3460 if (n == PyTuple_GET_SIZE(ob))
3461 return 1;
3462 PyErr_Format(
3463 PyExc_TypeError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00003464 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003465 return 0;
3466}
3467
Tim Peters6d6c1a32001-08-02 04:15:00 +00003468/* Generic wrappers for overloadable 'operators' such as __getitem__ */
3469
3470/* There's a wrapper *function* for each distinct function typedef used
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003471 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
Tim Peters6d6c1a32001-08-02 04:15:00 +00003472 wrapper *table* for each distinct operation (e.g. __len__, __add__).
3473 Most tables have only one entry; the tables for binary operators have two
3474 entries, one regular and one with reversed arguments. */
3475
3476static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003477wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003478{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003479 lenfunc func = (lenfunc)wrapped;
3480 Py_ssize_t res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003481
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003482 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003483 return NULL;
3484 res = (*func)(self);
3485 if (res == -1 && PyErr_Occurred())
3486 return NULL;
3487 return PyInt_FromLong((long)res);
3488}
3489
Tim Peters6d6c1a32001-08-02 04:15:00 +00003490static PyObject *
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003491wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
3492{
3493 inquiry func = (inquiry)wrapped;
3494 int res;
3495
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003496 if (!check_num_args(args, 0))
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003497 return NULL;
3498 res = (*func)(self);
3499 if (res == -1 && PyErr_Occurred())
3500 return NULL;
3501 return PyBool_FromLong((long)res);
3502}
3503
3504static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003505wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
3506{
3507 binaryfunc func = (binaryfunc)wrapped;
3508 PyObject *other;
3509
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003510 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003511 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003512 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003513 return (*func)(self, other);
3514}
3515
3516static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003517wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
3518{
3519 binaryfunc func = (binaryfunc)wrapped;
3520 PyObject *other;
3521
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003522 if (!check_num_args(args, 1))
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003523 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003524 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003525 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003526 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003527 Py_INCREF(Py_NotImplemented);
3528 return Py_NotImplemented;
3529 }
3530 return (*func)(self, other);
3531}
3532
3533static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003534wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3535{
3536 binaryfunc func = (binaryfunc)wrapped;
3537 PyObject *other;
3538
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003539 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003540 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003541 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003542 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003543 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003544 Py_INCREF(Py_NotImplemented);
3545 return Py_NotImplemented;
3546 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003547 return (*func)(other, self);
3548}
3549
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003550static PyObject *
3551wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
3552{
3553 coercion func = (coercion)wrapped;
3554 PyObject *other, *res;
3555 int ok;
3556
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003557 if (!check_num_args(args, 1))
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003558 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003559 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003560 ok = func(&self, &other);
3561 if (ok < 0)
3562 return NULL;
3563 if (ok > 0) {
3564 Py_INCREF(Py_NotImplemented);
3565 return Py_NotImplemented;
3566 }
3567 res = PyTuple_New(2);
3568 if (res == NULL) {
3569 Py_DECREF(self);
3570 Py_DECREF(other);
3571 return NULL;
3572 }
3573 PyTuple_SET_ITEM(res, 0, self);
3574 PyTuple_SET_ITEM(res, 1, other);
3575 return res;
3576}
3577
Tim Peters6d6c1a32001-08-02 04:15:00 +00003578static PyObject *
3579wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
3580{
3581 ternaryfunc func = (ternaryfunc)wrapped;
3582 PyObject *other;
3583 PyObject *third = Py_None;
3584
3585 /* Note: This wrapper only works for __pow__() */
3586
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003587 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003588 return NULL;
3589 return (*func)(self, other, third);
3590}
3591
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003592static PyObject *
3593wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3594{
3595 ternaryfunc func = (ternaryfunc)wrapped;
3596 PyObject *other;
3597 PyObject *third = Py_None;
3598
3599 /* Note: This wrapper only works for __pow__() */
3600
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003601 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003602 return NULL;
3603 return (*func)(other, self, third);
3604}
3605
Tim Peters6d6c1a32001-08-02 04:15:00 +00003606static PyObject *
3607wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
3608{
3609 unaryfunc func = (unaryfunc)wrapped;
3610
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003611 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003612 return NULL;
3613 return (*func)(self);
3614}
3615
Tim Peters6d6c1a32001-08-02 04:15:00 +00003616static PyObject *
Armin Rigo314861c2006-03-30 14:04:02 +00003617wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003618{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003619 ssizeargfunc func = (ssizeargfunc)wrapped;
Armin Rigo314861c2006-03-30 14:04:02 +00003620 PyObject* o;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003621 Py_ssize_t i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003622
Armin Rigo314861c2006-03-30 14:04:02 +00003623 if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
3624 return NULL;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003625 i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
Armin Rigo314861c2006-03-30 14:04:02 +00003626 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00003627 return NULL;
3628 return (*func)(self, i);
3629}
3630
Martin v. Löwis18e16552006-02-15 17:27:45 +00003631static Py_ssize_t
Guido van Rossum5d815f32001-08-17 21:57:47 +00003632getindex(PyObject *self, PyObject *arg)
3633{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003634 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003635
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003636 i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003637 if (i == -1 && PyErr_Occurred())
3638 return -1;
3639 if (i < 0) {
3640 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
3641 if (sq && sq->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00003642 Py_ssize_t n = (*sq->sq_length)(self);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003643 if (n < 0)
3644 return -1;
3645 i += n;
3646 }
3647 }
3648 return i;
3649}
3650
3651static PyObject *
3652wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
3653{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003654 ssizeargfunc func = (ssizeargfunc)wrapped;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003655 PyObject *arg;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003656 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003657
Guido van Rossumf4593e02001-10-03 12:09:30 +00003658 if (PyTuple_GET_SIZE(args) == 1) {
3659 arg = PyTuple_GET_ITEM(args, 0);
3660 i = getindex(self, arg);
3661 if (i == -1 && PyErr_Occurred())
3662 return NULL;
3663 return (*func)(self, i);
3664 }
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003665 check_num_args(args, 1);
Guido van Rossumf4593e02001-10-03 12:09:30 +00003666 assert(PyErr_Occurred());
3667 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003668}
3669
Tim Peters6d6c1a32001-08-02 04:15:00 +00003670static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003671wrap_ssizessizeargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003672{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003673 ssizessizeargfunc func = (ssizessizeargfunc)wrapped;
3674 Py_ssize_t i, j;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003675
Martin v. Löwis18e16552006-02-15 17:27:45 +00003676 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003677 return NULL;
3678 return (*func)(self, i, j);
3679}
3680
Tim Peters6d6c1a32001-08-02 04:15:00 +00003681static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003682wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003683{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003684 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3685 Py_ssize_t i;
3686 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003687 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003688
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003689 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003690 return NULL;
3691 i = getindex(self, arg);
3692 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00003693 return NULL;
3694 res = (*func)(self, i, value);
3695 if (res == -1 && PyErr_Occurred())
3696 return NULL;
3697 Py_INCREF(Py_None);
3698 return Py_None;
3699}
3700
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003701static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003702wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003703{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003704 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3705 Py_ssize_t i;
3706 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003707 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003708
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003709 if (!check_num_args(args, 1))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003710 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003711 arg = PyTuple_GET_ITEM(args, 0);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003712 i = getindex(self, arg);
3713 if (i == -1 && PyErr_Occurred())
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003714 return NULL;
3715 res = (*func)(self, i, NULL);
3716 if (res == -1 && PyErr_Occurred())
3717 return NULL;
3718 Py_INCREF(Py_None);
3719 return Py_None;
3720}
3721
Tim Peters6d6c1a32001-08-02 04:15:00 +00003722static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003723wrap_ssizessizeobjargproc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003724{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003725 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3726 Py_ssize_t i, j;
3727 int res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003728 PyObject *value;
3729
Martin v. Löwis18e16552006-02-15 17:27:45 +00003730 if (!PyArg_ParseTuple(args, "nnO", &i, &j, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003731 return NULL;
3732 res = (*func)(self, i, j, value);
3733 if (res == -1 && PyErr_Occurred())
3734 return NULL;
3735 Py_INCREF(Py_None);
3736 return Py_None;
3737}
3738
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003739static PyObject *
3740wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
3741{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003742 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3743 Py_ssize_t i, j;
3744 int res;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003745
Martin v. Löwis18e16552006-02-15 17:27:45 +00003746 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003747 return NULL;
3748 res = (*func)(self, i, j, NULL);
3749 if (res == -1 && PyErr_Occurred())
3750 return NULL;
3751 Py_INCREF(Py_None);
3752 return Py_None;
3753}
3754
Tim Peters6d6c1a32001-08-02 04:15:00 +00003755/* XXX objobjproc is a misnomer; should be objargpred */
3756static PyObject *
3757wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
3758{
3759 objobjproc func = (objobjproc)wrapped;
3760 int res;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003761 PyObject *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003762
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003763 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003764 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003765 value = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003766 res = (*func)(self, value);
3767 if (res == -1 && PyErr_Occurred())
3768 return NULL;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003769 else
3770 return PyBool_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003771}
3772
Tim Peters6d6c1a32001-08-02 04:15:00 +00003773static PyObject *
3774wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
3775{
3776 objobjargproc func = (objobjargproc)wrapped;
3777 int res;
3778 PyObject *key, *value;
3779
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003780 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003781 return NULL;
3782 res = (*func)(self, key, value);
3783 if (res == -1 && PyErr_Occurred())
3784 return NULL;
3785 Py_INCREF(Py_None);
3786 return Py_None;
3787}
3788
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003789static PyObject *
3790wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
3791{
3792 objobjargproc func = (objobjargproc)wrapped;
3793 int res;
3794 PyObject *key;
3795
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003796 if (!check_num_args(args, 1))
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003797 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003798 key = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003799 res = (*func)(self, key, NULL);
3800 if (res == -1 && PyErr_Occurred())
3801 return NULL;
3802 Py_INCREF(Py_None);
3803 return Py_None;
3804}
3805
Tim Peters6d6c1a32001-08-02 04:15:00 +00003806static PyObject *
3807wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
3808{
3809 cmpfunc func = (cmpfunc)wrapped;
3810 int res;
3811 PyObject *other;
3812
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003813 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003814 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003815 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00003816 if (other->ob_type->tp_compare != func &&
3817 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossumceccae52001-09-18 20:03:57 +00003818 PyErr_Format(
3819 PyExc_TypeError,
3820 "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
3821 self->ob_type->tp_name,
3822 self->ob_type->tp_name,
3823 other->ob_type->tp_name);
3824 return NULL;
3825 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003826 res = (*func)(self, other);
3827 if (PyErr_Occurred())
3828 return NULL;
3829 return PyInt_FromLong((long)res);
3830}
3831
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003832/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
Guido van Rossum52b27052003-04-15 20:05:10 +00003833 This is called the Carlo Verre hack after its discoverer. */
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003834static int
3835hackcheck(PyObject *self, setattrofunc func, char *what)
3836{
3837 PyTypeObject *type = self->ob_type;
3838 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
3839 type = type->tp_base;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003840 /* If type is NULL now, this is a really weird type.
3841 In the spirit of backwards compatibility (?), just shut up. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003842 if (type && type->tp_setattro != func) {
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003843 PyErr_Format(PyExc_TypeError,
3844 "can't apply this %s to %s object",
3845 what,
3846 type->tp_name);
3847 return 0;
3848 }
3849 return 1;
3850}
3851
Tim Peters6d6c1a32001-08-02 04:15:00 +00003852static PyObject *
3853wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
3854{
3855 setattrofunc func = (setattrofunc)wrapped;
3856 int res;
3857 PyObject *name, *value;
3858
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003859 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003860 return NULL;
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003861 if (!hackcheck(self, func, "__setattr__"))
3862 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003863 res = (*func)(self, name, value);
3864 if (res < 0)
3865 return NULL;
3866 Py_INCREF(Py_None);
3867 return Py_None;
3868}
3869
3870static PyObject *
3871wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
3872{
3873 setattrofunc func = (setattrofunc)wrapped;
3874 int res;
3875 PyObject *name;
3876
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003877 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003878 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003879 name = PyTuple_GET_ITEM(args, 0);
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003880 if (!hackcheck(self, func, "__delattr__"))
3881 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003882 res = (*func)(self, name, NULL);
3883 if (res < 0)
3884 return NULL;
3885 Py_INCREF(Py_None);
3886 return Py_None;
3887}
3888
Tim Peters6d6c1a32001-08-02 04:15:00 +00003889static PyObject *
3890wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
3891{
3892 hashfunc func = (hashfunc)wrapped;
3893 long res;
3894
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003895 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003896 return NULL;
3897 res = (*func)(self);
3898 if (res == -1 && PyErr_Occurred())
3899 return NULL;
3900 return PyInt_FromLong(res);
3901}
3902
Tim Peters6d6c1a32001-08-02 04:15:00 +00003903static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00003904wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003905{
3906 ternaryfunc func = (ternaryfunc)wrapped;
3907
Guido van Rossumc8e56452001-10-22 00:43:43 +00003908 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003909}
3910
Tim Peters6d6c1a32001-08-02 04:15:00 +00003911static PyObject *
3912wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
3913{
3914 richcmpfunc func = (richcmpfunc)wrapped;
3915 PyObject *other;
3916
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003917 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003918 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003919 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003920 return (*func)(self, other, op);
3921}
3922
3923#undef RICHCMP_WRAPPER
3924#define RICHCMP_WRAPPER(NAME, OP) \
3925static PyObject * \
3926richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
3927{ \
3928 return wrap_richcmpfunc(self, args, wrapped, OP); \
3929}
3930
Jack Jansen8e938b42001-08-08 15:29:49 +00003931RICHCMP_WRAPPER(lt, Py_LT)
3932RICHCMP_WRAPPER(le, Py_LE)
3933RICHCMP_WRAPPER(eq, Py_EQ)
3934RICHCMP_WRAPPER(ne, Py_NE)
3935RICHCMP_WRAPPER(gt, Py_GT)
3936RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003937
Tim Peters6d6c1a32001-08-02 04:15:00 +00003938static PyObject *
3939wrap_next(PyObject *self, PyObject *args, void *wrapped)
3940{
3941 unaryfunc func = (unaryfunc)wrapped;
3942 PyObject *res;
3943
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003944 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003945 return NULL;
3946 res = (*func)(self);
3947 if (res == NULL && !PyErr_Occurred())
3948 PyErr_SetNone(PyExc_StopIteration);
3949 return res;
3950}
3951
Tim Peters6d6c1a32001-08-02 04:15:00 +00003952static PyObject *
3953wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
3954{
3955 descrgetfunc func = (descrgetfunc)wrapped;
3956 PyObject *obj;
3957 PyObject *type = NULL;
3958
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003959 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003960 return NULL;
Guido van Rossum82ed25c2003-02-11 16:25:43 +00003961 if (obj == Py_None)
3962 obj = NULL;
3963 if (type == Py_None)
3964 type = NULL;
3965 if (type == NULL &&obj == NULL) {
3966 PyErr_SetString(PyExc_TypeError,
3967 "__get__(None, None) is invalid");
3968 return NULL;
3969 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003970 return (*func)(self, obj, type);
3971}
3972
Tim Peters6d6c1a32001-08-02 04:15:00 +00003973static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003974wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003975{
3976 descrsetfunc func = (descrsetfunc)wrapped;
3977 PyObject *obj, *value;
3978 int ret;
3979
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003980 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003981 return NULL;
3982 ret = (*func)(self, obj, value);
3983 if (ret < 0)
3984 return NULL;
3985 Py_INCREF(Py_None);
3986 return Py_None;
3987}
Guido van Rossum22b13872002-08-06 21:41:44 +00003988
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003989static PyObject *
3990wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
3991{
3992 descrsetfunc func = (descrsetfunc)wrapped;
3993 PyObject *obj;
3994 int ret;
3995
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003996 if (!check_num_args(args, 1))
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003997 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003998 obj = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003999 ret = (*func)(self, obj, NULL);
4000 if (ret < 0)
4001 return NULL;
4002 Py_INCREF(Py_None);
4003 return Py_None;
4004}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004005
Tim Peters6d6c1a32001-08-02 04:15:00 +00004006static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004007wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004008{
4009 initproc func = (initproc)wrapped;
4010
Guido van Rossumc8e56452001-10-22 00:43:43 +00004011 if (func(self, args, kwds) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004012 return NULL;
4013 Py_INCREF(Py_None);
4014 return Py_None;
4015}
4016
Tim Peters6d6c1a32001-08-02 04:15:00 +00004017static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004018tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004019{
Barry Warsaw60f01882001-08-22 19:24:42 +00004020 PyTypeObject *type, *subtype, *staticbase;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004021 PyObject *arg0, *res;
4022
4023 if (self == NULL || !PyType_Check(self))
4024 Py_FatalError("__new__() called with non-type 'self'");
4025 type = (PyTypeObject *)self;
4026 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004027 PyErr_Format(PyExc_TypeError,
4028 "%s.__new__(): not enough arguments",
4029 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004030 return NULL;
4031 }
4032 arg0 = PyTuple_GET_ITEM(args, 0);
4033 if (!PyType_Check(arg0)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004034 PyErr_Format(PyExc_TypeError,
4035 "%s.__new__(X): X is not a type object (%s)",
4036 type->tp_name,
4037 arg0->ob_type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004038 return NULL;
4039 }
4040 subtype = (PyTypeObject *)arg0;
4041 if (!PyType_IsSubtype(subtype, type)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004042 PyErr_Format(PyExc_TypeError,
4043 "%s.__new__(%s): %s is not a subtype of %s",
4044 type->tp_name,
4045 subtype->tp_name,
4046 subtype->tp_name,
4047 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004048 return NULL;
4049 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004050
4051 /* Check that the use doesn't do something silly and unsafe like
Tim Petersa427a2b2001-10-29 22:25:45 +00004052 object.__new__(dict). To do this, we check that the
Barry Warsaw60f01882001-08-22 19:24:42 +00004053 most derived base that's not a heap type is this type. */
4054 staticbase = subtype;
4055 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
4056 staticbase = staticbase->tp_base;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004057 /* If staticbase is NULL now, it is a really weird type.
4058 In the spirit of backwards compatibility (?), just shut up. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00004059 if (staticbase && staticbase->tp_new != type->tp_new) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004060 PyErr_Format(PyExc_TypeError,
4061 "%s.__new__(%s) is not safe, use %s.__new__()",
4062 type->tp_name,
4063 subtype->tp_name,
4064 staticbase == NULL ? "?" : staticbase->tp_name);
4065 return NULL;
4066 }
4067
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004068 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
4069 if (args == NULL)
4070 return NULL;
4071 res = type->tp_new(subtype, args, kwds);
4072 Py_DECREF(args);
4073 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004074}
4075
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004076static struct PyMethodDef tp_new_methoddef[] = {
4077 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00004078 PyDoc_STR("T.__new__(S, ...) -> "
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004079 "a new object with type S, a subtype of T")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00004080 {0}
4081};
4082
4083static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004084add_tp_new_wrapper(PyTypeObject *type)
4085{
Guido van Rossumf040ede2001-08-07 16:40:56 +00004086 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004087
Guido van Rossum687ae002001-10-15 22:03:32 +00004088 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
Guido van Rossumf040ede2001-08-07 16:40:56 +00004089 return 0;
4090 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004091 if (func == NULL)
4092 return -1;
Raymond Hettinger8d726ee2004-06-25 22:24:35 +00004093 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
Raymond Hettingerd56cbe52004-06-25 22:17:39 +00004094 Py_DECREF(func);
4095 return -1;
4096 }
4097 Py_DECREF(func);
4098 return 0;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004099}
4100
Guido van Rossumf040ede2001-08-07 16:40:56 +00004101/* Slot wrappers that call the corresponding __foo__ slot. See comments
4102 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004103
Guido van Rossumdc91b992001-08-08 22:26:22 +00004104#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004105static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004106FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004107{ \
Guido van Rossum5592e4d2001-08-28 18:28:21 +00004108 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004109 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004110}
4111
Guido van Rossumdc91b992001-08-08 22:26:22 +00004112#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004113static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004114FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004115{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004116 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004117 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004118}
4119
Guido van Rossumcd118802003-01-06 22:57:47 +00004120/* Boolean helper for SLOT1BINFULL().
4121 right.__class__ is a nontrivial subclass of left.__class__. */
4122static int
4123method_is_overloaded(PyObject *left, PyObject *right, char *name)
4124{
4125 PyObject *a, *b;
4126 int ok;
4127
4128 b = PyObject_GetAttrString((PyObject *)(right->ob_type), name);
4129 if (b == NULL) {
4130 PyErr_Clear();
4131 /* If right doesn't have it, it's not overloaded */
4132 return 0;
4133 }
4134
4135 a = PyObject_GetAttrString((PyObject *)(left->ob_type), name);
4136 if (a == NULL) {
4137 PyErr_Clear();
4138 Py_DECREF(b);
4139 /* If right has it but left doesn't, it's overloaded */
4140 return 1;
4141 }
4142
4143 ok = PyObject_RichCompareBool(a, b, Py_NE);
4144 Py_DECREF(a);
4145 Py_DECREF(b);
4146 if (ok < 0) {
4147 PyErr_Clear();
4148 return 0;
4149 }
4150
4151 return ok;
4152}
4153
Guido van Rossumdc91b992001-08-08 22:26:22 +00004154
4155#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004156static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004157FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004159 static PyObject *cache_str, *rcache_str; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004160 int do_other = self->ob_type != other->ob_type && \
4161 other->ob_type->tp_as_number != NULL && \
4162 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004163 if (self->ob_type->tp_as_number != NULL && \
4164 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
4165 PyObject *r; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004166 if (do_other && \
Guido van Rossumcd118802003-01-06 22:57:47 +00004167 PyType_IsSubtype(other->ob_type, self->ob_type) && \
4168 method_is_overloaded(self, other, ROPSTR)) { \
Guido van Rossum55f20992001-10-01 17:18:22 +00004169 r = call_maybe( \
4170 other, ROPSTR, &rcache_str, "(O)", self); \
4171 if (r != Py_NotImplemented) \
4172 return r; \
4173 Py_DECREF(r); \
4174 do_other = 0; \
4175 } \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004176 r = call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004177 self, OPSTR, &cache_str, "(O)", other); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004178 if (r != Py_NotImplemented || \
4179 other->ob_type == self->ob_type) \
4180 return r; \
4181 Py_DECREF(r); \
4182 } \
Guido van Rossum55f20992001-10-01 17:18:22 +00004183 if (do_other) { \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004184 return call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004185 other, ROPSTR, &rcache_str, "(O)", self); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004186 } \
4187 Py_INCREF(Py_NotImplemented); \
4188 return Py_NotImplemented; \
4189}
4190
4191#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
4192 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
4193
4194#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
4195static PyObject * \
4196FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
4197{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004198 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004199 return call_method(self, OPSTR, &cache_str, \
4200 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004201}
4202
Martin v. Löwis18e16552006-02-15 17:27:45 +00004203static Py_ssize_t
Tim Peters6d6c1a32001-08-02 04:15:00 +00004204slot_sq_length(PyObject *self)
4205{
Guido van Rossum2730b132001-08-28 18:22:14 +00004206 static PyObject *len_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004207 PyObject *res = call_method(self, "__len__", &len_str, "()");
Martin v. Löwis18e16552006-02-15 17:27:45 +00004208 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004209
4210 if (res == NULL)
4211 return -1;
Neal Norwitz1872b1c2006-08-12 18:44:06 +00004212 len = PyInt_AsSsize_t(res);
Guido van Rossum26111622001-10-01 16:42:49 +00004213 Py_DECREF(res);
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004214 if (len < 0) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00004215 if (!PyErr_Occurred())
4216 PyErr_SetString(PyExc_ValueError,
4217 "__len__() should return >= 0");
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004218 return -1;
4219 }
Guido van Rossum26111622001-10-01 16:42:49 +00004220 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004221}
4222
Guido van Rossumf4593e02001-10-03 12:09:30 +00004223/* Super-optimized version of slot_sq_item.
4224 Other slots could do the same... */
4225static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00004226slot_sq_item(PyObject *self, Py_ssize_t i)
Guido van Rossumf4593e02001-10-03 12:09:30 +00004227{
4228 static PyObject *getitem_str;
4229 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
4230 descrgetfunc f;
4231
4232 if (getitem_str == NULL) {
4233 getitem_str = PyString_InternFromString("__getitem__");
4234 if (getitem_str == NULL)
4235 return NULL;
4236 }
4237 func = _PyType_Lookup(self->ob_type, getitem_str);
4238 if (func != NULL) {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004239 if ((f = func->ob_type->tp_descr_get) == NULL)
4240 Py_INCREF(func);
Neal Norwitz673cd822002-10-18 16:33:13 +00004241 else {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004242 func = f(func, self, (PyObject *)(self->ob_type));
Neal Norwitz673cd822002-10-18 16:33:13 +00004243 if (func == NULL) {
4244 return NULL;
4245 }
4246 }
Martin v. Löwiseb079f12006-02-16 14:32:27 +00004247 ival = PyInt_FromSsize_t(i);
Guido van Rossumf4593e02001-10-03 12:09:30 +00004248 if (ival != NULL) {
4249 args = PyTuple_New(1);
4250 if (args != NULL) {
4251 PyTuple_SET_ITEM(args, 0, ival);
4252 retval = PyObject_Call(func, args, NULL);
4253 Py_XDECREF(args);
4254 Py_XDECREF(func);
4255 return retval;
4256 }
4257 }
4258 }
4259 else {
4260 PyErr_SetObject(PyExc_AttributeError, getitem_str);
4261 }
4262 Py_XDECREF(args);
4263 Py_XDECREF(ival);
4264 Py_XDECREF(func);
4265 return NULL;
4266}
4267
Martin v. Löwis18e16552006-02-15 17:27:45 +00004268SLOT2(slot_sq_slice, "__getslice__", Py_ssize_t, Py_ssize_t, "nn")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004269
4270static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004271slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004272{
4273 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004274 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004275
4276 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004277 res = call_method(self, "__delitem__", &delitem_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004278 "(n)", index);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004279 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004280 res = call_method(self, "__setitem__", &setitem_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004281 "(nO)", index, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004282 if (res == NULL)
4283 return -1;
4284 Py_DECREF(res);
4285 return 0;
4286}
4287
4288static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004289slot_sq_ass_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004290{
4291 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004292 static PyObject *delslice_str, *setslice_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004293
4294 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004295 res = call_method(self, "__delslice__", &delslice_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004296 "(nn)", i, j);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004297 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004298 res = call_method(self, "__setslice__", &setslice_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004299 "(nnO)", i, j, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004300 if (res == NULL)
4301 return -1;
4302 Py_DECREF(res);
4303 return 0;
4304}
4305
4306static int
4307slot_sq_contains(PyObject *self, PyObject *value)
4308{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004309 PyObject *func, *res, *args;
Tim Petersbf9b2442003-03-23 05:35:36 +00004310 int result = -1;
4311
Guido van Rossum60718732001-08-28 17:47:51 +00004312 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004313
Guido van Rossum55f20992001-10-01 17:18:22 +00004314 func = lookup_maybe(self, "__contains__", &contains_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004315 if (func != NULL) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004316 args = PyTuple_Pack(1, value);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004317 if (args == NULL)
4318 res = NULL;
4319 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004320 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004321 Py_DECREF(args);
4322 }
4323 Py_DECREF(func);
Tim Petersbf9b2442003-03-23 05:35:36 +00004324 if (res != NULL) {
4325 result = PyObject_IsTrue(res);
4326 Py_DECREF(res);
4327 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004328 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004329 else if (! PyErr_Occurred()) {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004330 /* Possible results: -1 and 1 */
4331 result = (int)_PySequence_IterSearch(self, value,
Tim Petersbf9b2442003-03-23 05:35:36 +00004332 PY_ITERSEARCH_CONTAINS);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004333 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004334 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004335}
4336
Tim Peters6d6c1a32001-08-02 04:15:00 +00004337#define slot_mp_length slot_sq_length
4338
Guido van Rossumdc91b992001-08-08 22:26:22 +00004339SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004340
4341static int
4342slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
4343{
4344 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004345 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004346
4347 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004348 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004349 "(O)", key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004350 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004351 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004352 "(OO)", key, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004353 if (res == NULL)
4354 return -1;
4355 Py_DECREF(res);
4356 return 0;
4357}
4358
Guido van Rossumdc91b992001-08-08 22:26:22 +00004359SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
4360SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
4361SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
4362SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
4363SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
4364SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
4365
Jeremy Hylton938ace62002-07-17 16:30:39 +00004366static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00004367
4368SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
4369 nb_power, "__pow__", "__rpow__")
4370
4371static PyObject *
4372slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
4373{
Guido van Rossum2730b132001-08-28 18:22:14 +00004374 static PyObject *pow_str;
4375
Guido van Rossumdc91b992001-08-08 22:26:22 +00004376 if (modulus == Py_None)
4377 return slot_nb_power_binary(self, other);
Guido van Rossum23094982002-06-10 14:30:43 +00004378 /* Three-arg power doesn't use __rpow__. But ternary_op
4379 can call this when the second argument's type uses
4380 slot_nb_power, so check before calling self.__pow__. */
4381 if (self->ob_type->tp_as_number != NULL &&
4382 self->ob_type->tp_as_number->nb_power == slot_nb_power) {
4383 return call_method(self, "__pow__", &pow_str,
4384 "(OO)", other, modulus);
4385 }
4386 Py_INCREF(Py_NotImplemented);
4387 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00004388}
4389
4390SLOT0(slot_nb_negative, "__neg__")
4391SLOT0(slot_nb_positive, "__pos__")
4392SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004393
4394static int
4395slot_nb_nonzero(PyObject *self)
4396{
Tim Petersea7f75d2002-12-07 21:39:16 +00004397 PyObject *func, *args;
Guido van Rossum60718732001-08-28 17:47:51 +00004398 static PyObject *nonzero_str, *len_str;
Tim Petersea7f75d2002-12-07 21:39:16 +00004399 int result = -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004400
Guido van Rossum55f20992001-10-01 17:18:22 +00004401 func = lookup_maybe(self, "__nonzero__", &nonzero_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004402 if (func == NULL) {
Guido van Rossum55f20992001-10-01 17:18:22 +00004403 if (PyErr_Occurred())
Guido van Rossumb8f63662001-08-15 23:57:02 +00004404 return -1;
Guido van Rossum55f20992001-10-01 17:18:22 +00004405 func = lookup_maybe(self, "__len__", &len_str);
Tim Petersea7f75d2002-12-07 21:39:16 +00004406 if (func == NULL)
4407 return PyErr_Occurred() ? -1 : 1;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004408 }
Tim Petersea7f75d2002-12-07 21:39:16 +00004409 args = PyTuple_New(0);
4410 if (args != NULL) {
4411 PyObject *temp = PyObject_Call(func, args, NULL);
4412 Py_DECREF(args);
4413 if (temp != NULL) {
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004414 if (PyInt_CheckExact(temp) || PyBool_Check(temp))
Jeremy Hylton090a3492003-06-27 16:46:45 +00004415 result = PyObject_IsTrue(temp);
4416 else {
4417 PyErr_Format(PyExc_TypeError,
4418 "__nonzero__ should return "
4419 "bool or int, returned %s",
4420 temp->ob_type->tp_name);
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004421 result = -1;
Jeremy Hylton090a3492003-06-27 16:46:45 +00004422 }
Tim Petersea7f75d2002-12-07 21:39:16 +00004423 Py_DECREF(temp);
Guido van Rossum55f20992001-10-01 17:18:22 +00004424 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004425 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004426 Py_DECREF(func);
Tim Petersea7f75d2002-12-07 21:39:16 +00004427 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004428}
4429
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004430
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004431static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004432slot_nb_index(PyObject *self)
4433{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004434 static PyObject *index_str;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004435 return call_method(self, "__index__", &index_str, "()");
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004436}
4437
4438
Guido van Rossumdc91b992001-08-08 22:26:22 +00004439SLOT0(slot_nb_invert, "__invert__")
4440SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
4441SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
4442SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
4443SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
4444SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004445
4446static int
4447slot_nb_coerce(PyObject **a, PyObject **b)
4448{
4449 static PyObject *coerce_str;
4450 PyObject *self = *a, *other = *b;
4451
4452 if (self->ob_type->tp_as_number != NULL &&
4453 self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4454 PyObject *r;
4455 r = call_maybe(
4456 self, "__coerce__", &coerce_str, "(O)", other);
4457 if (r == NULL)
4458 return -1;
4459 if (r == Py_NotImplemented) {
4460 Py_DECREF(r);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004461 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004462 else {
4463 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4464 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004465 "__coerce__ didn't return a 2-tuple");
Guido van Rossum55f20992001-10-01 17:18:22 +00004466 Py_DECREF(r);
4467 return -1;
4468 }
4469 *a = PyTuple_GET_ITEM(r, 0);
4470 Py_INCREF(*a);
4471 *b = PyTuple_GET_ITEM(r, 1);
4472 Py_INCREF(*b);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004473 Py_DECREF(r);
Guido van Rossum55f20992001-10-01 17:18:22 +00004474 return 0;
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004475 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004476 }
4477 if (other->ob_type->tp_as_number != NULL &&
4478 other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4479 PyObject *r;
4480 r = call_maybe(
4481 other, "__coerce__", &coerce_str, "(O)", self);
4482 if (r == NULL)
4483 return -1;
4484 if (r == Py_NotImplemented) {
4485 Py_DECREF(r);
4486 return 1;
4487 }
4488 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4489 PyErr_SetString(PyExc_TypeError,
4490 "__coerce__ didn't return a 2-tuple");
4491 Py_DECREF(r);
4492 return -1;
4493 }
4494 *a = PyTuple_GET_ITEM(r, 1);
4495 Py_INCREF(*a);
4496 *b = PyTuple_GET_ITEM(r, 0);
4497 Py_INCREF(*b);
4498 Py_DECREF(r);
4499 return 0;
4500 }
4501 return 1;
4502}
4503
Guido van Rossumdc91b992001-08-08 22:26:22 +00004504SLOT0(slot_nb_int, "__int__")
4505SLOT0(slot_nb_long, "__long__")
4506SLOT0(slot_nb_float, "__float__")
4507SLOT0(slot_nb_oct, "__oct__")
4508SLOT0(slot_nb_hex, "__hex__")
4509SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
4510SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
4511SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
4512SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
4513SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
Martin v. Löwisfd963262007-02-09 12:19:32 +00004514/* Can't use SLOT1 here, because nb_inplace_power is ternary */
4515static PyObject *
4516slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
4517{
4518 static PyObject *cache_str;
4519 return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
4520}
Guido van Rossumdc91b992001-08-08 22:26:22 +00004521SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
4522SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
4523SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
4524SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
4525SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
4526SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
4527 "__floordiv__", "__rfloordiv__")
4528SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
4529SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
4530SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004531
4532static int
Guido van Rossumb8f63662001-08-15 23:57:02 +00004533half_compare(PyObject *self, PyObject *other)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004534{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004535 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004536 static PyObject *cmp_str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004537 Py_ssize_t c;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004538
Guido van Rossum60718732001-08-28 17:47:51 +00004539 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004540 if (func == NULL) {
4541 PyErr_Clear();
4542 }
4543 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004544 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004545 if (args == NULL)
4546 res = NULL;
4547 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004548 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004549 Py_DECREF(args);
4550 }
Raymond Hettingerab5dae32002-06-24 13:08:16 +00004551 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004552 if (res != Py_NotImplemented) {
4553 if (res == NULL)
4554 return -2;
4555 c = PyInt_AsLong(res);
4556 Py_DECREF(res);
4557 if (c == -1 && PyErr_Occurred())
4558 return -2;
4559 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
4560 }
4561 Py_DECREF(res);
4562 }
4563 return 2;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004564}
4565
Guido van Rossumab3b0342001-09-18 20:38:53 +00004566/* This slot is published for the benefit of try_3way_compare in object.c */
4567int
4568_PyObject_SlotCompare(PyObject *self, PyObject *other)
Guido van Rossumb8f63662001-08-15 23:57:02 +00004569{
4570 int c;
4571
Guido van Rossumab3b0342001-09-18 20:38:53 +00004572 if (self->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004573 c = half_compare(self, other);
4574 if (c <= 1)
4575 return c;
4576 }
Guido van Rossumab3b0342001-09-18 20:38:53 +00004577 if (other->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004578 c = half_compare(other, self);
4579 if (c < -1)
4580 return -2;
4581 if (c <= 1)
4582 return -c;
4583 }
4584 return (void *)self < (void *)other ? -1 :
4585 (void *)self > (void *)other ? 1 : 0;
4586}
4587
4588static PyObject *
4589slot_tp_repr(PyObject *self)
4590{
4591 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004592 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004593
Guido van Rossum60718732001-08-28 17:47:51 +00004594 func = lookup_method(self, "__repr__", &repr_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004595 if (func != NULL) {
4596 res = PyEval_CallObject(func, NULL);
4597 Py_DECREF(func);
4598 return res;
4599 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00004600 PyErr_Clear();
4601 return PyString_FromFormat("<%s object at %p>",
4602 self->ob_type->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004603}
4604
4605static PyObject *
4606slot_tp_str(PyObject *self)
4607{
4608 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004609 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004610
Guido van Rossum60718732001-08-28 17:47:51 +00004611 func = lookup_method(self, "__str__", &str_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004612 if (func != NULL) {
4613 res = PyEval_CallObject(func, NULL);
4614 Py_DECREF(func);
4615 return res;
4616 }
4617 else {
4618 PyErr_Clear();
4619 return slot_tp_repr(self);
4620 }
4621}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004622
4623static long
4624slot_tp_hash(PyObject *self)
4625{
Tim Peters61ce0a92002-12-06 23:38:02 +00004626 PyObject *func;
Guido van Rossum60718732001-08-28 17:47:51 +00004627 static PyObject *hash_str, *eq_str, *cmp_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004628 long h;
4629
Guido van Rossum60718732001-08-28 17:47:51 +00004630 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004631
4632 if (func != NULL) {
Tim Peters61ce0a92002-12-06 23:38:02 +00004633 PyObject *res = PyEval_CallObject(func, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004634 Py_DECREF(func);
4635 if (res == NULL)
4636 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +00004637 if (PyLong_Check(res))
Armin Rigo51fc8c42006-08-09 14:55:26 +00004638 h = PyLong_Type.tp_hash(res);
Martin v. Löwisab2f8f72006-08-09 07:57:39 +00004639 else
4640 h = PyInt_AsLong(res);
Tim Peters61ce0a92002-12-06 23:38:02 +00004641 Py_DECREF(res);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004642 }
4643 else {
4644 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004645 func = lookup_method(self, "__eq__", &eq_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004646 if (func == NULL) {
4647 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004648 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004649 }
4650 if (func != NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00004651 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
4652 self->ob_type->tp_name);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004653 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004654 return -1;
4655 }
4656 PyErr_Clear();
4657 h = _Py_HashPointer((void *)self);
4658 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004659 if (h == -1 && !PyErr_Occurred())
4660 h = -2;
4661 return h;
4662}
4663
4664static PyObject *
4665slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
4666{
Guido van Rossum60718732001-08-28 17:47:51 +00004667 static PyObject *call_str;
4668 PyObject *meth = lookup_method(self, "__call__", &call_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004669 PyObject *res;
4670
4671 if (meth == NULL)
4672 return NULL;
Armin Rigo53c1692f2006-06-21 21:58:50 +00004673
4674 /* PyObject_Call() will end up calling slot_tp_call() again if
4675 the object returned for __call__ has __call__ itself defined
4676 upon it. This can be an infinite recursion if you set
4677 __call__ in a class to an instance of it. */
Neal Norwitzb1149842006-06-23 03:32:44 +00004678 if (Py_EnterRecursiveCall(" in __call__")) {
4679 Py_DECREF(meth);
Armin Rigo53c1692f2006-06-21 21:58:50 +00004680 return NULL;
Neal Norwitzb1149842006-06-23 03:32:44 +00004681 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004682 res = PyObject_Call(meth, args, kwds);
Armin Rigo53c1692f2006-06-21 21:58:50 +00004683 Py_LeaveRecursiveCall();
4684
Tim Peters6d6c1a32001-08-02 04:15:00 +00004685 Py_DECREF(meth);
4686 return res;
4687}
4688
Guido van Rossum14a6f832001-10-17 13:59:09 +00004689/* There are two slot dispatch functions for tp_getattro.
4690
4691 - slot_tp_getattro() is used when __getattribute__ is overridden
4692 but no __getattr__ hook is present;
4693
4694 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
4695
Guido van Rossumc334df52002-04-04 23:44:47 +00004696 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
4697 detects the absence of __getattr__ and then installs the simpler slot if
4698 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00004699
Tim Peters6d6c1a32001-08-02 04:15:00 +00004700static PyObject *
4701slot_tp_getattro(PyObject *self, PyObject *name)
4702{
Guido van Rossum14a6f832001-10-17 13:59:09 +00004703 static PyObject *getattribute_str = NULL;
4704 return call_method(self, "__getattribute__", &getattribute_str,
4705 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004706}
4707
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004708static PyObject *
4709slot_tp_getattr_hook(PyObject *self, PyObject *name)
4710{
4711 PyTypeObject *tp = self->ob_type;
4712 PyObject *getattr, *getattribute, *res;
4713 static PyObject *getattribute_str = NULL;
4714 static PyObject *getattr_str = NULL;
4715
4716 if (getattr_str == NULL) {
4717 getattr_str = PyString_InternFromString("__getattr__");
4718 if (getattr_str == NULL)
4719 return NULL;
4720 }
4721 if (getattribute_str == NULL) {
4722 getattribute_str =
4723 PyString_InternFromString("__getattribute__");
4724 if (getattribute_str == NULL)
4725 return NULL;
4726 }
4727 getattr = _PyType_Lookup(tp, getattr_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004728 if (getattr == NULL) {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004729 /* No __getattr__ hook: use a simpler dispatcher */
4730 tp->tp_getattro = slot_tp_getattro;
4731 return slot_tp_getattro(self, name);
4732 }
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004733 getattribute = _PyType_Lookup(tp, getattribute_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004734 if (getattribute == NULL ||
4735 (getattribute->ob_type == &PyWrapperDescr_Type &&
4736 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
4737 (void *)PyObject_GenericGetAttr))
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004738 res = PyObject_GenericGetAttr(self, name);
4739 else
Georg Brandl684fd0c2006-05-25 19:15:31 +00004740 res = PyObject_CallFunctionObjArgs(getattribute, self, name, NULL);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004741 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004742 PyErr_Clear();
Georg Brandl684fd0c2006-05-25 19:15:31 +00004743 res = PyObject_CallFunctionObjArgs(getattr, self, name, NULL);
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004744 }
4745 return res;
4746}
4747
Tim Peters6d6c1a32001-08-02 04:15:00 +00004748static int
4749slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
4750{
4751 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004752 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004753
4754 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004755 res = call_method(self, "__delattr__", &delattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004756 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004757 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004758 res = call_method(self, "__setattr__", &setattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004759 "(OO)", name, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004760 if (res == NULL)
4761 return -1;
4762 Py_DECREF(res);
4763 return 0;
4764}
4765
4766/* Map rich comparison operators to their __xx__ namesakes */
4767static char *name_op[] = {
4768 "__lt__",
4769 "__le__",
4770 "__eq__",
4771 "__ne__",
4772 "__gt__",
4773 "__ge__",
4774};
4775
4776static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00004777half_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004778{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004779 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004780 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00004781
Guido van Rossum60718732001-08-28 17:47:51 +00004782 func = lookup_method(self, name_op[op], &op_str[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004783 if (func == NULL) {
4784 PyErr_Clear();
4785 Py_INCREF(Py_NotImplemented);
4786 return Py_NotImplemented;
4787 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004788 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004789 if (args == NULL)
4790 res = NULL;
4791 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004792 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004793 Py_DECREF(args);
4794 }
4795 Py_DECREF(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004796 return res;
4797}
4798
Guido van Rossumb8f63662001-08-15 23:57:02 +00004799static PyObject *
4800slot_tp_richcompare(PyObject *self, PyObject *other, int op)
4801{
4802 PyObject *res;
4803
4804 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
4805 res = half_richcompare(self, other, op);
4806 if (res != Py_NotImplemented)
4807 return res;
4808 Py_DECREF(res);
4809 }
4810 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
Tim Petersf4aca752004-09-23 02:39:37 +00004811 res = half_richcompare(other, self, _Py_SwappedOp[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004812 if (res != Py_NotImplemented) {
4813 return res;
4814 }
4815 Py_DECREF(res);
4816 }
4817 Py_INCREF(Py_NotImplemented);
4818 return Py_NotImplemented;
4819}
4820
4821static PyObject *
4822slot_tp_iter(PyObject *self)
4823{
4824 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004825 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004826
Guido van Rossum60718732001-08-28 17:47:51 +00004827 func = lookup_method(self, "__iter__", &iter_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004828 if (func != NULL) {
Guido van Rossum84b2bed2002-08-16 17:01:09 +00004829 PyObject *args;
4830 args = res = PyTuple_New(0);
4831 if (args != NULL) {
4832 res = PyObject_Call(func, args, NULL);
4833 Py_DECREF(args);
4834 }
4835 Py_DECREF(func);
4836 return res;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004837 }
4838 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004839 func = lookup_method(self, "__getitem__", &getitem_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004840 if (func == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00004841 PyErr_Format(PyExc_TypeError,
4842 "'%.200s' object is not iterable",
4843 self->ob_type->tp_name);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004844 return NULL;
4845 }
4846 Py_DECREF(func);
4847 return PySeqIter_New(self);
4848}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004849
4850static PyObject *
4851slot_tp_iternext(PyObject *self)
4852{
Guido van Rossum2730b132001-08-28 18:22:14 +00004853 static PyObject *next_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004854 return call_method(self, "next", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00004855}
4856
Guido van Rossum1a493502001-08-17 16:47:50 +00004857static PyObject *
4858slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
4859{
4860 PyTypeObject *tp = self->ob_type;
4861 PyObject *get;
4862 static PyObject *get_str = NULL;
4863
4864 if (get_str == NULL) {
4865 get_str = PyString_InternFromString("__get__");
4866 if (get_str == NULL)
4867 return NULL;
4868 }
4869 get = _PyType_Lookup(tp, get_str);
4870 if (get == NULL) {
4871 /* Avoid further slowdowns */
4872 if (tp->tp_descr_get == slot_tp_descr_get)
4873 tp->tp_descr_get = NULL;
4874 Py_INCREF(self);
4875 return self;
4876 }
Guido van Rossum2c252392001-08-24 10:13:31 +00004877 if (obj == NULL)
4878 obj = Py_None;
4879 if (type == NULL)
4880 type = Py_None;
Georg Brandl684fd0c2006-05-25 19:15:31 +00004881 return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
Guido van Rossum1a493502001-08-17 16:47:50 +00004882}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004883
4884static int
4885slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
4886{
Guido van Rossum2c252392001-08-24 10:13:31 +00004887 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004888 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00004889
4890 if (value == NULL)
Guido van Rossum1d5b3f22001-12-03 00:08:33 +00004891 res = call_method(self, "__delete__", &del_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004892 "(O)", target);
Guido van Rossum2c252392001-08-24 10:13:31 +00004893 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004894 res = call_method(self, "__set__", &set_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004895 "(OO)", target, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004896 if (res == NULL)
4897 return -1;
4898 Py_DECREF(res);
4899 return 0;
4900}
4901
4902static int
4903slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
4904{
Guido van Rossum60718732001-08-28 17:47:51 +00004905 static PyObject *init_str;
4906 PyObject *meth = lookup_method(self, "__init__", &init_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004907 PyObject *res;
4908
4909 if (meth == NULL)
4910 return -1;
4911 res = PyObject_Call(meth, args, kwds);
4912 Py_DECREF(meth);
4913 if (res == NULL)
4914 return -1;
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004915 if (res != Py_None) {
Georg Brandlccff7852006-06-18 22:17:29 +00004916 PyErr_Format(PyExc_TypeError,
4917 "__init__() should return None, not '%.200s'",
4918 res->ob_type->tp_name);
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004919 Py_DECREF(res);
4920 return -1;
4921 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004922 Py_DECREF(res);
4923 return 0;
4924}
4925
4926static PyObject *
4927slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4928{
Guido van Rossum7bed2132002-08-08 21:57:53 +00004929 static PyObject *new_str;
4930 PyObject *func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004931 PyObject *newargs, *x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004932 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004933
Guido van Rossum7bed2132002-08-08 21:57:53 +00004934 if (new_str == NULL) {
4935 new_str = PyString_InternFromString("__new__");
4936 if (new_str == NULL)
4937 return NULL;
4938 }
4939 func = PyObject_GetAttr((PyObject *)type, new_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004940 if (func == NULL)
4941 return NULL;
4942 assert(PyTuple_Check(args));
4943 n = PyTuple_GET_SIZE(args);
4944 newargs = PyTuple_New(n+1);
4945 if (newargs == NULL)
4946 return NULL;
4947 Py_INCREF(type);
4948 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
4949 for (i = 0; i < n; i++) {
4950 x = PyTuple_GET_ITEM(args, i);
4951 Py_INCREF(x);
4952 PyTuple_SET_ITEM(newargs, i+1, x);
4953 }
4954 x = PyObject_Call(func, newargs, kwds);
Guido van Rossum25d18072001-10-01 15:55:28 +00004955 Py_DECREF(newargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004956 Py_DECREF(func);
4957 return x;
4958}
4959
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004960static void
4961slot_tp_del(PyObject *self)
4962{
4963 static PyObject *del_str = NULL;
4964 PyObject *del, *res;
4965 PyObject *error_type, *error_value, *error_traceback;
4966
4967 /* Temporarily resurrect the object. */
4968 assert(self->ob_refcnt == 0);
4969 self->ob_refcnt = 1;
4970
4971 /* Save the current exception, if any. */
4972 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4973
4974 /* Execute __del__ method, if any. */
4975 del = lookup_maybe(self, "__del__", &del_str);
4976 if (del != NULL) {
4977 res = PyEval_CallObject(del, NULL);
4978 if (res == NULL)
4979 PyErr_WriteUnraisable(del);
4980 else
4981 Py_DECREF(res);
4982 Py_DECREF(del);
4983 }
4984
4985 /* Restore the saved exception. */
4986 PyErr_Restore(error_type, error_value, error_traceback);
4987
4988 /* Undo the temporary resurrection; can't use DECREF here, it would
4989 * cause a recursive call.
4990 */
4991 assert(self->ob_refcnt > 0);
4992 if (--self->ob_refcnt == 0)
4993 return; /* this is the normal path out */
4994
4995 /* __del__ resurrected it! Make it look like the original Py_DECREF
4996 * never happened.
4997 */
4998 {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004999 Py_ssize_t refcnt = self->ob_refcnt;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005000 _Py_NewReference(self);
5001 self->ob_refcnt = refcnt;
5002 }
5003 assert(!PyType_IS_GC(self->ob_type) ||
5004 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +00005005 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
5006 * we need to undo that. */
5007 _Py_DEC_REFTOTAL;
5008 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
5009 * chain, so no more to do there.
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005010 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
5011 * _Py_NewReference bumped tp_allocs: both of those need to be
5012 * undone.
5013 */
5014#ifdef COUNT_ALLOCS
5015 --self->ob_type->tp_frees;
5016 --self->ob_type->tp_allocs;
5017#endif
5018}
5019
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005020
5021/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
Tim Petersbf9b2442003-03-23 05:35:36 +00005022 functions. The offsets here are relative to the 'PyHeapTypeObject'
Guido van Rossume5c691a2003-03-07 15:13:17 +00005023 structure, which incorporates the additional structures used for numbers,
5024 sequences and mappings.
5025 Note that multiple names may map to the same slot (e.g. __eq__,
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005026 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00005027 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
5028 terminated with an all-zero entry. (This table is further initialized and
5029 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005030
Guido van Rossum6d204072001-10-21 00:44:31 +00005031typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005032
5033#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00005034#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005035#undef ETSLOT
5036#undef SQSLOT
5037#undef MPSLOT
5038#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00005039#undef UNSLOT
5040#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005041#undef BINSLOT
5042#undef RBINSLOT
5043
Guido van Rossum6d204072001-10-21 00:44:31 +00005044#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005045 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5046 PyDoc_STR(DOC)}
Guido van Rossumc8e56452001-10-22 00:43:43 +00005047#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
5048 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005049 PyDoc_STR(DOC), FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00005050#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Guido van Rossume5c691a2003-03-07 15:13:17 +00005051 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005052 PyDoc_STR(DOC)}
Guido van Rossum6d204072001-10-21 00:44:31 +00005053#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5054 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
5055#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5056 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
5057#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5058 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
5059#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5060 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5061 "x." NAME "() <==> " DOC)
5062#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5063 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5064 "x." NAME "(y) <==> x" DOC "y")
5065#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
5066 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5067 "x." NAME "(y) <==> x" DOC "y")
5068#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
5069 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5070 "x." NAME "(y) <==> y" DOC "x")
Anthony Baxter56616992005-06-03 14:12:21 +00005071#define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5072 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5073 "x." NAME "(y) <==> " DOC)
5074#define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5075 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5076 "x." NAME "(y) <==> " DOC)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005077
5078static slotdef slotdefs[] = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00005079 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005080 "x.__len__() <==> len(x)"),
Armin Rigofd163f92005-12-29 15:59:19 +00005081 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
5082 The logic in abstract.c always falls back to nb_add/nb_multiply in
5083 this case. Defining both the nb_* and the sq_* slots to call the
5084 user-defined methods has unexpected side-effects, as shown by
5085 test_descr.notimplemented() */
5086 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005087 "x.__add__(y) <==> x+y"),
Armin Rigo314861c2006-03-30 14:04:02 +00005088 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005089 "x.__mul__(n) <==> x*n"),
Armin Rigo314861c2006-03-30 14:04:02 +00005090 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005091 "x.__rmul__(n) <==> n*x"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005092 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
5093 "x.__getitem__(y) <==> x[y]"),
Martin v. Löwis18e16552006-02-15 17:27:45 +00005094 SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_ssizessizeargfunc,
Brett Cannon154da9b2003-05-20 02:30:04 +00005095 "x.__getslice__(i, j) <==> x[i:j]\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005096 \n\
5097 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005098 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005099 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005100 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005101 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005102 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
Martin v. Löwis18e16552006-02-15 17:27:45 +00005103 wrap_ssizessizeobjargproc,
Brett Cannonbe67d872003-05-20 02:40:12 +00005104 "x.__setslice__(i, j, y) <==> x[i:j]=y\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005105 \n\
5106 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005107 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
Brett Cannonbe67d872003-05-20 02:40:12 +00005108 "x.__delslice__(i, j) <==> del x[i:j]\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005109 \n\
5110 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005111 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
5112 "x.__contains__(y) <==> y in x"),
Armin Rigofd163f92005-12-29 15:59:19 +00005113 SQSLOT("__iadd__", sq_inplace_concat, NULL,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005114 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
Armin Rigofd163f92005-12-29 15:59:19 +00005115 SQSLOT("__imul__", sq_inplace_repeat, NULL,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005116 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005117
Martin v. Löwis18e16552006-02-15 17:27:45 +00005118 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005119 "x.__len__() <==> len(x)"),
Guido van Rossumfd38f8e2001-10-09 20:17:57 +00005120 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005121 wrap_binaryfunc,
5122 "x.__getitem__(y) <==> x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005123 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005124 wrap_objobjargproc,
5125 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005126 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005127 wrap_delitem,
5128 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005129
Guido van Rossum6d204072001-10-21 00:44:31 +00005130 BINSLOT("__add__", nb_add, slot_nb_add,
5131 "+"),
5132 RBINSLOT("__radd__", nb_add, slot_nb_add,
5133 "+"),
5134 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
5135 "-"),
5136 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
5137 "-"),
5138 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
5139 "*"),
5140 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
5141 "*"),
5142 BINSLOT("__div__", nb_divide, slot_nb_divide,
5143 "/"),
5144 RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
5145 "/"),
5146 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
5147 "%"),
5148 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
5149 "%"),
Anthony Baxter56616992005-06-03 14:12:21 +00005150 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005151 "divmod(x, y)"),
Anthony Baxter56616992005-06-03 14:12:21 +00005152 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005153 "divmod(y, x)"),
5154 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
5155 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
5156 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
5157 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
5158 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
5159 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
5160 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
5161 "abs(x)"),
Raymond Hettingerf34f2642003-10-11 17:29:04 +00005162 UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquirypred,
Guido van Rossum6d204072001-10-21 00:44:31 +00005163 "x != 0"),
5164 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
5165 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
5166 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
5167 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
5168 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
5169 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
5170 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
5171 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
5172 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
5173 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
5174 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
5175 NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
5176 "x.__coerce__(y) <==> coerce(x, y)"),
5177 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
5178 "int(x)"),
5179 UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
5180 "long(x)"),
5181 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
5182 "float(x)"),
5183 UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
5184 "oct(x)"),
5185 UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
5186 "hex(x)"),
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00005187 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005188 "x[y:z] <==> x[y.__index__():z.__index__()]"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005189 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
5190 wrap_binaryfunc, "+"),
5191 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
5192 wrap_binaryfunc, "-"),
5193 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
5194 wrap_binaryfunc, "*"),
5195 IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
5196 wrap_binaryfunc, "/"),
5197 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
5198 wrap_binaryfunc, "%"),
5199 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
Guido van Rossum6e5680f2002-10-15 01:01:53 +00005200 wrap_binaryfunc, "**"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005201 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
5202 wrap_binaryfunc, "<<"),
5203 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
5204 wrap_binaryfunc, ">>"),
5205 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
5206 wrap_binaryfunc, "&"),
5207 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
5208 wrap_binaryfunc, "^"),
5209 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
5210 wrap_binaryfunc, "|"),
5211 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5212 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5213 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
5214 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
5215 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
5216 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
5217 IBSLOT("__itruediv__", nb_inplace_true_divide,
5218 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005219
Guido van Rossum6d204072001-10-21 00:44:31 +00005220 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
5221 "x.__str__() <==> str(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005222 TPSLOT("__str__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005223 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
5224 "x.__repr__() <==> repr(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005225 TPSLOT("__repr__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005226 TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
5227 "x.__cmp__(y) <==> cmp(x,y)"),
5228 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
5229 "x.__hash__() <==> hash(x)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005230 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
5231 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005232 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
Guido van Rossum6d204072001-10-21 00:44:31 +00005233 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
5234 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
5235 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
5236 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
5237 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
5238 "x.__setattr__('name', value) <==> x.name = value"),
5239 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
5240 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
5241 "x.__delattr__('name') <==> del x.name"),
5242 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
5243 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
5244 "x.__lt__(y) <==> x<y"),
5245 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
5246 "x.__le__(y) <==> x<=y"),
5247 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
5248 "x.__eq__(y) <==> x==y"),
5249 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
5250 "x.__ne__(y) <==> x!=y"),
5251 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
5252 "x.__gt__(y) <==> x>y"),
5253 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
5254 "x.__ge__(y) <==> x>=y"),
5255 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
5256 "x.__iter__() <==> iter(x)"),
5257 TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
5258 "x.next() -> the next value, or raise StopIteration"),
5259 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
5260 "descr.__get__(obj[, type]) -> value"),
5261 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
5262 "descr.__set__(obj, value)"),
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00005263 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
5264 wrap_descr_delete, "descr.__delete__(obj)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005265 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
Guido van Rossum6d204072001-10-21 00:44:31 +00005266 "x.__init__(...) initializes x; "
Guido van Rossumc8e56452001-10-22 00:43:43 +00005267 "see x.__class__.__doc__ for signature",
5268 PyWrapperFlag_KEYWORDS),
5269 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005270 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005271 {NULL}
5272};
5273
Guido van Rossumc334df52002-04-04 23:44:47 +00005274/* Given a type pointer and an offset gotten from a slotdef entry, return a
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005275 pointer to the actual slot. This is not quite the same as simply adding
Guido van Rossumc334df52002-04-04 23:44:47 +00005276 the offset to the type pointer, since it takes care to indirect through the
5277 proper indirection pointer (as_buffer, etc.); it returns NULL if the
5278 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005279static void **
Martin v. Löwis18e16552006-02-15 17:27:45 +00005280slotptr(PyTypeObject *type, int ioffset)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005281{
5282 char *ptr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005283 long offset = ioffset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005284
Guido van Rossume5c691a2003-03-07 15:13:17 +00005285 /* Note: this depends on the order of the members of PyHeapTypeObject! */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005286 assert(offset >= 0);
Skip Montanaro429433b2006-04-18 00:35:43 +00005287 assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
5288 if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005289 ptr = (char *)type->tp_as_sequence;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005290 offset -= offsetof(PyHeapTypeObject, as_sequence);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005291 }
Skip Montanaro429433b2006-04-18 00:35:43 +00005292 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005293 ptr = (char *)type->tp_as_mapping;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005294 offset -= offsetof(PyHeapTypeObject, as_mapping);
Guido van Rossum09638c12002-06-13 19:17:46 +00005295 }
Skip Montanaro429433b2006-04-18 00:35:43 +00005296 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005297 ptr = (char *)type->tp_as_number;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005298 offset -= offsetof(PyHeapTypeObject, as_number);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005299 }
5300 else {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005301 ptr = (char *)type;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005302 }
5303 if (ptr != NULL)
5304 ptr += offset;
5305 return (void **)ptr;
5306}
Guido van Rossumf040ede2001-08-07 16:40:56 +00005307
Guido van Rossumc334df52002-04-04 23:44:47 +00005308/* Length of array of slotdef pointers used to store slots with the
5309 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
5310 the same __name__, for any __name__. Since that's a static property, it is
5311 appropriate to declare fixed-size arrays for this. */
5312#define MAX_EQUIV 10
5313
5314/* Return a slot pointer for a given name, but ONLY if the attribute has
5315 exactly one slot function. The name must be an interned string. */
5316static void **
5317resolve_slotdups(PyTypeObject *type, PyObject *name)
5318{
5319 /* XXX Maybe this could be optimized more -- but is it worth it? */
5320
5321 /* pname and ptrs act as a little cache */
5322 static PyObject *pname;
5323 static slotdef *ptrs[MAX_EQUIV];
5324 slotdef *p, **pp;
5325 void **res, **ptr;
5326
5327 if (pname != name) {
5328 /* Collect all slotdefs that match name into ptrs. */
5329 pname = name;
5330 pp = ptrs;
5331 for (p = slotdefs; p->name_strobj; p++) {
5332 if (p->name_strobj == name)
5333 *pp++ = p;
5334 }
5335 *pp = NULL;
5336 }
5337
5338 /* Look in all matching slots of the type; if exactly one of these has
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005339 a filled-in slot, return its value. Otherwise return NULL. */
Guido van Rossumc334df52002-04-04 23:44:47 +00005340 res = NULL;
5341 for (pp = ptrs; *pp; pp++) {
5342 ptr = slotptr(type, (*pp)->offset);
5343 if (ptr == NULL || *ptr == NULL)
5344 continue;
5345 if (res != NULL)
5346 return NULL;
5347 res = ptr;
5348 }
5349 return res;
5350}
5351
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005352/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This
Guido van Rossumc334df52002-04-04 23:44:47 +00005353 does some incredibly complex thinking and then sticks something into the
5354 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
5355 interests, and then stores a generic wrapper or a specific function into
5356 the slot.) Return a pointer to the next slotdef with a different offset,
5357 because that's convenient for fixup_slot_dispatchers(). */
5358static slotdef *
5359update_one_slot(PyTypeObject *type, slotdef *p)
5360{
5361 PyObject *descr;
5362 PyWrapperDescrObject *d;
5363 void *generic = NULL, *specific = NULL;
5364 int use_generic = 0;
5365 int offset = p->offset;
5366 void **ptr = slotptr(type, offset);
5367
5368 if (ptr == NULL) {
5369 do {
5370 ++p;
5371 } while (p->offset == offset);
5372 return p;
5373 }
5374 do {
5375 descr = _PyType_Lookup(type, p->name_strobj);
5376 if (descr == NULL)
5377 continue;
5378 if (descr->ob_type == &PyWrapperDescr_Type) {
5379 void **tptr = resolve_slotdups(type, p->name_strobj);
5380 if (tptr == NULL || tptr == ptr)
5381 generic = p->function;
5382 d = (PyWrapperDescrObject *)descr;
5383 if (d->d_base->wrapper == p->wrapper &&
5384 PyType_IsSubtype(type, d->d_type))
5385 {
5386 if (specific == NULL ||
5387 specific == d->d_wrapped)
5388 specific = d->d_wrapped;
5389 else
5390 use_generic = 1;
5391 }
5392 }
Guido van Rossum721f62e2002-08-09 02:14:34 +00005393 else if (descr->ob_type == &PyCFunction_Type &&
5394 PyCFunction_GET_FUNCTION(descr) ==
5395 (PyCFunction)tp_new_wrapper &&
5396 strcmp(p->name, "__new__") == 0)
5397 {
5398 /* The __new__ wrapper is not a wrapper descriptor,
5399 so must be special-cased differently.
5400 If we don't do this, creating an instance will
5401 always use slot_tp_new which will look up
5402 __new__ in the MRO which will call tp_new_wrapper
5403 which will look through the base classes looking
5404 for a static base and call its tp_new (usually
5405 PyType_GenericNew), after performing various
5406 sanity checks and constructing a new argument
5407 list. Cut all that nonsense short -- this speeds
5408 up instance creation tremendously. */
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005409 specific = (void *)type->tp_new;
Guido van Rossum721f62e2002-08-09 02:14:34 +00005410 /* XXX I'm not 100% sure that there isn't a hole
5411 in this reasoning that requires additional
5412 sanity checks. I'll buy the first person to
5413 point out a bug in this reasoning a beer. */
5414 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005415 else {
5416 use_generic = 1;
5417 generic = p->function;
5418 }
5419 } while ((++p)->offset == offset);
5420 if (specific && !use_generic)
5421 *ptr = specific;
5422 else
5423 *ptr = generic;
5424 return p;
5425}
5426
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005427/* In the type, update the slots whose slotdefs are gathered in the pp array.
5428 This is a callback for update_subclasses(). */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005429static int
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005430update_slots_callback(PyTypeObject *type, void *data)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005431{
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005432 slotdef **pp = (slotdef **)data;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005433
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005434 for (; *pp; pp++)
Guido van Rossumc334df52002-04-04 23:44:47 +00005435 update_one_slot(type, *pp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005436 return 0;
5437}
5438
Guido van Rossumc334df52002-04-04 23:44:47 +00005439/* Comparison function for qsort() to compare slotdefs by their offset, and
5440 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005441static int
5442slotdef_cmp(const void *aa, const void *bb)
5443{
5444 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
5445 int c = a->offset - b->offset;
5446 if (c != 0)
5447 return c;
5448 else
Martin v. Löwis18e16552006-02-15 17:27:45 +00005449 /* Cannot use a-b, as this gives off_t,
5450 which may lose precision when converted to int. */
5451 return (a > b) ? 1 : (a < b) ? -1 : 0;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005452}
5453
Guido van Rossumc334df52002-04-04 23:44:47 +00005454/* Initialize the slotdefs table by adding interned string objects for the
5455 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005456static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005457init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005458{
5459 slotdef *p;
5460 static int initialized = 0;
5461
5462 if (initialized)
5463 return;
5464 for (p = slotdefs; p->name; p++) {
5465 p->name_strobj = PyString_InternFromString(p->name);
5466 if (!p->name_strobj)
Guido van Rossumc334df52002-04-04 23:44:47 +00005467 Py_FatalError("Out of memory interning slotdef names");
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005468 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005469 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
5470 slotdef_cmp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005471 initialized = 1;
5472}
5473
Guido van Rossumc334df52002-04-04 23:44:47 +00005474/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005475static int
5476update_slot(PyTypeObject *type, PyObject *name)
5477{
Guido van Rossumc334df52002-04-04 23:44:47 +00005478 slotdef *ptrs[MAX_EQUIV];
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005479 slotdef *p;
5480 slotdef **pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005481 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005482
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005483 init_slotdefs();
5484 pp = ptrs;
5485 for (p = slotdefs; p->name; p++) {
5486 /* XXX assume name is interned! */
5487 if (p->name_strobj == name)
5488 *pp++ = p;
5489 }
5490 *pp = NULL;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005491 for (pp = ptrs; *pp; pp++) {
5492 p = *pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005493 offset = p->offset;
5494 while (p > slotdefs && (p-1)->offset == offset)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005495 --p;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005496 *pp = p;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005497 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005498 if (ptrs[0] == NULL)
5499 return 0; /* Not an attribute that affects any slots */
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005500 return update_subclasses(type, name,
5501 update_slots_callback, (void *)ptrs);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005502}
5503
Guido van Rossumc334df52002-04-04 23:44:47 +00005504/* Store the proper functions in the slot dispatches at class (type)
5505 definition time, based upon which operations the class overrides in its
5506 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00005507static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005508fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005509{
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005510 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005511
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005512 init_slotdefs();
Guido van Rossumc334df52002-04-04 23:44:47 +00005513 for (p = slotdefs; p->name; )
5514 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00005515}
Guido van Rossum705f0f52001-08-24 16:47:00 +00005516
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005517static void
5518update_all_slots(PyTypeObject* type)
5519{
5520 slotdef *p;
5521
5522 init_slotdefs();
5523 for (p = slotdefs; p->name; p++) {
5524 /* update_slot returns int but can't actually fail */
5525 update_slot(type, p->name_strobj);
5526 }
5527}
5528
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005529/* recurse_down_subclasses() and update_subclasses() are mutually
5530 recursive functions to call a callback for all subclasses,
5531 but refraining from recursing into subclasses that define 'name'. */
5532
5533static int
5534update_subclasses(PyTypeObject *type, PyObject *name,
5535 update_callback callback, void *data)
5536{
5537 if (callback(type, data) < 0)
5538 return -1;
5539 return recurse_down_subclasses(type, name, callback, data);
5540}
5541
5542static int
5543recurse_down_subclasses(PyTypeObject *type, PyObject *name,
5544 update_callback callback, void *data)
5545{
5546 PyTypeObject *subclass;
5547 PyObject *ref, *subclasses, *dict;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005548 Py_ssize_t i, n;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005549
5550 subclasses = type->tp_subclasses;
5551 if (subclasses == NULL)
5552 return 0;
5553 assert(PyList_Check(subclasses));
5554 n = PyList_GET_SIZE(subclasses);
5555 for (i = 0; i < n; i++) {
5556 ref = PyList_GET_ITEM(subclasses, i);
5557 assert(PyWeakref_CheckRef(ref));
5558 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
5559 assert(subclass != NULL);
5560 if ((PyObject *)subclass == Py_None)
5561 continue;
5562 assert(PyType_Check(subclass));
5563 /* Avoid recursing down into unaffected classes */
5564 dict = subclass->tp_dict;
5565 if (dict != NULL && PyDict_Check(dict) &&
5566 PyDict_GetItem(dict, name) != NULL)
5567 continue;
5568 if (update_subclasses(subclass, name, callback, data) < 0)
5569 return -1;
5570 }
5571 return 0;
5572}
5573
Guido van Rossum6d204072001-10-21 00:44:31 +00005574/* This function is called by PyType_Ready() to populate the type's
5575 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00005576 function slot (like tp_repr) that's defined in the type, one or more
5577 corresponding descriptors are added in the type's tp_dict dictionary
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005578 under the appropriate name (like __repr__). Some function slots
Guido van Rossum09638c12002-06-13 19:17:46 +00005579 cause more than one descriptor to be added (for example, the nb_add
5580 slot adds both __add__ and __radd__ descriptors) and some function
5581 slots compete for the same descriptor (for example both sq_item and
5582 mp_subscript generate a __getitem__ descriptor).
5583
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005584 In the latter case, the first slotdef entry encoutered wins. Since
Tim Petersbf9b2442003-03-23 05:35:36 +00005585 slotdef entries are sorted by the offset of the slot in the
Guido van Rossume5c691a2003-03-07 15:13:17 +00005586 PyHeapTypeObject, this gives us some control over disambiguating
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005587 between competing slots: the members of PyHeapTypeObject are listed
5588 from most general to least general, so the most general slot is
5589 preferred. In particular, because as_mapping comes before as_sequence,
5590 for a type that defines both mp_subscript and sq_item, mp_subscript
5591 wins.
Guido van Rossum09638c12002-06-13 19:17:46 +00005592
5593 This only adds new descriptors and doesn't overwrite entries in
5594 tp_dict that were previously defined. The descriptors contain a
5595 reference to the C function they must call, so that it's safe if they
5596 are copied into a subtype's __dict__ and the subtype has a different
5597 C function in its slot -- calling the method defined by the
5598 descriptor will call the C function that was used to create it,
5599 rather than the C function present in the slot when it is called.
5600 (This is important because a subtype may have a C function in the
5601 slot that calls the method from the dictionary, and we want to avoid
5602 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00005603
5604static int
5605add_operators(PyTypeObject *type)
5606{
5607 PyObject *dict = type->tp_dict;
5608 slotdef *p;
5609 PyObject *descr;
5610 void **ptr;
5611
5612 init_slotdefs();
5613 for (p = slotdefs; p->name; p++) {
5614 if (p->wrapper == NULL)
5615 continue;
5616 ptr = slotptr(type, p->offset);
5617 if (!ptr || !*ptr)
5618 continue;
5619 if (PyDict_GetItem(dict, p->name_strobj))
5620 continue;
5621 descr = PyDescr_NewWrapper(type, p, *ptr);
5622 if (descr == NULL)
5623 return -1;
5624 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
5625 return -1;
5626 Py_DECREF(descr);
5627 }
5628 if (type->tp_new != NULL) {
5629 if (add_tp_new_wrapper(type) < 0)
5630 return -1;
5631 }
5632 return 0;
5633}
5634
Guido van Rossum705f0f52001-08-24 16:47:00 +00005635
5636/* Cooperative 'super' */
5637
5638typedef struct {
5639 PyObject_HEAD
Guido van Rossume705ef12001-08-29 15:47:06 +00005640 PyTypeObject *type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005641 PyObject *obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005642 PyTypeObject *obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005643} superobject;
5644
Guido van Rossum6f799372001-09-20 20:46:19 +00005645static PyMemberDef super_members[] = {
5646 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
5647 "the class invoking super()"},
5648 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
5649 "the instance invoking super(); may be None"},
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005650 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00005651 "the type of the instance invoking super(); may be None"},
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005652 {0}
5653};
5654
Guido van Rossum705f0f52001-08-24 16:47:00 +00005655static void
5656super_dealloc(PyObject *self)
5657{
5658 superobject *su = (superobject *)self;
5659
Guido van Rossum048eb752001-10-02 21:24:57 +00005660 _PyObject_GC_UNTRACK(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005661 Py_XDECREF(su->obj);
5662 Py_XDECREF(su->type);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005663 Py_XDECREF(su->obj_type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005664 self->ob_type->tp_free(self);
5665}
5666
5667static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005668super_repr(PyObject *self)
5669{
5670 superobject *su = (superobject *)self;
5671
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005672 if (su->obj_type)
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005673 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005674 "<super: <class '%s'>, <%s object>>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005675 su->type ? su->type->tp_name : "NULL",
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005676 su->obj_type->tp_name);
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005677 else
5678 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005679 "<super: <class '%s'>, NULL>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005680 su->type ? su->type->tp_name : "NULL");
5681}
5682
5683static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00005684super_getattro(PyObject *self, PyObject *name)
5685{
5686 superobject *su = (superobject *)self;
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005687 int skip = su->obj_type == NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005688
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005689 if (!skip) {
5690 /* We want __class__ to return the class of the super object
5691 (i.e. super, or a subclass), not the class of su->obj. */
5692 skip = (PyString_Check(name) &&
5693 PyString_GET_SIZE(name) == 9 &&
5694 strcmp(PyString_AS_STRING(name), "__class__") == 0);
5695 }
5696
5697 if (!skip) {
Tim Petersa91e9642001-11-14 23:32:33 +00005698 PyObject *mro, *res, *tmp, *dict;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005699 PyTypeObject *starttype;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005700 descrgetfunc f;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005701 Py_ssize_t i, n;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005702
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005703 starttype = su->obj_type;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005704 mro = starttype->tp_mro;
5705
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005706 if (mro == NULL)
5707 n = 0;
5708 else {
5709 assert(PyTuple_Check(mro));
5710 n = PyTuple_GET_SIZE(mro);
5711 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005712 for (i = 0; i < n; i++) {
Guido van Rossume705ef12001-08-29 15:47:06 +00005713 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
Guido van Rossum705f0f52001-08-24 16:47:00 +00005714 break;
5715 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005716 i++;
5717 res = NULL;
5718 for (; i < n; i++) {
5719 tmp = PyTuple_GET_ITEM(mro, i);
Tim Petersa91e9642001-11-14 23:32:33 +00005720 if (PyType_Check(tmp))
5721 dict = ((PyTypeObject *)tmp)->tp_dict;
5722 else if (PyClass_Check(tmp))
5723 dict = ((PyClassObject *)tmp)->cl_dict;
5724 else
5725 continue;
5726 res = PyDict_GetItem(dict, name);
Guido van Rossum6cc5bb62003-04-16 20:01:36 +00005727 if (res != NULL) {
Guido van Rossum705f0f52001-08-24 16:47:00 +00005728 Py_INCREF(res);
5729 f = res->ob_type->tp_descr_get;
5730 if (f != NULL) {
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005731 tmp = f(res,
5732 /* Only pass 'obj' param if
5733 this is instance-mode super
5734 (See SF ID #743627)
5735 */
Hye-Shik Changff365c92004-03-25 16:37:03 +00005736 (su->obj == (PyObject *)
5737 su->obj_type
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005738 ? (PyObject *)NULL
5739 : su->obj),
Guido van Rossumd4641072002-04-03 02:13:37 +00005740 (PyObject *)starttype);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005741 Py_DECREF(res);
5742 res = tmp;
5743 }
5744 return res;
5745 }
5746 }
5747 }
5748 return PyObject_GenericGetAttr(self, name);
5749}
5750
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005751static PyTypeObject *
Guido van Rossum5b443c62001-12-03 15:38:28 +00005752supercheck(PyTypeObject *type, PyObject *obj)
5753{
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005754 /* Check that a super() call makes sense. Return a type object.
5755
5756 obj can be a new-style class, or an instance of one:
5757
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005758 - If it is a class, it must be a subclass of 'type'. This case is
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005759 used for class methods; the return value is obj.
5760
5761 - If it is an instance, it must be an instance of 'type'. This is
5762 the normal case; the return value is obj.__class__.
5763
5764 But... when obj is an instance, we want to allow for the case where
5765 obj->ob_type is not a subclass of type, but obj.__class__ is!
5766 This will allow using super() with a proxy for obj.
5767 */
5768
Guido van Rossum8e80a722003-02-18 19:22:22 +00005769 /* Check for first bullet above (special case) */
5770 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
5771 Py_INCREF(obj);
5772 return (PyTypeObject *)obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005773 }
Guido van Rossum8e80a722003-02-18 19:22:22 +00005774
5775 /* Normal case */
5776 if (PyType_IsSubtype(obj->ob_type, type)) {
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005777 Py_INCREF(obj->ob_type);
5778 return obj->ob_type;
5779 }
5780 else {
5781 /* Try the slow way */
5782 static PyObject *class_str = NULL;
5783 PyObject *class_attr;
5784
5785 if (class_str == NULL) {
5786 class_str = PyString_FromString("__class__");
5787 if (class_str == NULL)
5788 return NULL;
5789 }
5790
5791 class_attr = PyObject_GetAttr(obj, class_str);
5792
5793 if (class_attr != NULL &&
5794 PyType_Check(class_attr) &&
5795 (PyTypeObject *)class_attr != obj->ob_type)
5796 {
5797 int ok = PyType_IsSubtype(
5798 (PyTypeObject *)class_attr, type);
5799 if (ok)
5800 return (PyTypeObject *)class_attr;
5801 }
5802
5803 if (class_attr == NULL)
5804 PyErr_Clear();
5805 else
5806 Py_DECREF(class_attr);
5807 }
5808
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005809 PyErr_SetString(PyExc_TypeError,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005810 "super(type, obj): "
5811 "obj must be an instance or subtype of type");
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005812 return NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005813}
5814
Guido van Rossum705f0f52001-08-24 16:47:00 +00005815static PyObject *
5816super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
5817{
5818 superobject *su = (superobject *)self;
Anthony Baxtera6286212006-04-11 07:42:36 +00005819 superobject *newobj;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005820
5821 if (obj == NULL || obj == Py_None || su->obj != NULL) {
5822 /* Not binding to an object, or already bound */
5823 Py_INCREF(self);
5824 return self;
5825 }
Guido van Rossum5b443c62001-12-03 15:38:28 +00005826 if (su->ob_type != &PySuper_Type)
Armin Rigo7726dc02005-05-15 15:32:08 +00005827 /* If su is an instance of a (strict) subclass of super,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005828 call its type */
Georg Brandl684fd0c2006-05-25 19:15:31 +00005829 return PyObject_CallFunctionObjArgs((PyObject *)su->ob_type,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005830 su->type, obj, NULL);
Guido van Rossum5b443c62001-12-03 15:38:28 +00005831 else {
5832 /* Inline the common case */
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005833 PyTypeObject *obj_type = supercheck(su->type, obj);
5834 if (obj_type == NULL)
Guido van Rossum5b443c62001-12-03 15:38:28 +00005835 return NULL;
Anthony Baxtera6286212006-04-11 07:42:36 +00005836 newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005837 NULL, NULL);
Anthony Baxtera6286212006-04-11 07:42:36 +00005838 if (newobj == NULL)
Guido van Rossum5b443c62001-12-03 15:38:28 +00005839 return NULL;
5840 Py_INCREF(su->type);
5841 Py_INCREF(obj);
Anthony Baxtera6286212006-04-11 07:42:36 +00005842 newobj->type = su->type;
5843 newobj->obj = obj;
5844 newobj->obj_type = obj_type;
5845 return (PyObject *)newobj;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005846 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005847}
5848
5849static int
5850super_init(PyObject *self, PyObject *args, PyObject *kwds)
5851{
5852 superobject *su = (superobject *)self;
Guido van Rossume705ef12001-08-29 15:47:06 +00005853 PyTypeObject *type;
5854 PyObject *obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005855 PyTypeObject *obj_type = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005856
Georg Brandl5d59c092006-09-30 08:43:30 +00005857 if (!_PyArg_NoKeywords("super", kwds))
5858 return -1;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005859 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
5860 return -1;
5861 if (obj == Py_None)
5862 obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005863 if (obj != NULL) {
5864 obj_type = supercheck(type, obj);
5865 if (obj_type == NULL)
5866 return -1;
5867 Py_INCREF(obj);
5868 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005869 Py_INCREF(type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005870 su->type = type;
5871 su->obj = obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005872 su->obj_type = obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005873 return 0;
5874}
5875
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005876PyDoc_STRVAR(super_doc,
Guido van Rossum705f0f52001-08-24 16:47:00 +00005877"super(type) -> unbound super object\n"
5878"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00005879"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00005880"Typical use to call a cooperative superclass method:\n"
5881"class C(B):\n"
5882" def meth(self, arg):\n"
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005883" super(C, self).meth(arg)");
Guido van Rossum705f0f52001-08-24 16:47:00 +00005884
Guido van Rossum048eb752001-10-02 21:24:57 +00005885static int
5886super_traverse(PyObject *self, visitproc visit, void *arg)
5887{
5888 superobject *su = (superobject *)self;
Guido van Rossum048eb752001-10-02 21:24:57 +00005889
Thomas Woutersc6e55062006-04-15 21:47:09 +00005890 Py_VISIT(su->obj);
5891 Py_VISIT(su->type);
5892 Py_VISIT(su->obj_type);
Guido van Rossum048eb752001-10-02 21:24:57 +00005893
5894 return 0;
5895}
5896
Guido van Rossum705f0f52001-08-24 16:47:00 +00005897PyTypeObject PySuper_Type = {
5898 PyObject_HEAD_INIT(&PyType_Type)
5899 0, /* ob_size */
5900 "super", /* tp_name */
5901 sizeof(superobject), /* tp_basicsize */
5902 0, /* tp_itemsize */
5903 /* methods */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005904 super_dealloc, /* tp_dealloc */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005905 0, /* tp_print */
5906 0, /* tp_getattr */
5907 0, /* tp_setattr */
5908 0, /* tp_compare */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005909 super_repr, /* tp_repr */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005910 0, /* tp_as_number */
5911 0, /* tp_as_sequence */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005912 0, /* tp_as_mapping */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005913 0, /* tp_hash */
5914 0, /* tp_call */
5915 0, /* tp_str */
5916 super_getattro, /* tp_getattro */
5917 0, /* tp_setattro */
5918 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00005919 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
5920 Py_TPFLAGS_BASETYPE, /* tp_flags */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005921 super_doc, /* tp_doc */
5922 super_traverse, /* tp_traverse */
5923 0, /* tp_clear */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005924 0, /* tp_richcompare */
5925 0, /* tp_weaklistoffset */
5926 0, /* tp_iter */
5927 0, /* tp_iternext */
5928 0, /* tp_methods */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005929 super_members, /* tp_members */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005930 0, /* tp_getset */
5931 0, /* tp_base */
5932 0, /* tp_dict */
5933 super_descr_get, /* tp_descr_get */
5934 0, /* tp_descr_set */
5935 0, /* tp_dictoffset */
5936 super_init, /* tp_init */
5937 PyType_GenericAlloc, /* tp_alloc */
5938 PyType_GenericNew, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005939 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005940};