blob: c2ed4b5666b1583f4a2d9217d915e43ed4b6d9a9 [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{
1657 PyObject *tmp = slots;
1658 PyObject *o, *o1;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00001659 Py_ssize_t i;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001660 ssizessizeargfunc copy = slots->ob_type->tp_as_sequence->sq_slice;
Martin v. Löwisd919a592002-10-14 21:07:28 +00001661 for (i = 0; i < nslots; i++) {
1662 if (PyUnicode_Check(o = PyTuple_GET_ITEM(tmp, i))) {
1663 if (tmp == slots) {
1664 tmp = copy(slots, 0, PyTuple_GET_SIZE(slots));
1665 if (tmp == NULL)
1666 return NULL;
1667 }
1668 o1 = _PyUnicode_AsDefaultEncodedString
1669 (o, NULL);
1670 if (o1 == NULL) {
1671 Py_DECREF(tmp);
1672 return 0;
1673 }
1674 Py_INCREF(o1);
1675 Py_DECREF(o);
1676 PyTuple_SET_ITEM(tmp, i, o1);
1677 }
1678 }
1679 return tmp;
1680}
1681#endif
1682
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001683static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001684type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
1685{
1686 PyObject *name, *bases, *dict;
Martin v. Löwis15e62742006-02-27 16:46:16 +00001687 static char *kwlist[] = {"name", "bases", "dict", 0};
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001688 PyObject *slots, *tmp, *newslots;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001689 PyTypeObject *type, *base, *tmptype, *winner;
Guido van Rossume5c691a2003-03-07 15:13:17 +00001690 PyHeapTypeObject *et;
Guido van Rossum6f799372001-09-20 20:46:19 +00001691 PyMemberDef *mp;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001692 Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
Guido van Rossumad47da02002-08-12 19:05:44 +00001693 int j, may_add_dict, may_add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001694
Tim Peters3abca122001-10-27 19:37:48 +00001695 assert(args != NULL && PyTuple_Check(args));
1696 assert(kwds == NULL || PyDict_Check(kwds));
1697
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001698 /* Special case: type(x) should return x->ob_type */
Tim Peters3abca122001-10-27 19:37:48 +00001699 {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001700 const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1701 const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
Tim Peters3abca122001-10-27 19:37:48 +00001702
1703 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
1704 PyObject *x = PyTuple_GET_ITEM(args, 0);
1705 Py_INCREF(x->ob_type);
1706 return (PyObject *) x->ob_type;
1707 }
1708
1709 /* SF bug 475327 -- if that didn't trigger, we need 3
1710 arguments. but PyArg_ParseTupleAndKeywords below may give
1711 a msg saying type() needs exactly 3. */
1712 if (nargs + nkwds != 3) {
1713 PyErr_SetString(PyExc_TypeError,
1714 "type() takes 1 or 3 arguments");
1715 return NULL;
1716 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001717 }
1718
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001719 /* Check arguments: (name, bases, dict) */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001720 if (!PyArg_ParseTupleAndKeywords(args, kwds, "SO!O!:type", kwlist,
1721 &name,
1722 &PyTuple_Type, &bases,
1723 &PyDict_Type, &dict))
1724 return NULL;
1725
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001726 winner = most_derived_metaclass(metatype, bases);
1727 if (winner == NULL)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001728 return NULL;
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001729 if (winner != metatype) {
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001730 if (winner->tp_new != type_new) /* Pass it to the winner */ {
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001731 return winner->tp_new(winner, args, kwds);
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001732 }
Guido van Rossum8d32c8b2001-08-17 11:18:38 +00001733 metatype = winner;
1734 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001735
1736 /* Adjust for empty tuple bases */
Jeremy Hyltonfa955692007-02-27 18:29:45 +00001737 nbases = PyTuple_GET_SIZE(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001738 if (nbases == 0) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001739 bases = PyTuple_Pack(1, &PyBaseObject_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001740 if (bases == NULL)
1741 return NULL;
1742 nbases = 1;
1743 }
1744 else
1745 Py_INCREF(bases);
1746
1747 /* XXX From here until type is allocated, "return NULL" leaks bases! */
1748
1749 /* Calculate best base, and check that all bases are type objects */
1750 base = best_base(bases);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001751 if (base == NULL) {
1752 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001753 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001754 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001755 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
1756 PyErr_Format(PyExc_TypeError,
1757 "type '%.100s' is not an acceptable base type",
1758 base->tp_name);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001759 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001760 return NULL;
1761 }
1762
Tim Peters6d6c1a32001-08-02 04:15:00 +00001763 /* Check for a __slots__ sequence variable in dict, and count it */
1764 slots = PyDict_GetItemString(dict, "__slots__");
1765 nslots = 0;
Guido van Rossum9676b222001-08-17 20:32:36 +00001766 add_dict = 0;
1767 add_weak = 0;
Guido van Rossumad47da02002-08-12 19:05:44 +00001768 may_add_dict = base->tp_dictoffset == 0;
1769 may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0;
1770 if (slots == NULL) {
1771 if (may_add_dict) {
1772 add_dict++;
1773 }
1774 if (may_add_weak) {
1775 add_weak++;
1776 }
1777 }
1778 else {
1779 /* Have slots */
1780
Tim Peters6d6c1a32001-08-02 04:15:00 +00001781 /* Make it into a tuple */
1782 if (PyString_Check(slots))
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001783 slots = PyTuple_Pack(1, slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001784 else
1785 slots = PySequence_Tuple(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001786 if (slots == NULL) {
1787 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001788 return NULL;
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001789 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001790 assert(PyTuple_Check(slots));
1791
1792 /* Are slots allowed? */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001793 nslots = PyTuple_GET_SIZE(slots);
Jeremy Hylton1c7a0ea2003-07-16 16:08:23 +00001794 if (nslots > 0 && base->tp_itemsize != 0) {
Guido van Rossumc4141872001-08-30 04:43:35 +00001795 PyErr_Format(PyExc_TypeError,
1796 "nonempty __slots__ "
1797 "not supported for subtype of '%s'",
1798 base->tp_name);
Guido van Rossumad47da02002-08-12 19:05:44 +00001799 bad_slots:
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001800 Py_DECREF(bases);
Guido van Rossumad47da02002-08-12 19:05:44 +00001801 Py_DECREF(slots);
Guido van Rossumc4141872001-08-30 04:43:35 +00001802 return NULL;
1803 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001804
Martin v. Löwisd919a592002-10-14 21:07:28 +00001805#ifdef Py_USING_UNICODE
1806 tmp = _unicode_to_string(slots, nslots);
Martin v. Löwis13b1a5c2002-10-14 21:11:34 +00001807 if (tmp != slots) {
1808 Py_DECREF(slots);
1809 slots = tmp;
1810 }
Martin v. Löwisd919a592002-10-14 21:07:28 +00001811 if (!tmp)
1812 return NULL;
1813#endif
Guido van Rossumad47da02002-08-12 19:05:44 +00001814 /* Check for valid slot names and two special cases */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001815 for (i = 0; i < nslots; i++) {
Guido van Rossumad47da02002-08-12 19:05:44 +00001816 PyObject *tmp = PyTuple_GET_ITEM(slots, i);
1817 char *s;
1818 if (!valid_identifier(tmp))
1819 goto bad_slots;
1820 assert(PyString_Check(tmp));
1821 s = PyString_AS_STRING(tmp);
1822 if (strcmp(s, "__dict__") == 0) {
1823 if (!may_add_dict || add_dict) {
1824 PyErr_SetString(PyExc_TypeError,
1825 "__dict__ slot disallowed: "
1826 "we already got one");
1827 goto bad_slots;
1828 }
1829 add_dict++;
1830 }
1831 if (strcmp(s, "__weakref__") == 0) {
1832 if (!may_add_weak || add_weak) {
1833 PyErr_SetString(PyExc_TypeError,
1834 "__weakref__ slot disallowed: "
1835 "either we already got one, "
1836 "or __itemsize__ != 0");
1837 goto bad_slots;
1838 }
1839 add_weak++;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001840 }
1841 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001842
Guido van Rossumad47da02002-08-12 19:05:44 +00001843 /* Copy slots into yet another tuple, demangling names */
1844 newslots = PyTuple_New(nslots - add_dict - add_weak);
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001845 if (newslots == NULL)
Guido van Rossumad47da02002-08-12 19:05:44 +00001846 goto bad_slots;
1847 for (i = j = 0; i < nslots; i++) {
1848 char *s;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001849 tmp = PyTuple_GET_ITEM(slots, i);
Guido van Rossumad47da02002-08-12 19:05:44 +00001850 s = PyString_AS_STRING(tmp);
1851 if ((add_dict && strcmp(s, "__dict__") == 0) ||
1852 (add_weak && strcmp(s, "__weakref__") == 0))
1853 continue;
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00001854 tmp =_Py_Mangle(name, tmp);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001855 if (!tmp)
1856 goto bad_slots;
Guido van Rossumad47da02002-08-12 19:05:44 +00001857 PyTuple_SET_ITEM(newslots, j, tmp);
1858 j++;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001859 }
Guido van Rossumad47da02002-08-12 19:05:44 +00001860 assert(j == nslots - add_dict - add_weak);
1861 nslots = j;
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00001862 Py_DECREF(slots);
1863 slots = newslots;
1864
Guido van Rossumad47da02002-08-12 19:05:44 +00001865 /* Secondary bases may provide weakrefs or dict */
1866 if (nbases > 1 &&
1867 ((may_add_dict && !add_dict) ||
1868 (may_add_weak && !add_weak))) {
1869 for (i = 0; i < nbases; i++) {
1870 tmp = PyTuple_GET_ITEM(bases, i);
1871 if (tmp == (PyObject *)base)
1872 continue; /* Skip primary base */
1873 if (PyClass_Check(tmp)) {
1874 /* Classic base class provides both */
1875 if (may_add_dict && !add_dict)
1876 add_dict++;
1877 if (may_add_weak && !add_weak)
1878 add_weak++;
1879 break;
1880 }
1881 assert(PyType_Check(tmp));
1882 tmptype = (PyTypeObject *)tmp;
1883 if (may_add_dict && !add_dict &&
1884 tmptype->tp_dictoffset != 0)
1885 add_dict++;
1886 if (may_add_weak && !add_weak &&
1887 tmptype->tp_weaklistoffset != 0)
1888 add_weak++;
1889 if (may_add_dict && !add_dict)
1890 continue;
1891 if (may_add_weak && !add_weak)
1892 continue;
1893 /* Nothing more to check */
1894 break;
1895 }
1896 }
Guido van Rossum9676b222001-08-17 20:32:36 +00001897 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001898
1899 /* XXX From here until type is safely allocated,
1900 "return NULL" may leak slots! */
1901
1902 /* Allocate the type object */
1903 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
Guido van Rossumad47da02002-08-12 19:05:44 +00001904 if (type == NULL) {
1905 Py_XDECREF(slots);
Michael W. Hudsona6a277d2003-08-08 13:57:22 +00001906 Py_DECREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001907 return NULL;
Guido van Rossumad47da02002-08-12 19:05:44 +00001908 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001909
1910 /* Keep name and slots alive in the extended type object */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001911 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001912 Py_INCREF(name);
Georg Brandlc255c7b2006-02-20 22:27:28 +00001913 et->ht_name = name;
1914 et->ht_slots = slots;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001915
Guido van Rossumdc91b992001-08-08 22:26:22 +00001916 /* Initialize tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001917 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
1918 Py_TPFLAGS_BASETYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00001919 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
1920 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00001921
1922 /* It's a new-style number unless it specifically inherits any
1923 old-style numeric behavior */
1924 if ((base->tp_flags & Py_TPFLAGS_CHECKTYPES) ||
1925 (base->tp_as_number == NULL))
1926 type->tp_flags |= Py_TPFLAGS_CHECKTYPES;
1927
1928 /* Initialize essential fields */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001929 type->tp_as_number = &et->as_number;
1930 type->tp_as_sequence = &et->as_sequence;
1931 type->tp_as_mapping = &et->as_mapping;
1932 type->tp_as_buffer = &et->as_buffer;
1933 type->tp_name = PyString_AS_STRING(name);
1934
1935 /* Set tp_base and tp_bases */
1936 type->tp_bases = bases;
1937 Py_INCREF(base);
1938 type->tp_base = base;
1939
Guido van Rossum687ae002001-10-15 22:03:32 +00001940 /* Initialize tp_dict from passed-in dict */
1941 type->tp_dict = dict = PyDict_Copy(dict);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001942 if (dict == NULL) {
1943 Py_DECREF(type);
1944 return NULL;
1945 }
1946
Guido van Rossumc3542212001-08-16 09:18:56 +00001947 /* Set __module__ in the dict */
1948 if (PyDict_GetItemString(dict, "__module__") == NULL) {
1949 tmp = PyEval_GetGlobals();
1950 if (tmp != NULL) {
1951 tmp = PyDict_GetItemString(tmp, "__name__");
1952 if (tmp != NULL) {
1953 if (PyDict_SetItemString(dict, "__module__",
1954 tmp) < 0)
1955 return NULL;
1956 }
1957 }
1958 }
1959
Tim Peters2f93e282001-10-04 05:27:00 +00001960 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
Tim Peters24008312002-03-17 18:56:20 +00001961 and is a string. The __doc__ accessor will first look for tp_doc;
1962 if that fails, it will still look into __dict__.
Tim Peters2f93e282001-10-04 05:27:00 +00001963 */
1964 {
1965 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
1966 if (doc != NULL && PyString_Check(doc)) {
1967 const size_t n = (size_t)PyString_GET_SIZE(doc);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001968 char *tp_doc = (char *)PyObject_MALLOC(n+1);
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001969 if (tp_doc == NULL) {
Tim Peters2f93e282001-10-04 05:27:00 +00001970 Py_DECREF(type);
1971 return NULL;
1972 }
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00001973 memcpy(tp_doc, PyString_AS_STRING(doc), n+1);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00001974 type->tp_doc = tp_doc;
Tim Peters2f93e282001-10-04 05:27:00 +00001975 }
1976 }
1977
Tim Peters6d6c1a32001-08-02 04:15:00 +00001978 /* Special-case __new__: if it's a plain function,
1979 make it a static function */
1980 tmp = PyDict_GetItemString(dict, "__new__");
1981 if (tmp != NULL && PyFunction_Check(tmp)) {
1982 tmp = PyStaticMethod_New(tmp);
1983 if (tmp == NULL) {
1984 Py_DECREF(type);
1985 return NULL;
1986 }
1987 PyDict_SetItemString(dict, "__new__", tmp);
1988 Py_DECREF(tmp);
1989 }
1990
1991 /* Add descriptors for custom slots from __slots__, or for __dict__ */
Guido van Rossume5c691a2003-03-07 15:13:17 +00001992 mp = PyHeapType_GET_MEMBERS(et);
Neil Schemenauerc806c882001-08-29 23:54:54 +00001993 slotoffset = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001994 if (slots != NULL) {
1995 for (i = 0; i < nslots; i++, mp++) {
1996 mp->name = PyString_AS_STRING(
1997 PyTuple_GET_ITEM(slots, i));
Guido van Rossum64b206c2001-12-04 17:13:22 +00001998 mp->type = T_OBJECT_EX;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001999 mp->offset = slotoffset;
Guido van Rossum9676b222001-08-17 20:32:36 +00002000 if (base->tp_weaklistoffset == 0 &&
Guido van Rossum64b206c2001-12-04 17:13:22 +00002001 strcmp(mp->name, "__weakref__") == 0) {
Guido van Rossumad47da02002-08-12 19:05:44 +00002002 add_weak++;
Guido van Rossum64b206c2001-12-04 17:13:22 +00002003 mp->type = T_OBJECT;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00002004 mp->flags = READONLY;
Guido van Rossum9676b222001-08-17 20:32:36 +00002005 type->tp_weaklistoffset = slotoffset;
Guido van Rossum64b206c2001-12-04 17:13:22 +00002006 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002007 slotoffset += sizeof(PyObject *);
2008 }
2009 }
Guido van Rossumad47da02002-08-12 19:05:44 +00002010 if (add_dict) {
2011 if (base->tp_itemsize)
2012 type->tp_dictoffset = -(long)sizeof(PyObject *);
2013 else
2014 type->tp_dictoffset = slotoffset;
2015 slotoffset += sizeof(PyObject *);
2016 }
2017 if (add_weak) {
2018 assert(!base->tp_itemsize);
2019 type->tp_weaklistoffset = slotoffset;
2020 slotoffset += sizeof(PyObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002021 }
2022 type->tp_basicsize = slotoffset;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00002023 type->tp_itemsize = base->tp_itemsize;
Guido van Rossume5c691a2003-03-07 15:13:17 +00002024 type->tp_members = PyHeapType_GET_MEMBERS(et);
Guido van Rossum373c7412003-01-07 13:41:37 +00002025
2026 if (type->tp_weaklistoffset && type->tp_dictoffset)
2027 type->tp_getset = subtype_getsets_full;
2028 else if (type->tp_weaklistoffset && !type->tp_dictoffset)
2029 type->tp_getset = subtype_getsets_weakref_only;
2030 else if (!type->tp_weaklistoffset && type->tp_dictoffset)
2031 type->tp_getset = subtype_getsets_dict_only;
2032 else
2033 type->tp_getset = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002034
2035 /* Special case some slots */
2036 if (type->tp_dictoffset != 0 || nslots > 0) {
2037 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
2038 type->tp_getattro = PyObject_GenericGetAttr;
2039 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
2040 type->tp_setattro = PyObject_GenericSetAttr;
2041 }
2042 type->tp_dealloc = subtype_dealloc;
2043
Guido van Rossum9475a232001-10-05 20:51:39 +00002044 /* Enable GC unless there are really no instance variables possible */
2045 if (!(type->tp_basicsize == sizeof(PyObject) &&
2046 type->tp_itemsize == 0))
2047 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
2048
Tim Peters6d6c1a32001-08-02 04:15:00 +00002049 /* Always override allocation strategy to use regular heap */
2050 type->tp_alloc = PyType_GenericAlloc;
Guido van Rossum048eb752001-10-02 21:24:57 +00002051 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002052 type->tp_free = PyObject_GC_Del;
Guido van Rossum9475a232001-10-05 20:51:39 +00002053 type->tp_traverse = subtype_traverse;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00002054 type->tp_clear = subtype_clear;
Guido van Rossum048eb752001-10-02 21:24:57 +00002055 }
2056 else
Neil Schemenauer09a2ae52002-04-12 03:06:53 +00002057 type->tp_free = PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002058
2059 /* Initialize the rest */
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002060 if (PyType_Ready(type) < 0) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00002061 Py_DECREF(type);
2062 return NULL;
2063 }
2064
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002065 /* Put the proper slots in place */
2066 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00002067
Tim Peters6d6c1a32001-08-02 04:15:00 +00002068 return (PyObject *)type;
2069}
2070
2071/* Internal API to look for a name through the MRO.
2072 This returns a borrowed reference, and doesn't set an exception! */
2073PyObject *
2074_PyType_Lookup(PyTypeObject *type, PyObject *name)
2075{
Martin v. Löwis18e16552006-02-15 17:27:45 +00002076 Py_ssize_t i, n;
Tim Petersa91e9642001-11-14 23:32:33 +00002077 PyObject *mro, *res, *base, *dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002078
Guido van Rossum687ae002001-10-15 22:03:32 +00002079 /* Look in tp_dict of types in MRO */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002080 mro = type->tp_mro;
Guido van Rossum23094982002-06-10 14:30:43 +00002081
2082 /* If mro is NULL, the type is either not yet initialized
2083 by PyType_Ready(), or already cleared by type_clear().
2084 Either way the safest thing to do is to return NULL. */
2085 if (mro == NULL)
2086 return NULL;
2087
Tim Peters6d6c1a32001-08-02 04:15:00 +00002088 assert(PyTuple_Check(mro));
2089 n = PyTuple_GET_SIZE(mro);
2090 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00002091 base = PyTuple_GET_ITEM(mro, i);
2092 if (PyClass_Check(base))
2093 dict = ((PyClassObject *)base)->cl_dict;
2094 else {
2095 assert(PyType_Check(base));
2096 dict = ((PyTypeObject *)base)->tp_dict;
2097 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002098 assert(dict && PyDict_Check(dict));
2099 res = PyDict_GetItem(dict, name);
2100 if (res != NULL)
2101 return res;
2102 }
2103 return NULL;
2104}
2105
2106/* This is similar to PyObject_GenericGetAttr(),
2107 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
2108static PyObject *
2109type_getattro(PyTypeObject *type, PyObject *name)
2110{
2111 PyTypeObject *metatype = type->ob_type;
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002112 PyObject *meta_attribute, *attribute;
2113 descrgetfunc meta_get;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002114
2115 /* Initialize this type (we'll assume the metatype is initialized) */
2116 if (type->tp_dict == NULL) {
Guido van Rossum528b7eb2001-08-07 17:24:28 +00002117 if (PyType_Ready(type) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002118 return NULL;
2119 }
2120
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002121 /* No readable descriptor found yet */
2122 meta_get = NULL;
Tim Peters34592512002-07-11 06:23:50 +00002123
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002124 /* Look for the attribute in the metatype */
2125 meta_attribute = _PyType_Lookup(metatype, name);
2126
2127 if (meta_attribute != NULL) {
2128 meta_get = meta_attribute->ob_type->tp_descr_get;
Tim Peters34592512002-07-11 06:23:50 +00002129
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002130 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
2131 /* Data descriptors implement tp_descr_set to intercept
2132 * writes. Assume the attribute is not overridden in
2133 * type's tp_dict (and bases): call the descriptor now.
2134 */
2135 return meta_get(meta_attribute, (PyObject *)type,
2136 (PyObject *)metatype);
2137 }
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002138 Py_INCREF(meta_attribute);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002139 }
2140
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002141 /* No data descriptor found on metatype. Look in tp_dict of this
2142 * type and its bases */
2143 attribute = _PyType_Lookup(type, name);
2144 if (attribute != NULL) {
2145 /* Implement descriptor functionality, if any */
2146 descrgetfunc local_get = attribute->ob_type->tp_descr_get;
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002147
2148 Py_XDECREF(meta_attribute);
2149
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002150 if (local_get != NULL) {
2151 /* NULL 2nd argument indicates the descriptor was
2152 * found on the target object itself (or a base) */
2153 return local_get(attribute, (PyObject *)NULL,
2154 (PyObject *)type);
2155 }
Tim Peters34592512002-07-11 06:23:50 +00002156
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002157 Py_INCREF(attribute);
2158 return attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002159 }
2160
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002161 /* No attribute found in local __dict__ (or bases): use the
2162 * descriptor from the metatype, if any */
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002163 if (meta_get != NULL) {
2164 PyObject *res;
2165 res = meta_get(meta_attribute, (PyObject *)type,
2166 (PyObject *)metatype);
2167 Py_DECREF(meta_attribute);
2168 return res;
2169 }
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002170
2171 /* If an ordinary attribute was found on the metatype, return it now */
2172 if (meta_attribute != NULL) {
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002173 return meta_attribute;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002174 }
2175
2176 /* Give up */
2177 PyErr_Format(PyExc_AttributeError,
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002178 "type object '%.50s' has no attribute '%.400s'",
2179 type->tp_name, PyString_AS_STRING(name));
Tim Peters6d6c1a32001-08-02 04:15:00 +00002180 return NULL;
2181}
2182
2183static int
2184type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
2185{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002186 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2187 PyErr_Format(
2188 PyExc_TypeError,
2189 "can't set attributes of built-in/extension type '%s'",
2190 type->tp_name);
2191 return -1;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00002192 }
Guido van Rossum8d24ee92003-03-24 23:49:49 +00002193 /* XXX Example of how I expect this to be used...
2194 if (update_subclasses(type, name, invalidate_cache, NULL) < 0)
2195 return -1;
2196 */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00002197 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
2198 return -1;
2199 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002200}
2201
2202static void
2203type_dealloc(PyTypeObject *type)
2204{
Guido van Rossume5c691a2003-03-07 15:13:17 +00002205 PyHeapTypeObject *et;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002206
2207 /* Assert this is a heap-allocated type object */
2208 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002209 _PyObject_GC_UNTRACK(type);
Guido van Rossum1c450732001-10-08 15:18:27 +00002210 PyObject_ClearWeakRefs((PyObject *)type);
Guido van Rossume5c691a2003-03-07 15:13:17 +00002211 et = (PyHeapTypeObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002212 Py_XDECREF(type->tp_base);
2213 Py_XDECREF(type->tp_dict);
2214 Py_XDECREF(type->tp_bases);
2215 Py_XDECREF(type->tp_mro);
Guido van Rossum687ae002001-10-15 22:03:32 +00002216 Py_XDECREF(type->tp_cache);
Guido van Rossum1c450732001-10-08 15:18:27 +00002217 Py_XDECREF(type->tp_subclasses);
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002218 /* A type's tp_doc is heap allocated, unlike the tp_doc slots
2219 * of most other objects. It's okay to cast it to char *.
2220 */
Jeremy Hyltonaf68c872005-12-10 18:50:16 +00002221 PyObject_Free((char *)type->tp_doc);
Georg Brandlc255c7b2006-02-20 22:27:28 +00002222 Py_XDECREF(et->ht_name);
2223 Py_XDECREF(et->ht_slots);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002224 type->ob_type->tp_free((PyObject *)type);
2225}
2226
Guido van Rossum1c450732001-10-08 15:18:27 +00002227static PyObject *
2228type_subclasses(PyTypeObject *type, PyObject *args_ignored)
2229{
2230 PyObject *list, *raw, *ref;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002231 Py_ssize_t i, n;
Guido van Rossum1c450732001-10-08 15:18:27 +00002232
2233 list = PyList_New(0);
2234 if (list == NULL)
2235 return NULL;
2236 raw = type->tp_subclasses;
2237 if (raw == NULL)
2238 return list;
2239 assert(PyList_Check(raw));
2240 n = PyList_GET_SIZE(raw);
2241 for (i = 0; i < n; i++) {
2242 ref = PyList_GET_ITEM(raw, i);
Tim Peters44383382001-10-08 16:49:26 +00002243 assert(PyWeakref_CheckRef(ref));
Guido van Rossum1c450732001-10-08 15:18:27 +00002244 ref = PyWeakref_GET_OBJECT(ref);
2245 if (ref != Py_None) {
2246 if (PyList_Append(list, ref) < 0) {
2247 Py_DECREF(list);
2248 return NULL;
2249 }
2250 }
2251 }
2252 return list;
2253}
2254
Tim Peters6d6c1a32001-08-02 04:15:00 +00002255static PyMethodDef type_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00002256 {"mro", (PyCFunction)mro_external, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002257 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
Guido van Rossum1c450732001-10-08 15:18:27 +00002258 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002259 PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002260 {0}
2261};
2262
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002263PyDoc_STRVAR(type_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002264"type(object) -> the object's type\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002265"type(name, bases, dict) -> a new type");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002266
Guido van Rossum048eb752001-10-02 21:24:57 +00002267static int
2268type_traverse(PyTypeObject *type, visitproc visit, void *arg)
2269{
Guido van Rossuma3862092002-06-10 15:24:42 +00002270 /* Because of type_is_gc(), the collector only calls this
2271 for heaptypes. */
2272 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002273
Thomas Woutersc6e55062006-04-15 21:47:09 +00002274 Py_VISIT(type->tp_dict);
2275 Py_VISIT(type->tp_cache);
2276 Py_VISIT(type->tp_mro);
2277 Py_VISIT(type->tp_bases);
2278 Py_VISIT(type->tp_base);
Guido van Rossuma3862092002-06-10 15:24:42 +00002279
2280 /* There's no need to visit type->tp_subclasses or
Georg Brandlc255c7b2006-02-20 22:27:28 +00002281 ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
Guido van Rossuma3862092002-06-10 15:24:42 +00002282 in cycles; tp_subclasses is a list of weak references,
2283 and slots is a tuple of strings. */
Guido van Rossum048eb752001-10-02 21:24:57 +00002284
Guido van Rossum048eb752001-10-02 21:24:57 +00002285 return 0;
2286}
2287
2288static int
2289type_clear(PyTypeObject *type)
2290{
Guido van Rossuma3862092002-06-10 15:24:42 +00002291 /* Because of type_is_gc(), the collector only calls this
2292 for heaptypes. */
2293 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002294
Guido van Rossuma3862092002-06-10 15:24:42 +00002295 /* The only field we need to clear is tp_mro, which is part of a
2296 hard cycle (its first element is the class itself) that won't
2297 be broken otherwise (it's a tuple and tuples don't have a
2298 tp_clear handler). None of the other fields need to be
2299 cleared, and here's why:
Guido van Rossum048eb752001-10-02 21:24:57 +00002300
Guido van Rossuma3862092002-06-10 15:24:42 +00002301 tp_dict:
2302 It is a dict, so the collector will call its tp_clear.
2303
2304 tp_cache:
2305 Not used; if it were, it would be a dict.
2306
2307 tp_bases, tp_base:
2308 If these are involved in a cycle, there must be at least
2309 one other, mutable object in the cycle, e.g. a base
2310 class's dict; the cycle will be broken that way.
2311
2312 tp_subclasses:
2313 A list of weak references can't be part of a cycle; and
2314 lists have their own tp_clear.
2315
Guido van Rossume5c691a2003-03-07 15:13:17 +00002316 slots (in PyHeapTypeObject):
Guido van Rossuma3862092002-06-10 15:24:42 +00002317 A tuple of strings can't be part of a cycle.
2318 */
2319
Thomas Woutersedf17d82006-04-15 17:28:34 +00002320 Py_CLEAR(type->tp_mro);
Guido van Rossum048eb752001-10-02 21:24:57 +00002321
2322 return 0;
2323}
2324
2325static int
2326type_is_gc(PyTypeObject *type)
2327{
2328 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
2329}
2330
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002331PyTypeObject PyType_Type = {
2332 PyObject_HEAD_INIT(&PyType_Type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002333 0, /* ob_size */
2334 "type", /* tp_name */
Guido van Rossume5c691a2003-03-07 15:13:17 +00002335 sizeof(PyHeapTypeObject), /* tp_basicsize */
Guido van Rossum6f799372001-09-20 20:46:19 +00002336 sizeof(PyMemberDef), /* tp_itemsize */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002337 (destructor)type_dealloc, /* tp_dealloc */
2338 0, /* tp_print */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002339 0, /* tp_getattr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002340 0, /* tp_setattr */
2341 type_compare, /* tp_compare */
2342 (reprfunc)type_repr, /* tp_repr */
2343 0, /* tp_as_number */
2344 0, /* tp_as_sequence */
2345 0, /* tp_as_mapping */
2346 (hashfunc)_Py_HashPointer, /* tp_hash */
2347 (ternaryfunc)type_call, /* tp_call */
2348 0, /* tp_str */
2349 (getattrofunc)type_getattro, /* tp_getattro */
2350 (setattrofunc)type_setattro, /* tp_setattro */
2351 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00002352 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
Neal Norwitzee3a1b52007-02-25 19:44:48 +00002353 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002354 type_doc, /* tp_doc */
Guido van Rossum048eb752001-10-02 21:24:57 +00002355 (traverseproc)type_traverse, /* tp_traverse */
2356 (inquiry)type_clear, /* tp_clear */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002357 0, /* tp_richcompare */
Guido van Rossum1c450732001-10-08 15:18:27 +00002358 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002359 0, /* tp_iter */
2360 0, /* tp_iternext */
2361 type_methods, /* tp_methods */
2362 type_members, /* tp_members */
2363 type_getsets, /* tp_getset */
2364 0, /* tp_base */
2365 0, /* tp_dict */
2366 0, /* tp_descr_get */
2367 0, /* tp_descr_set */
2368 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
2369 0, /* tp_init */
2370 0, /* tp_alloc */
2371 type_new, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002372 PyObject_GC_Del, /* tp_free */
Guido van Rossum048eb752001-10-02 21:24:57 +00002373 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002374};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002375
2376
2377/* The base type of all types (eventually)... except itself. */
2378
2379static int
2380object_init(PyObject *self, PyObject *args, PyObject *kwds)
2381{
2382 return 0;
2383}
2384
Guido van Rossum298e4212003-02-13 16:30:16 +00002385/* If we don't have a tp_new for a new-style class, new will use this one.
2386 Therefore this should take no arguments/keywords. However, this new may
2387 also be inherited by objects that define a tp_init but no tp_new. These
2388 objects WILL pass argumets to tp_new, because it gets the same args as
2389 tp_init. So only allow arguments if we aren't using the default init, in
2390 which case we expect init to handle argument parsing. */
2391static PyObject *
2392object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2393{
2394 if (type->tp_init == object_init && (PyTuple_GET_SIZE(args) ||
2395 (kwds && PyDict_Check(kwds) && PyDict_Size(kwds)))) {
2396 PyErr_SetString(PyExc_TypeError,
2397 "default __new__ takes no parameters");
2398 return NULL;
2399 }
2400 return type->tp_alloc(type, 0);
2401}
2402
Tim Peters6d6c1a32001-08-02 04:15:00 +00002403static void
2404object_dealloc(PyObject *self)
2405{
2406 self->ob_type->tp_free(self);
2407}
2408
Guido van Rossum8e248182001-08-12 05:17:56 +00002409static PyObject *
2410object_repr(PyObject *self)
2411{
Guido van Rossum76e69632001-08-16 18:52:43 +00002412 PyTypeObject *type;
Barry Warsaw7ce36942001-08-24 18:34:26 +00002413 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002414
Guido van Rossum76e69632001-08-16 18:52:43 +00002415 type = self->ob_type;
2416 mod = type_module(type, NULL);
2417 if (mod == NULL)
2418 PyErr_Clear();
2419 else if (!PyString_Check(mod)) {
2420 Py_DECREF(mod);
2421 mod = NULL;
2422 }
2423 name = type_name(type, NULL);
2424 if (name == NULL)
2425 return NULL;
2426 if (mod != NULL && strcmp(PyString_AS_STRING(mod), "__builtin__"))
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002427 rtn = PyString_FromFormat("<%s.%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002428 PyString_AS_STRING(mod),
2429 PyString_AS_STRING(name),
2430 self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002431 else
Guido van Rossumff0e6d62001-09-24 16:03:59 +00002432 rtn = PyString_FromFormat("<%s object at %p>",
Barry Warsaw7ce36942001-08-24 18:34:26 +00002433 type->tp_name, self);
Guido van Rossum76e69632001-08-16 18:52:43 +00002434 Py_XDECREF(mod);
2435 Py_DECREF(name);
Barry Warsaw7ce36942001-08-24 18:34:26 +00002436 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002437}
2438
Guido van Rossumb8f63662001-08-15 23:57:02 +00002439static PyObject *
2440object_str(PyObject *self)
2441{
2442 unaryfunc f;
2443
2444 f = self->ob_type->tp_repr;
2445 if (f == NULL)
2446 f = object_repr;
2447 return f(self);
2448}
2449
Guido van Rossum8e248182001-08-12 05:17:56 +00002450static long
2451object_hash(PyObject *self)
2452{
2453 return _Py_HashPointer(self);
2454}
Guido van Rossum8e248182001-08-12 05:17:56 +00002455
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002456static PyObject *
2457object_get_class(PyObject *self, void *closure)
2458{
2459 Py_INCREF(self->ob_type);
2460 return (PyObject *)(self->ob_type);
2461}
2462
2463static int
2464equiv_structs(PyTypeObject *a, PyTypeObject *b)
2465{
2466 return a == b ||
2467 (a != NULL &&
2468 b != NULL &&
2469 a->tp_basicsize == b->tp_basicsize &&
2470 a->tp_itemsize == b->tp_itemsize &&
2471 a->tp_dictoffset == b->tp_dictoffset &&
2472 a->tp_weaklistoffset == b->tp_weaklistoffset &&
2473 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
2474 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
2475}
2476
2477static int
2478same_slots_added(PyTypeObject *a, PyTypeObject *b)
2479{
2480 PyTypeObject *base = a->tp_base;
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002481 Py_ssize_t size;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002482
2483 if (base != b->tp_base)
2484 return 0;
2485 if (equiv_structs(a, base) && equiv_structs(b, base))
2486 return 1;
2487 size = base->tp_basicsize;
2488 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
2489 size += sizeof(PyObject *);
2490 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
2491 size += sizeof(PyObject *);
2492 return size == a->tp_basicsize && size == b->tp_basicsize;
2493}
2494
2495static int
Anthony Baxtera6286212006-04-11 07:42:36 +00002496compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002497{
2498 PyTypeObject *newbase, *oldbase;
2499
Anthony Baxtera6286212006-04-11 07:42:36 +00002500 if (newto->tp_dealloc != oldto->tp_dealloc ||
2501 newto->tp_free != oldto->tp_free)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002502 {
2503 PyErr_Format(PyExc_TypeError,
2504 "%s assignment: "
2505 "'%s' deallocator differs from '%s'",
2506 attr,
Anthony Baxtera6286212006-04-11 07:42:36 +00002507 newto->tp_name,
2508 oldto->tp_name);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002509 return 0;
2510 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002511 newbase = newto;
2512 oldbase = oldto;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002513 while (equiv_structs(newbase, newbase->tp_base))
2514 newbase = newbase->tp_base;
2515 while (equiv_structs(oldbase, oldbase->tp_base))
2516 oldbase = oldbase->tp_base;
2517 if (newbase != oldbase &&
2518 (newbase->tp_base != oldbase->tp_base ||
2519 !same_slots_added(newbase, oldbase))) {
2520 PyErr_Format(PyExc_TypeError,
2521 "%s assignment: "
2522 "'%s' object layout differs from '%s'",
2523 attr,
Anthony Baxtera6286212006-04-11 07:42:36 +00002524 newto->tp_name,
2525 oldto->tp_name);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002526 return 0;
2527 }
Tim Petersea7f75d2002-12-07 21:39:16 +00002528
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002529 return 1;
2530}
2531
2532static int
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002533object_set_class(PyObject *self, PyObject *value, void *closure)
2534{
Anthony Baxtera6286212006-04-11 07:42:36 +00002535 PyTypeObject *oldto = self->ob_type;
2536 PyTypeObject *newto;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002537
Guido van Rossumb6b89422002-04-15 01:03:30 +00002538 if (value == NULL) {
2539 PyErr_SetString(PyExc_TypeError,
2540 "can't delete __class__ attribute");
2541 return -1;
2542 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002543 if (!PyType_Check(value)) {
2544 PyErr_Format(PyExc_TypeError,
2545 "__class__ must be set to new-style class, not '%s' object",
2546 value->ob_type->tp_name);
2547 return -1;
2548 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002549 newto = (PyTypeObject *)value;
2550 if (!(newto->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
2551 !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE))
Guido van Rossum40af8892002-08-10 05:42:07 +00002552 {
2553 PyErr_Format(PyExc_TypeError,
2554 "__class__ assignment: only for heap types");
2555 return -1;
2556 }
Anthony Baxtera6286212006-04-11 07:42:36 +00002557 if (compatible_for_assignment(newto, oldto, "__class__")) {
2558 Py_INCREF(newto);
2559 self->ob_type = newto;
2560 Py_DECREF(oldto);
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002561 return 0;
2562 }
2563 else {
Guido van Rossum9ee4b942002-05-24 18:47:47 +00002564 return -1;
2565 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002566}
2567
2568static PyGetSetDef object_getsets[] = {
2569 {"__class__", object_get_class, object_set_class,
Neal Norwitz858e34f2002-08-13 17:18:45 +00002570 PyDoc_STR("the object's class")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00002571 {0}
2572};
2573
Guido van Rossumc53f0092003-02-18 22:05:12 +00002574
Guido van Rossum036f9992003-02-21 22:02:54 +00002575/* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
2576 We fall back to helpers in copy_reg for:
2577 - pickle protocols < 2
2578 - calculating the list of slot names (done only once per class)
2579 - the __newobj__ function (which is used as a token but never called)
2580*/
2581
2582static PyObject *
2583import_copy_reg(void)
2584{
2585 static PyObject *copy_reg_str;
Guido van Rossum3926a632001-09-25 16:25:58 +00002586
2587 if (!copy_reg_str) {
2588 copy_reg_str = PyString_InternFromString("copy_reg");
2589 if (copy_reg_str == NULL)
2590 return NULL;
2591 }
Guido van Rossum036f9992003-02-21 22:02:54 +00002592
2593 return PyImport_Import(copy_reg_str);
2594}
2595
2596static PyObject *
2597slotnames(PyObject *cls)
2598{
2599 PyObject *clsdict;
2600 PyObject *copy_reg;
2601 PyObject *slotnames;
2602
2603 if (!PyType_Check(cls)) {
2604 Py_INCREF(Py_None);
2605 return Py_None;
2606 }
2607
2608 clsdict = ((PyTypeObject *)cls)->tp_dict;
2609 slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
Armin Rigoec862b92005-09-24 22:58:41 +00002610 if (slotnames != NULL && PyList_Check(slotnames)) {
Guido van Rossum036f9992003-02-21 22:02:54 +00002611 Py_INCREF(slotnames);
2612 return slotnames;
2613 }
2614
2615 copy_reg = import_copy_reg();
2616 if (copy_reg == NULL)
2617 return NULL;
2618
2619 slotnames = PyObject_CallMethod(copy_reg, "_slotnames", "O", cls);
2620 Py_DECREF(copy_reg);
2621 if (slotnames != NULL &&
2622 slotnames != Py_None &&
2623 !PyList_Check(slotnames))
2624 {
2625 PyErr_SetString(PyExc_TypeError,
2626 "copy_reg._slotnames didn't return a list or None");
2627 Py_DECREF(slotnames);
2628 slotnames = NULL;
2629 }
2630
2631 return slotnames;
2632}
2633
2634static PyObject *
2635reduce_2(PyObject *obj)
2636{
2637 PyObject *cls, *getnewargs;
2638 PyObject *args = NULL, *args2 = NULL;
2639 PyObject *getstate = NULL, *state = NULL, *names = NULL;
2640 PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
2641 PyObject *copy_reg = NULL, *newobj = NULL, *res = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002642 Py_ssize_t i, n;
Guido van Rossum036f9992003-02-21 22:02:54 +00002643
2644 cls = PyObject_GetAttrString(obj, "__class__");
2645 if (cls == NULL)
2646 return NULL;
2647
2648 getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
2649 if (getnewargs != NULL) {
2650 args = PyObject_CallObject(getnewargs, NULL);
2651 Py_DECREF(getnewargs);
2652 if (args != NULL && !PyTuple_Check(args)) {
Georg Brandlccff7852006-06-18 22:17:29 +00002653 PyErr_Format(PyExc_TypeError,
2654 "__getnewargs__ should return a tuple, "
2655 "not '%.200s'", args->ob_type->tp_name);
Guido van Rossum036f9992003-02-21 22:02:54 +00002656 goto end;
2657 }
2658 }
2659 else {
2660 PyErr_Clear();
2661 args = PyTuple_New(0);
2662 }
2663 if (args == NULL)
2664 goto end;
2665
2666 getstate = PyObject_GetAttrString(obj, "__getstate__");
2667 if (getstate != NULL) {
2668 state = PyObject_CallObject(getstate, NULL);
2669 Py_DECREF(getstate);
Neal Norwitze2fdc612003-06-08 13:19:58 +00002670 if (state == NULL)
2671 goto end;
Guido van Rossum036f9992003-02-21 22:02:54 +00002672 }
2673 else {
Jim Fulton8a1a5942004-02-08 04:21:26 +00002674 PyErr_Clear();
Guido van Rossum036f9992003-02-21 22:02:54 +00002675 state = PyObject_GetAttrString(obj, "__dict__");
2676 if (state == NULL) {
2677 PyErr_Clear();
2678 state = Py_None;
2679 Py_INCREF(state);
2680 }
2681 names = slotnames(cls);
2682 if (names == NULL)
2683 goto end;
2684 if (names != Py_None) {
2685 assert(PyList_Check(names));
2686 slots = PyDict_New();
2687 if (slots == NULL)
2688 goto end;
2689 n = 0;
2690 /* Can't pre-compute the list size; the list
2691 is stored on the class so accessible to other
2692 threads, which may be run by DECREF */
2693 for (i = 0; i < PyList_GET_SIZE(names); i++) {
2694 PyObject *name, *value;
2695 name = PyList_GET_ITEM(names, i);
2696 value = PyObject_GetAttr(obj, name);
2697 if (value == NULL)
2698 PyErr_Clear();
2699 else {
2700 int err = PyDict_SetItem(slots, name,
2701 value);
2702 Py_DECREF(value);
2703 if (err)
2704 goto end;
2705 n++;
2706 }
2707 }
2708 if (n) {
2709 state = Py_BuildValue("(NO)", state, slots);
2710 if (state == NULL)
2711 goto end;
2712 }
2713 }
2714 }
2715
2716 if (!PyList_Check(obj)) {
2717 listitems = Py_None;
2718 Py_INCREF(listitems);
2719 }
2720 else {
2721 listitems = PyObject_GetIter(obj);
2722 if (listitems == NULL)
2723 goto end;
2724 }
2725
2726 if (!PyDict_Check(obj)) {
2727 dictitems = Py_None;
2728 Py_INCREF(dictitems);
2729 }
2730 else {
2731 dictitems = PyObject_CallMethod(obj, "iteritems", "");
2732 if (dictitems == NULL)
2733 goto end;
2734 }
2735
2736 copy_reg = import_copy_reg();
2737 if (copy_reg == NULL)
2738 goto end;
2739 newobj = PyObject_GetAttrString(copy_reg, "__newobj__");
2740 if (newobj == NULL)
2741 goto end;
2742
2743 n = PyTuple_GET_SIZE(args);
2744 args2 = PyTuple_New(n+1);
2745 if (args2 == NULL)
2746 goto end;
2747 PyTuple_SET_ITEM(args2, 0, cls);
2748 cls = NULL;
2749 for (i = 0; i < n; i++) {
2750 PyObject *v = PyTuple_GET_ITEM(args, i);
2751 Py_INCREF(v);
2752 PyTuple_SET_ITEM(args2, i+1, v);
2753 }
2754
Raymond Hettinger8ae46892003-10-12 19:09:37 +00002755 res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
Guido van Rossum036f9992003-02-21 22:02:54 +00002756
2757 end:
2758 Py_XDECREF(cls);
2759 Py_XDECREF(args);
2760 Py_XDECREF(args2);
Jeremy Hyltond06483c2003-04-09 21:01:42 +00002761 Py_XDECREF(slots);
Guido van Rossum036f9992003-02-21 22:02:54 +00002762 Py_XDECREF(state);
2763 Py_XDECREF(names);
2764 Py_XDECREF(listitems);
2765 Py_XDECREF(dictitems);
2766 Py_XDECREF(copy_reg);
2767 Py_XDECREF(newobj);
2768 return res;
2769}
2770
2771static PyObject *
2772object_reduce_ex(PyObject *self, PyObject *args)
2773{
2774 /* Call copy_reg._reduce_ex(self, proto) */
2775 PyObject *reduce, *copy_reg, *res;
2776 int proto = 0;
2777
2778 if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
2779 return NULL;
2780
2781 reduce = PyObject_GetAttrString(self, "__reduce__");
2782 if (reduce == NULL)
2783 PyErr_Clear();
2784 else {
2785 PyObject *cls, *clsreduce, *objreduce;
2786 int override;
2787 cls = PyObject_GetAttrString(self, "__class__");
2788 if (cls == NULL) {
2789 Py_DECREF(reduce);
2790 return NULL;
2791 }
2792 clsreduce = PyObject_GetAttrString(cls, "__reduce__");
2793 Py_DECREF(cls);
2794 if (clsreduce == NULL) {
2795 Py_DECREF(reduce);
2796 return NULL;
2797 }
2798 objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
2799 "__reduce__");
2800 override = (clsreduce != objreduce);
2801 Py_DECREF(clsreduce);
2802 if (override) {
2803 res = PyObject_CallObject(reduce, NULL);
2804 Py_DECREF(reduce);
2805 return res;
2806 }
2807 else
2808 Py_DECREF(reduce);
2809 }
2810
2811 if (proto >= 2)
2812 return reduce_2(self);
2813
2814 copy_reg = import_copy_reg();
Guido van Rossum3926a632001-09-25 16:25:58 +00002815 if (!copy_reg)
2816 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00002817
Guido van Rossumc53f0092003-02-18 22:05:12 +00002818 res = PyEval_CallMethod(copy_reg, "_reduce_ex", "(Oi)", self, proto);
Guido van Rossum3926a632001-09-25 16:25:58 +00002819 Py_DECREF(copy_reg);
Guido van Rossum036f9992003-02-21 22:02:54 +00002820
Guido van Rossum3926a632001-09-25 16:25:58 +00002821 return res;
2822}
2823
2824static PyMethodDef object_methods[] = {
Guido van Rossumc53f0092003-02-18 22:05:12 +00002825 {"__reduce_ex__", object_reduce_ex, METH_VARARGS,
2826 PyDoc_STR("helper for pickle")},
2827 {"__reduce__", object_reduce_ex, METH_VARARGS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002828 PyDoc_STR("helper for pickle")},
Guido van Rossum3926a632001-09-25 16:25:58 +00002829 {0}
2830};
2831
Guido van Rossum036f9992003-02-21 22:02:54 +00002832
Tim Peters6d6c1a32001-08-02 04:15:00 +00002833PyTypeObject PyBaseObject_Type = {
2834 PyObject_HEAD_INIT(&PyType_Type)
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002835 0, /* ob_size */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002836 "object", /* tp_name */
2837 sizeof(PyObject), /* tp_basicsize */
2838 0, /* tp_itemsize */
Georg Brandl347b3002006-03-30 11:57:00 +00002839 object_dealloc, /* tp_dealloc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002840 0, /* tp_print */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002841 0, /* tp_getattr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002842 0, /* tp_setattr */
2843 0, /* tp_compare */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002844 object_repr, /* tp_repr */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002845 0, /* tp_as_number */
2846 0, /* tp_as_sequence */
2847 0, /* tp_as_mapping */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002848 object_hash, /* tp_hash */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002849 0, /* tp_call */
Guido van Rossumb8f63662001-08-15 23:57:02 +00002850 object_str, /* tp_str */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002851 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum13d52f02001-08-10 21:24:08 +00002852 PyObject_GenericSetAttr, /* tp_setattro */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002853 0, /* tp_as_buffer */
2854 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Neal Norwitz5dc2a372002-08-13 22:19:13 +00002855 PyDoc_STR("The most base type"), /* tp_doc */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002856 0, /* tp_traverse */
2857 0, /* tp_clear */
2858 0, /* tp_richcompare */
2859 0, /* tp_weaklistoffset */
2860 0, /* tp_iter */
2861 0, /* tp_iternext */
Guido van Rossum3926a632001-09-25 16:25:58 +00002862 object_methods, /* tp_methods */
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002863 0, /* tp_members */
2864 object_getsets, /* tp_getset */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002865 0, /* tp_base */
2866 0, /* tp_dict */
2867 0, /* tp_descr_get */
2868 0, /* tp_descr_set */
2869 0, /* tp_dictoffset */
2870 object_init, /* tp_init */
2871 PyType_GenericAlloc, /* tp_alloc */
Guido van Rossum298e4212003-02-13 16:30:16 +00002872 object_new, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00002873 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002874};
2875
2876
2877/* Initialize the __dict__ in a type object */
2878
2879static int
2880add_methods(PyTypeObject *type, PyMethodDef *meth)
2881{
Guido van Rossum687ae002001-10-15 22:03:32 +00002882 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002883
2884 for (; meth->ml_name != NULL; meth++) {
2885 PyObject *descr;
Raymond Hettinger8f5cdaa2003-12-13 11:26:12 +00002886 if (PyDict_GetItemString(dict, meth->ml_name) &&
2887 !(meth->ml_flags & METH_COEXIST))
2888 continue;
Fred Drake7bf97152002-03-28 05:33:33 +00002889 if (meth->ml_flags & METH_CLASS) {
2890 if (meth->ml_flags & METH_STATIC) {
2891 PyErr_SetString(PyExc_ValueError,
2892 "method cannot be both class and static");
2893 return -1;
2894 }
Tim Petersbca1cbc2002-12-09 22:56:13 +00002895 descr = PyDescr_NewClassMethod(type, meth);
Fred Drake7bf97152002-03-28 05:33:33 +00002896 }
2897 else if (meth->ml_flags & METH_STATIC) {
Guido van Rossum9af48ff2003-02-11 17:12:46 +00002898 PyObject *cfunc = PyCFunction_New(meth, NULL);
2899 if (cfunc == NULL)
2900 return -1;
2901 descr = PyStaticMethod_New(cfunc);
2902 Py_DECREF(cfunc);
Fred Drake7bf97152002-03-28 05:33:33 +00002903 }
2904 else {
2905 descr = PyDescr_NewMethod(type, meth);
2906 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002907 if (descr == NULL)
2908 return -1;
Fred Drake7bf97152002-03-28 05:33:33 +00002909 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002910 return -1;
2911 Py_DECREF(descr);
2912 }
2913 return 0;
2914}
2915
2916static int
Guido van Rossum6f799372001-09-20 20:46:19 +00002917add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002918{
Guido van Rossum687ae002001-10-15 22:03:32 +00002919 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002920
2921 for (; memb->name != NULL; memb++) {
2922 PyObject *descr;
2923 if (PyDict_GetItemString(dict, memb->name))
2924 continue;
2925 descr = PyDescr_NewMember(type, memb);
2926 if (descr == NULL)
2927 return -1;
2928 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
2929 return -1;
2930 Py_DECREF(descr);
2931 }
2932 return 0;
2933}
2934
2935static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00002936add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002937{
Guido van Rossum687ae002001-10-15 22:03:32 +00002938 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002939
2940 for (; gsp->name != NULL; gsp++) {
2941 PyObject *descr;
2942 if (PyDict_GetItemString(dict, gsp->name))
2943 continue;
2944 descr = PyDescr_NewGetSet(type, gsp);
2945
2946 if (descr == NULL)
2947 return -1;
2948 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
2949 return -1;
2950 Py_DECREF(descr);
2951 }
2952 return 0;
2953}
2954
Guido van Rossum13d52f02001-08-10 21:24:08 +00002955static void
2956inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00002957{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00002958 Py_ssize_t oldsize, newsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002959
Guido van Rossum13d52f02001-08-10 21:24:08 +00002960 /* Special flag magic */
2961 if (!type->tp_as_buffer && base->tp_as_buffer) {
2962 type->tp_flags &= ~Py_TPFLAGS_HAVE_GETCHARBUFFER;
2963 type->tp_flags |=
2964 base->tp_flags & Py_TPFLAGS_HAVE_GETCHARBUFFER;
2965 }
2966 if (!type->tp_as_sequence && base->tp_as_sequence) {
2967 type->tp_flags &= ~Py_TPFLAGS_HAVE_SEQUENCE_IN;
2968 type->tp_flags |= base->tp_flags & Py_TPFLAGS_HAVE_SEQUENCE_IN;
2969 }
2970 if ((type->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS) !=
2971 (base->tp_flags & Py_TPFLAGS_HAVE_INPLACEOPS)) {
2972 if ((!type->tp_as_number && base->tp_as_number) ||
2973 (!type->tp_as_sequence && base->tp_as_sequence)) {
2974 type->tp_flags &= ~Py_TPFLAGS_HAVE_INPLACEOPS;
2975 if (!type->tp_as_number && !type->tp_as_sequence) {
2976 type->tp_flags |= base->tp_flags &
2977 Py_TPFLAGS_HAVE_INPLACEOPS;
2978 }
2979 }
2980 /* Wow */
2981 }
2982 if (!type->tp_as_number && base->tp_as_number) {
2983 type->tp_flags &= ~Py_TPFLAGS_CHECKTYPES;
2984 type->tp_flags |= base->tp_flags & Py_TPFLAGS_CHECKTYPES;
2985 }
2986
2987 /* Copying basicsize is connected to the GC flags */
Neil Schemenauerc806c882001-08-29 23:54:54 +00002988 oldsize = base->tp_basicsize;
2989 newsize = type->tp_basicsize ? type->tp_basicsize : oldsize;
2990 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
2991 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
Guido van Rossum13d52f02001-08-10 21:24:08 +00002992 (type->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE/*GC slots exist*/) &&
2993 (!type->tp_traverse && !type->tp_clear)) {
Neil Schemenauerc806c882001-08-29 23:54:54 +00002994 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum13d52f02001-08-10 21:24:08 +00002995 if (type->tp_traverse == NULL)
2996 type->tp_traverse = base->tp_traverse;
2997 if (type->tp_clear == NULL)
2998 type->tp_clear = base->tp_clear;
2999 }
3000 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
Guido van Rossumf884b742001-12-17 17:14:22 +00003001 /* The condition below could use some explanation.
3002 It appears that tp_new is not inherited for static types
3003 whose base class is 'object'; this seems to be a precaution
3004 so that old extension types don't suddenly become
3005 callable (object.__new__ wouldn't insure the invariants
3006 that the extension type's own factory function ensures).
3007 Heap types, of course, are under our control, so they do
3008 inherit tp_new; static extension types that specify some
3009 other built-in type as the default are considered
3010 new-style-aware so they also inherit object.__new__. */
Guido van Rossum13d52f02001-08-10 21:24:08 +00003011 if (base != &PyBaseObject_Type ||
3012 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
3013 if (type->tp_new == NULL)
3014 type->tp_new = base->tp_new;
3015 }
3016 }
Neil Schemenauerc806c882001-08-29 23:54:54 +00003017 type->tp_basicsize = newsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00003018
3019 /* Copy other non-function slots */
3020
3021#undef COPYVAL
3022#define COPYVAL(SLOT) \
3023 if (type->SLOT == 0) type->SLOT = base->SLOT
3024
3025 COPYVAL(tp_itemsize);
3026 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_WEAKREFS) {
3027 COPYVAL(tp_weaklistoffset);
3028 }
3029 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
3030 COPYVAL(tp_dictoffset);
3031 }
Neal Norwitzee3a1b52007-02-25 19:44:48 +00003032
3033 /* Setup fast subclass flags */
3034 if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException))
3035 type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
3036 else if (PyType_IsSubtype(base, &PyType_Type))
3037 type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
3038 else if (PyType_IsSubtype(base, &PyInt_Type))
3039 type->tp_flags |= Py_TPFLAGS_INT_SUBCLASS;
3040 else if (PyType_IsSubtype(base, &PyLong_Type))
3041 type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
3042 else if (PyType_IsSubtype(base, &PyString_Type))
3043 type->tp_flags |= Py_TPFLAGS_STRING_SUBCLASS;
3044 else if (PyType_IsSubtype(base, &PyUnicode_Type))
3045 type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
3046 else if (PyType_IsSubtype(base, &PyTuple_Type))
3047 type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
3048 else if (PyType_IsSubtype(base, &PyList_Type))
3049 type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
3050 else if (PyType_IsSubtype(base, &PyDict_Type))
3051 type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003052}
3053
3054static void
3055inherit_slots(PyTypeObject *type, PyTypeObject *base)
3056{
3057 PyTypeObject *basebase;
3058
3059#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00003060#undef COPYSLOT
3061#undef COPYNUM
3062#undef COPYSEQ
3063#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00003064#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00003065
3066#define SLOTDEFINED(SLOT) \
3067 (base->SLOT != 0 && \
3068 (basebase == NULL || base->SLOT != basebase->SLOT))
3069
Tim Peters6d6c1a32001-08-02 04:15:00 +00003070#define COPYSLOT(SLOT) \
Guido van Rossum13d52f02001-08-10 21:24:08 +00003071 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00003072
3073#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
3074#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
3075#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003076#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003077
Guido van Rossum13d52f02001-08-10 21:24:08 +00003078 /* This won't inherit indirect slots (from tp_as_number etc.)
3079 if type doesn't provide the space. */
3080
3081 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
3082 basebase = base->tp_base;
3083 if (basebase->tp_as_number == NULL)
3084 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003085 COPYNUM(nb_add);
3086 COPYNUM(nb_subtract);
3087 COPYNUM(nb_multiply);
3088 COPYNUM(nb_divide);
3089 COPYNUM(nb_remainder);
3090 COPYNUM(nb_divmod);
3091 COPYNUM(nb_power);
3092 COPYNUM(nb_negative);
3093 COPYNUM(nb_positive);
3094 COPYNUM(nb_absolute);
3095 COPYNUM(nb_nonzero);
3096 COPYNUM(nb_invert);
3097 COPYNUM(nb_lshift);
3098 COPYNUM(nb_rshift);
3099 COPYNUM(nb_and);
3100 COPYNUM(nb_xor);
3101 COPYNUM(nb_or);
3102 COPYNUM(nb_coerce);
3103 COPYNUM(nb_int);
3104 COPYNUM(nb_long);
3105 COPYNUM(nb_float);
3106 COPYNUM(nb_oct);
3107 COPYNUM(nb_hex);
3108 COPYNUM(nb_inplace_add);
3109 COPYNUM(nb_inplace_subtract);
3110 COPYNUM(nb_inplace_multiply);
3111 COPYNUM(nb_inplace_divide);
3112 COPYNUM(nb_inplace_remainder);
3113 COPYNUM(nb_inplace_power);
3114 COPYNUM(nb_inplace_lshift);
3115 COPYNUM(nb_inplace_rshift);
3116 COPYNUM(nb_inplace_and);
3117 COPYNUM(nb_inplace_xor);
3118 COPYNUM(nb_inplace_or);
Guido van Rossumdc91b992001-08-08 22:26:22 +00003119 if (base->tp_flags & Py_TPFLAGS_CHECKTYPES) {
3120 COPYNUM(nb_true_divide);
3121 COPYNUM(nb_floor_divide);
3122 COPYNUM(nb_inplace_true_divide);
3123 COPYNUM(nb_inplace_floor_divide);
3124 }
Guido van Rossum38fff8c2006-03-07 18:50:55 +00003125 if (base->tp_flags & Py_TPFLAGS_HAVE_INDEX) {
3126 COPYNUM(nb_index);
3127 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003128 }
3129
Guido van Rossum13d52f02001-08-10 21:24:08 +00003130 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
3131 basebase = base->tp_base;
3132 if (basebase->tp_as_sequence == NULL)
3133 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003134 COPYSEQ(sq_length);
3135 COPYSEQ(sq_concat);
3136 COPYSEQ(sq_repeat);
3137 COPYSEQ(sq_item);
3138 COPYSEQ(sq_slice);
3139 COPYSEQ(sq_ass_item);
3140 COPYSEQ(sq_ass_slice);
3141 COPYSEQ(sq_contains);
3142 COPYSEQ(sq_inplace_concat);
3143 COPYSEQ(sq_inplace_repeat);
3144 }
3145
Guido van Rossum13d52f02001-08-10 21:24:08 +00003146 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
3147 basebase = base->tp_base;
3148 if (basebase->tp_as_mapping == NULL)
3149 basebase = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003150 COPYMAP(mp_length);
3151 COPYMAP(mp_subscript);
3152 COPYMAP(mp_ass_subscript);
3153 }
3154
Tim Petersfc57ccb2001-10-12 02:38:24 +00003155 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
3156 basebase = base->tp_base;
3157 if (basebase->tp_as_buffer == NULL)
3158 basebase = NULL;
3159 COPYBUF(bf_getreadbuffer);
3160 COPYBUF(bf_getwritebuffer);
3161 COPYBUF(bf_getsegcount);
3162 COPYBUF(bf_getcharbuffer);
3163 }
3164
Guido van Rossum13d52f02001-08-10 21:24:08 +00003165 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003166
Tim Peters6d6c1a32001-08-02 04:15:00 +00003167 COPYSLOT(tp_dealloc);
3168 COPYSLOT(tp_print);
3169 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
3170 type->tp_getattr = base->tp_getattr;
3171 type->tp_getattro = base->tp_getattro;
3172 }
3173 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
3174 type->tp_setattr = base->tp_setattr;
3175 type->tp_setattro = base->tp_setattro;
3176 }
3177 /* tp_compare see tp_richcompare */
3178 COPYSLOT(tp_repr);
Guido van Rossumb8f63662001-08-15 23:57:02 +00003179 /* tp_hash see tp_richcompare */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003180 COPYSLOT(tp_call);
3181 COPYSLOT(tp_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003182 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_RICHCOMPARE) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00003183 if (type->tp_compare == NULL &&
3184 type->tp_richcompare == NULL &&
3185 type->tp_hash == NULL)
3186 {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003187 type->tp_compare = base->tp_compare;
3188 type->tp_richcompare = base->tp_richcompare;
Guido van Rossumb8f63662001-08-15 23:57:02 +00003189 type->tp_hash = base->tp_hash;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003190 }
3191 }
3192 else {
3193 COPYSLOT(tp_compare);
3194 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003195 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_ITER) {
3196 COPYSLOT(tp_iter);
3197 COPYSLOT(tp_iternext);
3198 }
3199 if (type->tp_flags & base->tp_flags & Py_TPFLAGS_HAVE_CLASS) {
3200 COPYSLOT(tp_descr_get);
3201 COPYSLOT(tp_descr_set);
3202 COPYSLOT(tp_dictoffset);
3203 COPYSLOT(tp_init);
3204 COPYSLOT(tp_alloc);
Guido van Rossumcc8fe042002-04-05 17:10:16 +00003205 COPYSLOT(tp_is_gc);
Tim Peters3cfe7542003-05-21 21:29:48 +00003206 if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
3207 (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
3208 /* They agree about gc. */
3209 COPYSLOT(tp_free);
3210 }
3211 else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3212 type->tp_free == NULL &&
3213 base->tp_free == _PyObject_Del) {
3214 /* A bit of magic to plug in the correct default
3215 * tp_free function when a derived class adds gc,
3216 * didn't define tp_free, and the base uses the
3217 * default non-gc tp_free.
3218 */
3219 type->tp_free = PyObject_GC_Del;
3220 }
3221 /* else they didn't agree about gc, and there isn't something
3222 * obvious to be done -- the type is on its own.
3223 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003224 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003225}
3226
Jeremy Hylton938ace62002-07-17 16:30:39 +00003227static int add_operators(PyTypeObject *);
Guido van Rossum13d52f02001-08-10 21:24:08 +00003228
Tim Peters6d6c1a32001-08-02 04:15:00 +00003229int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00003230PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003231{
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003232 PyObject *dict, *bases;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003233 PyTypeObject *base;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003234 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003235
Guido van Rossumcab05802002-06-10 15:29:03 +00003236 if (type->tp_flags & Py_TPFLAGS_READY) {
3237 assert(type->tp_dict != NULL);
Guido van Rossumd614f972001-08-10 17:39:49 +00003238 return 0;
Guido van Rossumcab05802002-06-10 15:29:03 +00003239 }
Guido van Rossumd614f972001-08-10 17:39:49 +00003240 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00003241
3242 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003243
Tim Peters36eb4df2003-03-23 03:33:13 +00003244#ifdef Py_TRACE_REFS
3245 /* PyType_Ready is the closest thing we have to a choke point
3246 * for type objects, so is the best place I can think of to try
3247 * to get type objects into the doubly-linked list of all objects.
3248 * Still, not all type objects go thru PyType_Ready.
3249 */
Tim Peters7571a0f2003-03-23 17:52:28 +00003250 _Py_AddToAllObjects((PyObject *)type, 0);
Tim Peters36eb4df2003-03-23 03:33:13 +00003251#endif
3252
Tim Peters6d6c1a32001-08-02 04:15:00 +00003253 /* Initialize tp_base (defaults to BaseObject unless that's us) */
3254 base = type->tp_base;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003255 if (base == NULL && type != &PyBaseObject_Type) {
Tim Peters6d6c1a32001-08-02 04:15:00 +00003256 base = type->tp_base = &PyBaseObject_Type;
Martin v. Löwisbf608752004-08-18 13:16:54 +00003257 Py_INCREF(base);
3258 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003259
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003260 /* Now the only way base can still be NULL is if type is
3261 * &PyBaseObject_Type.
3262 */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003263
Guido van Rossum323a9cf2002-08-14 17:26:30 +00003264 /* Initialize the base class */
3265 if (base && base->tp_dict == NULL) {
3266 if (PyType_Ready(base) < 0)
3267 goto error;
3268 }
3269
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003270 /* Initialize ob_type if NULL. This means extensions that want to be
Guido van Rossum0986d822002-04-08 01:38:42 +00003271 compilable separately on Windows can call PyType_Ready() instead of
3272 initializing the ob_type field of their type objects. */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003273 /* The test for base != NULL is really unnecessary, since base is only
3274 NULL when type is &PyBaseObject_Type, and we know its ob_type is
3275 not NULL (it's initialized to &PyType_Type). But coverity doesn't
3276 know that. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003277 if (type->ob_type == NULL && base != NULL)
Guido van Rossum0986d822002-04-08 01:38:42 +00003278 type->ob_type = base->ob_type;
3279
Tim Peters6d6c1a32001-08-02 04:15:00 +00003280 /* Initialize tp_bases */
3281 bases = type->tp_bases;
3282 if (bases == NULL) {
3283 if (base == NULL)
3284 bases = PyTuple_New(0);
3285 else
Raymond Hettinger8ae46892003-10-12 19:09:37 +00003286 bases = PyTuple_Pack(1, base);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003287 if (bases == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003288 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003289 type->tp_bases = bases;
3290 }
3291
Guido van Rossum687ae002001-10-15 22:03:32 +00003292 /* Initialize tp_dict */
3293 dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003294 if (dict == NULL) {
3295 dict = PyDict_New();
3296 if (dict == NULL)
Guido van Rossumd614f972001-08-10 17:39:49 +00003297 goto error;
Guido van Rossum687ae002001-10-15 22:03:32 +00003298 type->tp_dict = dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003299 }
3300
Guido van Rossum687ae002001-10-15 22:03:32 +00003301 /* Add type-specific descriptors to tp_dict */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003302 if (add_operators(type) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003303 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003304 if (type->tp_methods != NULL) {
3305 if (add_methods(type, type->tp_methods) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003306 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003307 }
3308 if (type->tp_members != NULL) {
3309 if (add_members(type, type->tp_members) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003310 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003311 }
3312 if (type->tp_getset != NULL) {
3313 if (add_getset(type, type->tp_getset) < 0)
Guido van Rossumd614f972001-08-10 17:39:49 +00003314 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003315 }
3316
Tim Peters6d6c1a32001-08-02 04:15:00 +00003317 /* Calculate method resolution order */
3318 if (mro_internal(type) < 0) {
Guido van Rossumd614f972001-08-10 17:39:49 +00003319 goto error;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003320 }
3321
Guido van Rossum13d52f02001-08-10 21:24:08 +00003322 /* Inherit special flags from dominant base */
3323 if (type->tp_base != NULL)
3324 inherit_special(type, type->tp_base);
3325
Tim Peters6d6c1a32001-08-02 04:15:00 +00003326 /* Initialize tp_dict properly */
Guido van Rossum2f3ca6e2001-10-15 21:05:10 +00003327 bases = type->tp_mro;
3328 assert(bases != NULL);
3329 assert(PyTuple_Check(bases));
3330 n = PyTuple_GET_SIZE(bases);
3331 for (i = 1; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003332 PyObject *b = PyTuple_GET_ITEM(bases, i);
3333 if (PyType_Check(b))
3334 inherit_slots(type, (PyTypeObject *)b);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003335 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003336
Tim Peters3cfe7542003-05-21 21:29:48 +00003337 /* Sanity check for tp_free. */
3338 if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
3339 (type->tp_free == NULL || type->tp_free == PyObject_Del)) {
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003340 /* This base class needs to call tp_free, but doesn't have
3341 * one, or its tp_free is for non-gc'ed objects.
3342 */
Tim Peters3cfe7542003-05-21 21:29:48 +00003343 PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
3344 "gc and is a base type but has inappropriate "
3345 "tp_free slot",
3346 type->tp_name);
3347 goto error;
3348 }
3349
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003350 /* if the type dictionary doesn't contain a __doc__, set it from
3351 the tp_doc slot.
3352 */
3353 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
3354 if (type->tp_doc != NULL) {
3355 PyObject *doc = PyString_FromString(type->tp_doc);
Neal Norwitze1fdb322006-07-21 05:32:28 +00003356 if (doc == NULL)
3357 goto error;
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003358 PyDict_SetItemString(type->tp_dict, "__doc__", doc);
3359 Py_DECREF(doc);
3360 } else {
Guido van Rossumd4641072002-04-03 02:13:37 +00003361 PyDict_SetItemString(type->tp_dict,
3362 "__doc__", Py_None);
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003363 }
3364 }
3365
Guido van Rossum13d52f02001-08-10 21:24:08 +00003366 /* Some more special stuff */
3367 base = type->tp_base;
3368 if (base != NULL) {
3369 if (type->tp_as_number == NULL)
3370 type->tp_as_number = base->tp_as_number;
3371 if (type->tp_as_sequence == NULL)
3372 type->tp_as_sequence = base->tp_as_sequence;
3373 if (type->tp_as_mapping == NULL)
3374 type->tp_as_mapping = base->tp_as_mapping;
Guido van Rossumeea47182003-02-11 20:39:59 +00003375 if (type->tp_as_buffer == NULL)
3376 type->tp_as_buffer = base->tp_as_buffer;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003377 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003378
Guido van Rossum1c450732001-10-08 15:18:27 +00003379 /* Link into each base class's list of subclasses */
3380 bases = type->tp_bases;
3381 n = PyTuple_GET_SIZE(bases);
3382 for (i = 0; i < n; i++) {
Tim Petersa91e9642001-11-14 23:32:33 +00003383 PyObject *b = PyTuple_GET_ITEM(bases, i);
3384 if (PyType_Check(b) &&
3385 add_subclass((PyTypeObject *)b, type) < 0)
Guido van Rossum1c450732001-10-08 15:18:27 +00003386 goto error;
3387 }
3388
Guido van Rossum13d52f02001-08-10 21:24:08 +00003389 /* All done -- set the ready flag */
Guido van Rossumd614f972001-08-10 17:39:49 +00003390 assert(type->tp_dict != NULL);
3391 type->tp_flags =
3392 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003393 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00003394
3395 error:
3396 type->tp_flags &= ~Py_TPFLAGS_READYING;
3397 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003398}
3399
Guido van Rossum1c450732001-10-08 15:18:27 +00003400static int
3401add_subclass(PyTypeObject *base, PyTypeObject *type)
3402{
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003403 Py_ssize_t i;
3404 int result;
Anthony Baxtera6286212006-04-11 07:42:36 +00003405 PyObject *list, *ref, *newobj;
Guido van Rossum1c450732001-10-08 15:18:27 +00003406
3407 list = base->tp_subclasses;
3408 if (list == NULL) {
3409 base->tp_subclasses = list = PyList_New(0);
3410 if (list == NULL)
3411 return -1;
3412 }
3413 assert(PyList_Check(list));
Anthony Baxtera6286212006-04-11 07:42:36 +00003414 newobj = PyWeakref_NewRef((PyObject *)type, NULL);
Guido van Rossum1c450732001-10-08 15:18:27 +00003415 i = PyList_GET_SIZE(list);
3416 while (--i >= 0) {
3417 ref = PyList_GET_ITEM(list, i);
3418 assert(PyWeakref_CheckRef(ref));
Guido van Rossum3930bc32002-10-18 13:51:49 +00003419 if (PyWeakref_GET_OBJECT(ref) == Py_None)
Anthony Baxtera6286212006-04-11 07:42:36 +00003420 return PyList_SetItem(list, i, newobj);
Guido van Rossum1c450732001-10-08 15:18:27 +00003421 }
Anthony Baxtera6286212006-04-11 07:42:36 +00003422 result = PyList_Append(list, newobj);
3423 Py_DECREF(newobj);
Martin v. Löwiseb079f12006-02-16 14:32:27 +00003424 return result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003425}
3426
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003427static void
3428remove_subclass(PyTypeObject *base, PyTypeObject *type)
3429{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003430 Py_ssize_t i;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003431 PyObject *list, *ref;
3432
3433 list = base->tp_subclasses;
3434 if (list == NULL) {
3435 return;
3436 }
3437 assert(PyList_Check(list));
3438 i = PyList_GET_SIZE(list);
3439 while (--i >= 0) {
3440 ref = PyList_GET_ITEM(list, i);
3441 assert(PyWeakref_CheckRef(ref));
3442 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
3443 /* this can't fail, right? */
3444 PySequence_DelItem(list, i);
3445 return;
3446 }
3447 }
3448}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003449
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003450static int
3451check_num_args(PyObject *ob, int n)
3452{
3453 if (!PyTuple_CheckExact(ob)) {
3454 PyErr_SetString(PyExc_SystemError,
3455 "PyArg_UnpackTuple() argument list is not a tuple");
3456 return 0;
3457 }
3458 if (n == PyTuple_GET_SIZE(ob))
3459 return 1;
3460 PyErr_Format(
3461 PyExc_TypeError,
Martin v. Löwis2c95cc62006-02-16 06:54:25 +00003462 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003463 return 0;
3464}
3465
Tim Peters6d6c1a32001-08-02 04:15:00 +00003466/* Generic wrappers for overloadable 'operators' such as __getitem__ */
3467
3468/* There's a wrapper *function* for each distinct function typedef used
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003469 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
Tim Peters6d6c1a32001-08-02 04:15:00 +00003470 wrapper *table* for each distinct operation (e.g. __len__, __add__).
3471 Most tables have only one entry; the tables for binary operators have two
3472 entries, one regular and one with reversed arguments. */
3473
3474static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003475wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003476{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003477 lenfunc func = (lenfunc)wrapped;
3478 Py_ssize_t res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003479
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003480 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003481 return NULL;
3482 res = (*func)(self);
3483 if (res == -1 && PyErr_Occurred())
3484 return NULL;
3485 return PyInt_FromLong((long)res);
3486}
3487
Tim Peters6d6c1a32001-08-02 04:15:00 +00003488static PyObject *
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003489wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
3490{
3491 inquiry func = (inquiry)wrapped;
3492 int res;
3493
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003494 if (!check_num_args(args, 0))
Raymond Hettingerf34f2642003-10-11 17:29:04 +00003495 return NULL;
3496 res = (*func)(self);
3497 if (res == -1 && PyErr_Occurred())
3498 return NULL;
3499 return PyBool_FromLong((long)res);
3500}
3501
3502static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003503wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
3504{
3505 binaryfunc func = (binaryfunc)wrapped;
3506 PyObject *other;
3507
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003508 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003509 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003510 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003511 return (*func)(self, other);
3512}
3513
3514static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003515wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
3516{
3517 binaryfunc func = (binaryfunc)wrapped;
3518 PyObject *other;
3519
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003520 if (!check_num_args(args, 1))
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003521 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003522 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003523 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003524 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003525 Py_INCREF(Py_NotImplemented);
3526 return Py_NotImplemented;
3527 }
3528 return (*func)(self, other);
3529}
3530
3531static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00003532wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3533{
3534 binaryfunc func = (binaryfunc)wrapped;
3535 PyObject *other;
3536
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003537 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003538 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003539 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003540 if (!(self->ob_type->tp_flags & Py_TPFLAGS_CHECKTYPES) &&
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003541 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00003542 Py_INCREF(Py_NotImplemented);
3543 return Py_NotImplemented;
3544 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003545 return (*func)(other, self);
3546}
3547
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003548static PyObject *
3549wrap_coercefunc(PyObject *self, PyObject *args, void *wrapped)
3550{
3551 coercion func = (coercion)wrapped;
3552 PyObject *other, *res;
3553 int ok;
3554
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003555 if (!check_num_args(args, 1))
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003556 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003557 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00003558 ok = func(&self, &other);
3559 if (ok < 0)
3560 return NULL;
3561 if (ok > 0) {
3562 Py_INCREF(Py_NotImplemented);
3563 return Py_NotImplemented;
3564 }
3565 res = PyTuple_New(2);
3566 if (res == NULL) {
3567 Py_DECREF(self);
3568 Py_DECREF(other);
3569 return NULL;
3570 }
3571 PyTuple_SET_ITEM(res, 0, self);
3572 PyTuple_SET_ITEM(res, 1, other);
3573 return res;
3574}
3575
Tim Peters6d6c1a32001-08-02 04:15:00 +00003576static PyObject *
3577wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
3578{
3579 ternaryfunc func = (ternaryfunc)wrapped;
3580 PyObject *other;
3581 PyObject *third = Py_None;
3582
3583 /* Note: This wrapper only works for __pow__() */
3584
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003585 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003586 return NULL;
3587 return (*func)(self, other, third);
3588}
3589
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003590static PyObject *
3591wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
3592{
3593 ternaryfunc func = (ternaryfunc)wrapped;
3594 PyObject *other;
3595 PyObject *third = Py_None;
3596
3597 /* Note: This wrapper only works for __pow__() */
3598
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003599 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00003600 return NULL;
3601 return (*func)(other, self, third);
3602}
3603
Tim Peters6d6c1a32001-08-02 04:15:00 +00003604static PyObject *
3605wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
3606{
3607 unaryfunc func = (unaryfunc)wrapped;
3608
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003609 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003610 return NULL;
3611 return (*func)(self);
3612}
3613
Tim Peters6d6c1a32001-08-02 04:15:00 +00003614static PyObject *
Armin Rigo314861c2006-03-30 14:04:02 +00003615wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003616{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003617 ssizeargfunc func = (ssizeargfunc)wrapped;
Armin Rigo314861c2006-03-30 14:04:02 +00003618 PyObject* o;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003619 Py_ssize_t i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003620
Armin Rigo314861c2006-03-30 14:04:02 +00003621 if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
3622 return NULL;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003623 i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
Armin Rigo314861c2006-03-30 14:04:02 +00003624 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00003625 return NULL;
3626 return (*func)(self, i);
3627}
3628
Martin v. Löwis18e16552006-02-15 17:27:45 +00003629static Py_ssize_t
Guido van Rossum5d815f32001-08-17 21:57:47 +00003630getindex(PyObject *self, PyObject *arg)
3631{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003632 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003633
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00003634 i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003635 if (i == -1 && PyErr_Occurred())
3636 return -1;
3637 if (i < 0) {
3638 PySequenceMethods *sq = self->ob_type->tp_as_sequence;
3639 if (sq && sq->sq_length) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00003640 Py_ssize_t n = (*sq->sq_length)(self);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003641 if (n < 0)
3642 return -1;
3643 i += n;
3644 }
3645 }
3646 return i;
3647}
3648
3649static PyObject *
3650wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
3651{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003652 ssizeargfunc func = (ssizeargfunc)wrapped;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003653 PyObject *arg;
Martin v. Löwis18e16552006-02-15 17:27:45 +00003654 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003655
Guido van Rossumf4593e02001-10-03 12:09:30 +00003656 if (PyTuple_GET_SIZE(args) == 1) {
3657 arg = PyTuple_GET_ITEM(args, 0);
3658 i = getindex(self, arg);
3659 if (i == -1 && PyErr_Occurred())
3660 return NULL;
3661 return (*func)(self, i);
3662 }
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003663 check_num_args(args, 1);
Guido van Rossumf4593e02001-10-03 12:09:30 +00003664 assert(PyErr_Occurred());
3665 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003666}
3667
Tim Peters6d6c1a32001-08-02 04:15:00 +00003668static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003669wrap_ssizessizeargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003670{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003671 ssizessizeargfunc func = (ssizessizeargfunc)wrapped;
3672 Py_ssize_t i, j;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003673
Martin v. Löwis18e16552006-02-15 17:27:45 +00003674 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003675 return NULL;
3676 return (*func)(self, i, j);
3677}
3678
Tim Peters6d6c1a32001-08-02 04:15:00 +00003679static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003680wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003681{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003682 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3683 Py_ssize_t i;
3684 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003685 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003686
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003687 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003688 return NULL;
3689 i = getindex(self, arg);
3690 if (i == -1 && PyErr_Occurred())
Tim Peters6d6c1a32001-08-02 04:15:00 +00003691 return NULL;
3692 res = (*func)(self, i, value);
3693 if (res == -1 && PyErr_Occurred())
3694 return NULL;
3695 Py_INCREF(Py_None);
3696 return Py_None;
3697}
3698
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003699static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00003700wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003701{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003702 ssizeobjargproc func = (ssizeobjargproc)wrapped;
3703 Py_ssize_t i;
3704 int res;
Guido van Rossum5d815f32001-08-17 21:57:47 +00003705 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003706
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003707 if (!check_num_args(args, 1))
Guido van Rossum5d815f32001-08-17 21:57:47 +00003708 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003709 arg = PyTuple_GET_ITEM(args, 0);
Guido van Rossum5d815f32001-08-17 21:57:47 +00003710 i = getindex(self, arg);
3711 if (i == -1 && PyErr_Occurred())
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003712 return NULL;
3713 res = (*func)(self, i, NULL);
3714 if (res == -1 && PyErr_Occurred())
3715 return NULL;
3716 Py_INCREF(Py_None);
3717 return Py_None;
3718}
3719
Tim Peters6d6c1a32001-08-02 04:15:00 +00003720static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003721wrap_ssizessizeobjargproc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003722{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003723 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3724 Py_ssize_t i, j;
3725 int res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003726 PyObject *value;
3727
Martin v. Löwis18e16552006-02-15 17:27:45 +00003728 if (!PyArg_ParseTuple(args, "nnO", &i, &j, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003729 return NULL;
3730 res = (*func)(self, i, j, value);
3731 if (res == -1 && PyErr_Occurred())
3732 return NULL;
3733 Py_INCREF(Py_None);
3734 return Py_None;
3735}
3736
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003737static PyObject *
3738wrap_delslice(PyObject *self, PyObject *args, void *wrapped)
3739{
Martin v. Löwis18e16552006-02-15 17:27:45 +00003740 ssizessizeobjargproc func = (ssizessizeobjargproc)wrapped;
3741 Py_ssize_t i, j;
3742 int res;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003743
Martin v. Löwis18e16552006-02-15 17:27:45 +00003744 if (!PyArg_ParseTuple(args, "nn", &i, &j))
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003745 return NULL;
3746 res = (*func)(self, i, j, NULL);
3747 if (res == -1 && PyErr_Occurred())
3748 return NULL;
3749 Py_INCREF(Py_None);
3750 return Py_None;
3751}
3752
Tim Peters6d6c1a32001-08-02 04:15:00 +00003753/* XXX objobjproc is a misnomer; should be objargpred */
3754static PyObject *
3755wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
3756{
3757 objobjproc func = (objobjproc)wrapped;
3758 int res;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003759 PyObject *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003760
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003761 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003762 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003763 value = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003764 res = (*func)(self, value);
3765 if (res == -1 && PyErr_Occurred())
3766 return NULL;
Guido van Rossum22c3dda2003-10-09 03:46:35 +00003767 else
3768 return PyBool_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003769}
3770
Tim Peters6d6c1a32001-08-02 04:15:00 +00003771static PyObject *
3772wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
3773{
3774 objobjargproc func = (objobjargproc)wrapped;
3775 int res;
3776 PyObject *key, *value;
3777
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003778 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003779 return NULL;
3780 res = (*func)(self, key, value);
3781 if (res == -1 && PyErr_Occurred())
3782 return NULL;
3783 Py_INCREF(Py_None);
3784 return Py_None;
3785}
3786
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003787static PyObject *
3788wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
3789{
3790 objobjargproc func = (objobjargproc)wrapped;
3791 int res;
3792 PyObject *key;
3793
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003794 if (!check_num_args(args, 1))
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003795 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003796 key = PyTuple_GET_ITEM(args, 0);
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00003797 res = (*func)(self, key, NULL);
3798 if (res == -1 && PyErr_Occurred())
3799 return NULL;
3800 Py_INCREF(Py_None);
3801 return Py_None;
3802}
3803
Tim Peters6d6c1a32001-08-02 04:15:00 +00003804static PyObject *
3805wrap_cmpfunc(PyObject *self, PyObject *args, void *wrapped)
3806{
3807 cmpfunc func = (cmpfunc)wrapped;
3808 int res;
3809 PyObject *other;
3810
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003811 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003812 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003813 other = PyTuple_GET_ITEM(args, 0);
Guido van Rossum3d45d8f2001-09-24 18:47:40 +00003814 if (other->ob_type->tp_compare != func &&
3815 !PyType_IsSubtype(other->ob_type, self->ob_type)) {
Guido van Rossumceccae52001-09-18 20:03:57 +00003816 PyErr_Format(
3817 PyExc_TypeError,
3818 "%s.__cmp__(x,y) requires y to be a '%s', not a '%s'",
3819 self->ob_type->tp_name,
3820 self->ob_type->tp_name,
3821 other->ob_type->tp_name);
3822 return NULL;
3823 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003824 res = (*func)(self, other);
3825 if (PyErr_Occurred())
3826 return NULL;
3827 return PyInt_FromLong((long)res);
3828}
3829
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003830/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
Guido van Rossum52b27052003-04-15 20:05:10 +00003831 This is called the Carlo Verre hack after its discoverer. */
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003832static int
3833hackcheck(PyObject *self, setattrofunc func, char *what)
3834{
3835 PyTypeObject *type = self->ob_type;
3836 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
3837 type = type->tp_base;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00003838 /* If type is NULL now, this is a really weird type.
3839 In the spirit of backwards compatibility (?), just shut up. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003840 if (type && type->tp_setattro != func) {
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003841 PyErr_Format(PyExc_TypeError,
3842 "can't apply this %s to %s object",
3843 what,
3844 type->tp_name);
3845 return 0;
3846 }
3847 return 1;
3848}
3849
Tim Peters6d6c1a32001-08-02 04:15:00 +00003850static PyObject *
3851wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
3852{
3853 setattrofunc func = (setattrofunc)wrapped;
3854 int res;
3855 PyObject *name, *value;
3856
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003857 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003858 return NULL;
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003859 if (!hackcheck(self, func, "__setattr__"))
3860 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003861 res = (*func)(self, name, value);
3862 if (res < 0)
3863 return NULL;
3864 Py_INCREF(Py_None);
3865 return Py_None;
3866}
3867
3868static PyObject *
3869wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
3870{
3871 setattrofunc func = (setattrofunc)wrapped;
3872 int res;
3873 PyObject *name;
3874
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003875 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003876 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003877 name = PyTuple_GET_ITEM(args, 0);
Guido van Rossum4dcdb782003-04-14 21:46:03 +00003878 if (!hackcheck(self, func, "__delattr__"))
3879 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003880 res = (*func)(self, name, NULL);
3881 if (res < 0)
3882 return NULL;
3883 Py_INCREF(Py_None);
3884 return Py_None;
3885}
3886
Tim Peters6d6c1a32001-08-02 04:15:00 +00003887static PyObject *
3888wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
3889{
3890 hashfunc func = (hashfunc)wrapped;
3891 long res;
3892
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003893 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003894 return NULL;
3895 res = (*func)(self);
3896 if (res == -1 && PyErr_Occurred())
3897 return NULL;
3898 return PyInt_FromLong(res);
3899}
3900
Tim Peters6d6c1a32001-08-02 04:15:00 +00003901static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00003902wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003903{
3904 ternaryfunc func = (ternaryfunc)wrapped;
3905
Guido van Rossumc8e56452001-10-22 00:43:43 +00003906 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003907}
3908
Tim Peters6d6c1a32001-08-02 04:15:00 +00003909static PyObject *
3910wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
3911{
3912 richcmpfunc func = (richcmpfunc)wrapped;
3913 PyObject *other;
3914
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003915 if (!check_num_args(args, 1))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003916 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003917 other = PyTuple_GET_ITEM(args, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003918 return (*func)(self, other, op);
3919}
3920
3921#undef RICHCMP_WRAPPER
3922#define RICHCMP_WRAPPER(NAME, OP) \
3923static PyObject * \
3924richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
3925{ \
3926 return wrap_richcmpfunc(self, args, wrapped, OP); \
3927}
3928
Jack Jansen8e938b42001-08-08 15:29:49 +00003929RICHCMP_WRAPPER(lt, Py_LT)
3930RICHCMP_WRAPPER(le, Py_LE)
3931RICHCMP_WRAPPER(eq, Py_EQ)
3932RICHCMP_WRAPPER(ne, Py_NE)
3933RICHCMP_WRAPPER(gt, Py_GT)
3934RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003935
Tim Peters6d6c1a32001-08-02 04:15:00 +00003936static PyObject *
3937wrap_next(PyObject *self, PyObject *args, void *wrapped)
3938{
3939 unaryfunc func = (unaryfunc)wrapped;
3940 PyObject *res;
3941
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003942 if (!check_num_args(args, 0))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003943 return NULL;
3944 res = (*func)(self);
3945 if (res == NULL && !PyErr_Occurred())
3946 PyErr_SetNone(PyExc_StopIteration);
3947 return res;
3948}
3949
Tim Peters6d6c1a32001-08-02 04:15:00 +00003950static PyObject *
3951wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
3952{
3953 descrgetfunc func = (descrgetfunc)wrapped;
3954 PyObject *obj;
3955 PyObject *type = NULL;
3956
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003957 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003958 return NULL;
Guido van Rossum82ed25c2003-02-11 16:25:43 +00003959 if (obj == Py_None)
3960 obj = NULL;
3961 if (type == Py_None)
3962 type = NULL;
3963 if (type == NULL &&obj == NULL) {
3964 PyErr_SetString(PyExc_TypeError,
3965 "__get__(None, None) is invalid");
3966 return NULL;
3967 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003968 return (*func)(self, obj, type);
3969}
3970
Tim Peters6d6c1a32001-08-02 04:15:00 +00003971static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00003972wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003973{
3974 descrsetfunc func = (descrsetfunc)wrapped;
3975 PyObject *obj, *value;
3976 int ret;
3977
Raymond Hettinger56bb16f2003-10-11 19:32:18 +00003978 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
Tim Peters6d6c1a32001-08-02 04:15:00 +00003979 return NULL;
3980 ret = (*func)(self, obj, value);
3981 if (ret < 0)
3982 return NULL;
3983 Py_INCREF(Py_None);
3984 return Py_None;
3985}
Guido van Rossum22b13872002-08-06 21:41:44 +00003986
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003987static PyObject *
3988wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
3989{
3990 descrsetfunc func = (descrsetfunc)wrapped;
3991 PyObject *obj;
3992 int ret;
3993
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003994 if (!check_num_args(args, 1))
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003995 return NULL;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003996 obj = PyTuple_GET_ITEM(args, 0);
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00003997 ret = (*func)(self, obj, NULL);
3998 if (ret < 0)
3999 return NULL;
4000 Py_INCREF(Py_None);
4001 return Py_None;
4002}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004003
Tim Peters6d6c1a32001-08-02 04:15:00 +00004004static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004005wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004006{
4007 initproc func = (initproc)wrapped;
4008
Guido van Rossumc8e56452001-10-22 00:43:43 +00004009 if (func(self, args, kwds) < 0)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004010 return NULL;
4011 Py_INCREF(Py_None);
4012 return Py_None;
4013}
4014
Tim Peters6d6c1a32001-08-02 04:15:00 +00004015static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004016tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004017{
Barry Warsaw60f01882001-08-22 19:24:42 +00004018 PyTypeObject *type, *subtype, *staticbase;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004019 PyObject *arg0, *res;
4020
4021 if (self == NULL || !PyType_Check(self))
4022 Py_FatalError("__new__() called with non-type 'self'");
4023 type = (PyTypeObject *)self;
4024 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004025 PyErr_Format(PyExc_TypeError,
4026 "%s.__new__(): not enough arguments",
4027 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004028 return NULL;
4029 }
4030 arg0 = PyTuple_GET_ITEM(args, 0);
4031 if (!PyType_Check(arg0)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004032 PyErr_Format(PyExc_TypeError,
4033 "%s.__new__(X): X is not a type object (%s)",
4034 type->tp_name,
4035 arg0->ob_type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004036 return NULL;
4037 }
4038 subtype = (PyTypeObject *)arg0;
4039 if (!PyType_IsSubtype(subtype, type)) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004040 PyErr_Format(PyExc_TypeError,
4041 "%s.__new__(%s): %s is not a subtype of %s",
4042 type->tp_name,
4043 subtype->tp_name,
4044 subtype->tp_name,
4045 type->tp_name);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004046 return NULL;
4047 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004048
4049 /* Check that the use doesn't do something silly and unsafe like
Tim Petersa427a2b2001-10-29 22:25:45 +00004050 object.__new__(dict). To do this, we check that the
Barry Warsaw60f01882001-08-22 19:24:42 +00004051 most derived base that's not a heap type is this type. */
4052 staticbase = subtype;
4053 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
4054 staticbase = staticbase->tp_base;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004055 /* If staticbase is NULL now, it is a really weird type.
4056 In the spirit of backwards compatibility (?), just shut up. */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00004057 if (staticbase && staticbase->tp_new != type->tp_new) {
Barry Warsaw60f01882001-08-22 19:24:42 +00004058 PyErr_Format(PyExc_TypeError,
4059 "%s.__new__(%s) is not safe, use %s.__new__()",
4060 type->tp_name,
4061 subtype->tp_name,
4062 staticbase == NULL ? "?" : staticbase->tp_name);
4063 return NULL;
4064 }
4065
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004066 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
4067 if (args == NULL)
4068 return NULL;
4069 res = type->tp_new(subtype, args, kwds);
4070 Py_DECREF(args);
4071 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004072}
4073
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004074static struct PyMethodDef tp_new_methoddef[] = {
4075 {"__new__", (PyCFunction)tp_new_wrapper, METH_KEYWORDS,
Neal Norwitz5dc2a372002-08-13 22:19:13 +00004076 PyDoc_STR("T.__new__(S, ...) -> "
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004077 "a new object with type S, a subtype of T")},
Tim Peters6d6c1a32001-08-02 04:15:00 +00004078 {0}
4079};
4080
4081static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004082add_tp_new_wrapper(PyTypeObject *type)
4083{
Guido van Rossumf040ede2001-08-07 16:40:56 +00004084 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004085
Guido van Rossum687ae002001-10-15 22:03:32 +00004086 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
Guido van Rossumf040ede2001-08-07 16:40:56 +00004087 return 0;
4088 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004089 if (func == NULL)
4090 return -1;
Raymond Hettinger8d726ee2004-06-25 22:24:35 +00004091 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
Raymond Hettingerd56cbe52004-06-25 22:17:39 +00004092 Py_DECREF(func);
4093 return -1;
4094 }
4095 Py_DECREF(func);
4096 return 0;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004097}
4098
Guido van Rossumf040ede2001-08-07 16:40:56 +00004099/* Slot wrappers that call the corresponding __foo__ slot. See comments
4100 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004101
Guido van Rossumdc91b992001-08-08 22:26:22 +00004102#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004103static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004104FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004105{ \
Guido van Rossum5592e4d2001-08-28 18:28:21 +00004106 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004107 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004108}
4109
Guido van Rossumdc91b992001-08-08 22:26:22 +00004110#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004111static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004112FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004113{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004114 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004115 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004116}
4117
Guido van Rossumcd118802003-01-06 22:57:47 +00004118/* Boolean helper for SLOT1BINFULL().
4119 right.__class__ is a nontrivial subclass of left.__class__. */
4120static int
4121method_is_overloaded(PyObject *left, PyObject *right, char *name)
4122{
4123 PyObject *a, *b;
4124 int ok;
4125
4126 b = PyObject_GetAttrString((PyObject *)(right->ob_type), name);
4127 if (b == NULL) {
4128 PyErr_Clear();
4129 /* If right doesn't have it, it's not overloaded */
4130 return 0;
4131 }
4132
4133 a = PyObject_GetAttrString((PyObject *)(left->ob_type), name);
4134 if (a == NULL) {
4135 PyErr_Clear();
4136 Py_DECREF(b);
4137 /* If right has it but left doesn't, it's overloaded */
4138 return 1;
4139 }
4140
4141 ok = PyObject_RichCompareBool(a, b, Py_NE);
4142 Py_DECREF(a);
4143 Py_DECREF(b);
4144 if (ok < 0) {
4145 PyErr_Clear();
4146 return 0;
4147 }
4148
4149 return ok;
4150}
4151
Guido van Rossumdc91b992001-08-08 22:26:22 +00004152
4153#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004154static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004155FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004156{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004157 static PyObject *cache_str, *rcache_str; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004158 int do_other = self->ob_type != other->ob_type && \
4159 other->ob_type->tp_as_number != NULL && \
4160 other->ob_type->tp_as_number->SLOTNAME == TESTFUNC; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004161 if (self->ob_type->tp_as_number != NULL && \
4162 self->ob_type->tp_as_number->SLOTNAME == TESTFUNC) { \
4163 PyObject *r; \
Guido van Rossum55f20992001-10-01 17:18:22 +00004164 if (do_other && \
Guido van Rossumcd118802003-01-06 22:57:47 +00004165 PyType_IsSubtype(other->ob_type, self->ob_type) && \
4166 method_is_overloaded(self, other, ROPSTR)) { \
Guido van Rossum55f20992001-10-01 17:18:22 +00004167 r = call_maybe( \
4168 other, ROPSTR, &rcache_str, "(O)", self); \
4169 if (r != Py_NotImplemented) \
4170 return r; \
4171 Py_DECREF(r); \
4172 do_other = 0; \
4173 } \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004174 r = call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004175 self, OPSTR, &cache_str, "(O)", other); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004176 if (r != Py_NotImplemented || \
4177 other->ob_type == self->ob_type) \
4178 return r; \
4179 Py_DECREF(r); \
4180 } \
Guido van Rossum55f20992001-10-01 17:18:22 +00004181 if (do_other) { \
Guido van Rossumf21c6be2001-09-14 17:51:50 +00004182 return call_maybe( \
Guido van Rossum717ce002001-09-14 16:58:08 +00004183 other, ROPSTR, &rcache_str, "(O)", self); \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004184 } \
4185 Py_INCREF(Py_NotImplemented); \
4186 return Py_NotImplemented; \
4187}
4188
4189#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
4190 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
4191
4192#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
4193static PyObject * \
4194FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
4195{ \
Guido van Rossum2730b132001-08-28 18:22:14 +00004196 static PyObject *cache_str; \
Guido van Rossum717ce002001-09-14 16:58:08 +00004197 return call_method(self, OPSTR, &cache_str, \
4198 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004199}
4200
Martin v. Löwis18e16552006-02-15 17:27:45 +00004201static Py_ssize_t
Tim Peters6d6c1a32001-08-02 04:15:00 +00004202slot_sq_length(PyObject *self)
4203{
Guido van Rossum2730b132001-08-28 18:22:14 +00004204 static PyObject *len_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004205 PyObject *res = call_method(self, "__len__", &len_str, "()");
Martin v. Löwis18e16552006-02-15 17:27:45 +00004206 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004207
4208 if (res == NULL)
4209 return -1;
Neal Norwitz1872b1c2006-08-12 18:44:06 +00004210 len = PyInt_AsSsize_t(res);
Guido van Rossum26111622001-10-01 16:42:49 +00004211 Py_DECREF(res);
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004212 if (len < 0) {
Armin Rigo7ccbca92006-10-04 12:17:45 +00004213 if (!PyErr_Occurred())
4214 PyErr_SetString(PyExc_ValueError,
4215 "__len__() should return >= 0");
Jeremy Hyltonf20fcf92002-07-25 16:06:15 +00004216 return -1;
4217 }
Guido van Rossum26111622001-10-01 16:42:49 +00004218 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004219}
4220
Guido van Rossumf4593e02001-10-03 12:09:30 +00004221/* Super-optimized version of slot_sq_item.
4222 Other slots could do the same... */
4223static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00004224slot_sq_item(PyObject *self, Py_ssize_t i)
Guido van Rossumf4593e02001-10-03 12:09:30 +00004225{
4226 static PyObject *getitem_str;
4227 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
4228 descrgetfunc f;
4229
4230 if (getitem_str == NULL) {
4231 getitem_str = PyString_InternFromString("__getitem__");
4232 if (getitem_str == NULL)
4233 return NULL;
4234 }
4235 func = _PyType_Lookup(self->ob_type, getitem_str);
4236 if (func != NULL) {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004237 if ((f = func->ob_type->tp_descr_get) == NULL)
4238 Py_INCREF(func);
Neal Norwitz673cd822002-10-18 16:33:13 +00004239 else {
Guido van Rossumf4593e02001-10-03 12:09:30 +00004240 func = f(func, self, (PyObject *)(self->ob_type));
Neal Norwitz673cd822002-10-18 16:33:13 +00004241 if (func == NULL) {
4242 return NULL;
4243 }
4244 }
Martin v. Löwiseb079f12006-02-16 14:32:27 +00004245 ival = PyInt_FromSsize_t(i);
Guido van Rossumf4593e02001-10-03 12:09:30 +00004246 if (ival != NULL) {
4247 args = PyTuple_New(1);
4248 if (args != NULL) {
4249 PyTuple_SET_ITEM(args, 0, ival);
4250 retval = PyObject_Call(func, args, NULL);
4251 Py_XDECREF(args);
4252 Py_XDECREF(func);
4253 return retval;
4254 }
4255 }
4256 }
4257 else {
4258 PyErr_SetObject(PyExc_AttributeError, getitem_str);
4259 }
4260 Py_XDECREF(args);
4261 Py_XDECREF(ival);
4262 Py_XDECREF(func);
4263 return NULL;
4264}
4265
Martin v. Löwis18e16552006-02-15 17:27:45 +00004266SLOT2(slot_sq_slice, "__getslice__", Py_ssize_t, Py_ssize_t, "nn")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004267
4268static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004269slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004270{
4271 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004272 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004273
4274 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004275 res = call_method(self, "__delitem__", &delitem_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004276 "(n)", index);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004277 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004278 res = call_method(self, "__setitem__", &setitem_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004279 "(nO)", index, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004280 if (res == NULL)
4281 return -1;
4282 Py_DECREF(res);
4283 return 0;
4284}
4285
4286static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004287slot_sq_ass_slice(PyObject *self, Py_ssize_t i, Py_ssize_t j, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004288{
4289 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004290 static PyObject *delslice_str, *setslice_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004291
4292 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004293 res = call_method(self, "__delslice__", &delslice_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004294 "(nn)", i, j);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004295 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004296 res = call_method(self, "__setslice__", &setslice_str,
Thomas Wouters4e908102006-04-21 11:26:56 +00004297 "(nnO)", i, j, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004298 if (res == NULL)
4299 return -1;
4300 Py_DECREF(res);
4301 return 0;
4302}
4303
4304static int
4305slot_sq_contains(PyObject *self, PyObject *value)
4306{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004307 PyObject *func, *res, *args;
Tim Petersbf9b2442003-03-23 05:35:36 +00004308 int result = -1;
4309
Guido van Rossum60718732001-08-28 17:47:51 +00004310 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004311
Guido van Rossum55f20992001-10-01 17:18:22 +00004312 func = lookup_maybe(self, "__contains__", &contains_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004313 if (func != NULL) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004314 args = PyTuple_Pack(1, value);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004315 if (args == NULL)
4316 res = NULL;
4317 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004318 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004319 Py_DECREF(args);
4320 }
4321 Py_DECREF(func);
Tim Petersbf9b2442003-03-23 05:35:36 +00004322 if (res != NULL) {
4323 result = PyObject_IsTrue(res);
4324 Py_DECREF(res);
4325 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004326 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004327 else if (! PyErr_Occurred()) {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004328 /* Possible results: -1 and 1 */
4329 result = (int)_PySequence_IterSearch(self, value,
Tim Petersbf9b2442003-03-23 05:35:36 +00004330 PY_ITERSEARCH_CONTAINS);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004331 }
Tim Petersbf9b2442003-03-23 05:35:36 +00004332 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004333}
4334
Tim Peters6d6c1a32001-08-02 04:15:00 +00004335#define slot_mp_length slot_sq_length
4336
Guido van Rossumdc91b992001-08-08 22:26:22 +00004337SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004338
4339static int
4340slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
4341{
4342 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004343 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004344
4345 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004346 res = call_method(self, "__delitem__", &delitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004347 "(O)", key);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004348 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004349 res = call_method(self, "__setitem__", &setitem_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004350 "(OO)", key, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004351 if (res == NULL)
4352 return -1;
4353 Py_DECREF(res);
4354 return 0;
4355}
4356
Guido van Rossumdc91b992001-08-08 22:26:22 +00004357SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
4358SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
4359SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
4360SLOT1BIN(slot_nb_divide, nb_divide, "__div__", "__rdiv__")
4361SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
4362SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
4363
Jeremy Hylton938ace62002-07-17 16:30:39 +00004364static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00004365
4366SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
4367 nb_power, "__pow__", "__rpow__")
4368
4369static PyObject *
4370slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
4371{
Guido van Rossum2730b132001-08-28 18:22:14 +00004372 static PyObject *pow_str;
4373
Guido van Rossumdc91b992001-08-08 22:26:22 +00004374 if (modulus == Py_None)
4375 return slot_nb_power_binary(self, other);
Guido van Rossum23094982002-06-10 14:30:43 +00004376 /* Three-arg power doesn't use __rpow__. But ternary_op
4377 can call this when the second argument's type uses
4378 slot_nb_power, so check before calling self.__pow__. */
4379 if (self->ob_type->tp_as_number != NULL &&
4380 self->ob_type->tp_as_number->nb_power == slot_nb_power) {
4381 return call_method(self, "__pow__", &pow_str,
4382 "(OO)", other, modulus);
4383 }
4384 Py_INCREF(Py_NotImplemented);
4385 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00004386}
4387
4388SLOT0(slot_nb_negative, "__neg__")
4389SLOT0(slot_nb_positive, "__pos__")
4390SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004391
4392static int
4393slot_nb_nonzero(PyObject *self)
4394{
Tim Petersea7f75d2002-12-07 21:39:16 +00004395 PyObject *func, *args;
Guido van Rossum60718732001-08-28 17:47:51 +00004396 static PyObject *nonzero_str, *len_str;
Tim Petersea7f75d2002-12-07 21:39:16 +00004397 int result = -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004398
Guido van Rossum55f20992001-10-01 17:18:22 +00004399 func = lookup_maybe(self, "__nonzero__", &nonzero_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004400 if (func == NULL) {
Guido van Rossum55f20992001-10-01 17:18:22 +00004401 if (PyErr_Occurred())
Guido van Rossumb8f63662001-08-15 23:57:02 +00004402 return -1;
Guido van Rossum55f20992001-10-01 17:18:22 +00004403 func = lookup_maybe(self, "__len__", &len_str);
Tim Petersea7f75d2002-12-07 21:39:16 +00004404 if (func == NULL)
4405 return PyErr_Occurred() ? -1 : 1;
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00004406 }
Tim Petersea7f75d2002-12-07 21:39:16 +00004407 args = PyTuple_New(0);
4408 if (args != NULL) {
4409 PyObject *temp = PyObject_Call(func, args, NULL);
4410 Py_DECREF(args);
4411 if (temp != NULL) {
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004412 if (PyInt_CheckExact(temp) || PyBool_Check(temp))
Jeremy Hylton090a3492003-06-27 16:46:45 +00004413 result = PyObject_IsTrue(temp);
4414 else {
4415 PyErr_Format(PyExc_TypeError,
4416 "__nonzero__ should return "
4417 "bool or int, returned %s",
4418 temp->ob_type->tp_name);
Jeremy Hylton3e3159c2003-06-27 17:38:27 +00004419 result = -1;
Jeremy Hylton090a3492003-06-27 16:46:45 +00004420 }
Tim Petersea7f75d2002-12-07 21:39:16 +00004421 Py_DECREF(temp);
Guido van Rossum55f20992001-10-01 17:18:22 +00004422 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004423 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004424 Py_DECREF(func);
Tim Petersea7f75d2002-12-07 21:39:16 +00004425 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004426}
4427
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004428
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004429static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004430slot_nb_index(PyObject *self)
4431{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004432 static PyObject *index_str;
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00004433 return call_method(self, "__index__", &index_str, "()");
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004434}
4435
4436
Guido van Rossumdc91b992001-08-08 22:26:22 +00004437SLOT0(slot_nb_invert, "__invert__")
4438SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
4439SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
4440SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
4441SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
4442SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004443
4444static int
4445slot_nb_coerce(PyObject **a, PyObject **b)
4446{
4447 static PyObject *coerce_str;
4448 PyObject *self = *a, *other = *b;
4449
4450 if (self->ob_type->tp_as_number != NULL &&
4451 self->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4452 PyObject *r;
4453 r = call_maybe(
4454 self, "__coerce__", &coerce_str, "(O)", other);
4455 if (r == NULL)
4456 return -1;
4457 if (r == Py_NotImplemented) {
4458 Py_DECREF(r);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004459 }
Guido van Rossum55f20992001-10-01 17:18:22 +00004460 else {
4461 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4462 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004463 "__coerce__ didn't return a 2-tuple");
Guido van Rossum55f20992001-10-01 17:18:22 +00004464 Py_DECREF(r);
4465 return -1;
4466 }
4467 *a = PyTuple_GET_ITEM(r, 0);
4468 Py_INCREF(*a);
4469 *b = PyTuple_GET_ITEM(r, 1);
4470 Py_INCREF(*b);
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004471 Py_DECREF(r);
Guido van Rossum55f20992001-10-01 17:18:22 +00004472 return 0;
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004473 }
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004474 }
4475 if (other->ob_type->tp_as_number != NULL &&
4476 other->ob_type->tp_as_number->nb_coerce == slot_nb_coerce) {
4477 PyObject *r;
4478 r = call_maybe(
4479 other, "__coerce__", &coerce_str, "(O)", self);
4480 if (r == NULL)
4481 return -1;
4482 if (r == Py_NotImplemented) {
4483 Py_DECREF(r);
4484 return 1;
4485 }
4486 if (!PyTuple_Check(r) || PyTuple_GET_SIZE(r) != 2) {
4487 PyErr_SetString(PyExc_TypeError,
4488 "__coerce__ didn't return a 2-tuple");
4489 Py_DECREF(r);
4490 return -1;
4491 }
4492 *a = PyTuple_GET_ITEM(r, 1);
4493 Py_INCREF(*a);
4494 *b = PyTuple_GET_ITEM(r, 0);
4495 Py_INCREF(*b);
4496 Py_DECREF(r);
4497 return 0;
4498 }
4499 return 1;
4500}
4501
Guido van Rossumdc91b992001-08-08 22:26:22 +00004502SLOT0(slot_nb_int, "__int__")
4503SLOT0(slot_nb_long, "__long__")
4504SLOT0(slot_nb_float, "__float__")
4505SLOT0(slot_nb_oct, "__oct__")
4506SLOT0(slot_nb_hex, "__hex__")
4507SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
4508SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
4509SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
4510SLOT1(slot_nb_inplace_divide, "__idiv__", PyObject *, "O")
4511SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
Martin v. Löwisfd963262007-02-09 12:19:32 +00004512/* Can't use SLOT1 here, because nb_inplace_power is ternary */
4513static PyObject *
4514slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
4515{
4516 static PyObject *cache_str;
4517 return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
4518}
Guido van Rossumdc91b992001-08-08 22:26:22 +00004519SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
4520SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
4521SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
4522SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
4523SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
4524SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
4525 "__floordiv__", "__rfloordiv__")
4526SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
4527SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
4528SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004529
4530static int
Guido van Rossumb8f63662001-08-15 23:57:02 +00004531half_compare(PyObject *self, PyObject *other)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004532{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004533 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004534 static PyObject *cmp_str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004535 Py_ssize_t c;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004536
Guido van Rossum60718732001-08-28 17:47:51 +00004537 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004538 if (func == NULL) {
4539 PyErr_Clear();
4540 }
4541 else {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004542 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004543 if (args == NULL)
4544 res = NULL;
4545 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004546 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004547 Py_DECREF(args);
4548 }
Raymond Hettingerab5dae32002-06-24 13:08:16 +00004549 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004550 if (res != Py_NotImplemented) {
4551 if (res == NULL)
4552 return -2;
4553 c = PyInt_AsLong(res);
4554 Py_DECREF(res);
4555 if (c == -1 && PyErr_Occurred())
4556 return -2;
4557 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
4558 }
4559 Py_DECREF(res);
4560 }
4561 return 2;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004562}
4563
Guido van Rossumab3b0342001-09-18 20:38:53 +00004564/* This slot is published for the benefit of try_3way_compare in object.c */
4565int
4566_PyObject_SlotCompare(PyObject *self, PyObject *other)
Guido van Rossumb8f63662001-08-15 23:57:02 +00004567{
4568 int c;
4569
Guido van Rossumab3b0342001-09-18 20:38:53 +00004570 if (self->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004571 c = half_compare(self, other);
4572 if (c <= 1)
4573 return c;
4574 }
Guido van Rossumab3b0342001-09-18 20:38:53 +00004575 if (other->ob_type->tp_compare == _PyObject_SlotCompare) {
Guido van Rossumb8f63662001-08-15 23:57:02 +00004576 c = half_compare(other, self);
4577 if (c < -1)
4578 return -2;
4579 if (c <= 1)
4580 return -c;
4581 }
4582 return (void *)self < (void *)other ? -1 :
4583 (void *)self > (void *)other ? 1 : 0;
4584}
4585
4586static PyObject *
4587slot_tp_repr(PyObject *self)
4588{
4589 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004590 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004591
Guido van Rossum60718732001-08-28 17:47:51 +00004592 func = lookup_method(self, "__repr__", &repr_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004593 if (func != NULL) {
4594 res = PyEval_CallObject(func, NULL);
4595 Py_DECREF(func);
4596 return res;
4597 }
Barry Warsaw7ce36942001-08-24 18:34:26 +00004598 PyErr_Clear();
4599 return PyString_FromFormat("<%s object at %p>",
4600 self->ob_type->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004601}
4602
4603static PyObject *
4604slot_tp_str(PyObject *self)
4605{
4606 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004607 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004608
Guido van Rossum60718732001-08-28 17:47:51 +00004609 func = lookup_method(self, "__str__", &str_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004610 if (func != NULL) {
4611 res = PyEval_CallObject(func, NULL);
4612 Py_DECREF(func);
4613 return res;
4614 }
4615 else {
4616 PyErr_Clear();
4617 return slot_tp_repr(self);
4618 }
4619}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004620
4621static long
4622slot_tp_hash(PyObject *self)
4623{
Tim Peters61ce0a92002-12-06 23:38:02 +00004624 PyObject *func;
Guido van Rossum60718732001-08-28 17:47:51 +00004625 static PyObject *hash_str, *eq_str, *cmp_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004626 long h;
4627
Guido van Rossum60718732001-08-28 17:47:51 +00004628 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004629
4630 if (func != NULL) {
Tim Peters61ce0a92002-12-06 23:38:02 +00004631 PyObject *res = PyEval_CallObject(func, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004632 Py_DECREF(func);
4633 if (res == NULL)
4634 return -1;
Martin v. Löwisab2f8f72006-08-09 07:57:39 +00004635 if (PyLong_Check(res))
Armin Rigo51fc8c42006-08-09 14:55:26 +00004636 h = PyLong_Type.tp_hash(res);
Martin v. Löwisab2f8f72006-08-09 07:57:39 +00004637 else
4638 h = PyInt_AsLong(res);
Tim Peters61ce0a92002-12-06 23:38:02 +00004639 Py_DECREF(res);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004640 }
4641 else {
4642 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004643 func = lookup_method(self, "__eq__", &eq_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004644 if (func == NULL) {
4645 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004646 func = lookup_method(self, "__cmp__", &cmp_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004647 }
4648 if (func != NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00004649 PyErr_Format(PyExc_TypeError, "unhashable type: '%.200s'",
4650 self->ob_type->tp_name);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004651 Py_DECREF(func);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004652 return -1;
4653 }
4654 PyErr_Clear();
4655 h = _Py_HashPointer((void *)self);
4656 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004657 if (h == -1 && !PyErr_Occurred())
4658 h = -2;
4659 return h;
4660}
4661
4662static PyObject *
4663slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
4664{
Guido van Rossum60718732001-08-28 17:47:51 +00004665 static PyObject *call_str;
4666 PyObject *meth = lookup_method(self, "__call__", &call_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004667 PyObject *res;
4668
4669 if (meth == NULL)
4670 return NULL;
Armin Rigo53c1692f2006-06-21 21:58:50 +00004671
4672 /* PyObject_Call() will end up calling slot_tp_call() again if
4673 the object returned for __call__ has __call__ itself defined
4674 upon it. This can be an infinite recursion if you set
4675 __call__ in a class to an instance of it. */
Neal Norwitzb1149842006-06-23 03:32:44 +00004676 if (Py_EnterRecursiveCall(" in __call__")) {
4677 Py_DECREF(meth);
Armin Rigo53c1692f2006-06-21 21:58:50 +00004678 return NULL;
Neal Norwitzb1149842006-06-23 03:32:44 +00004679 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004680 res = PyObject_Call(meth, args, kwds);
Armin Rigo53c1692f2006-06-21 21:58:50 +00004681 Py_LeaveRecursiveCall();
4682
Tim Peters6d6c1a32001-08-02 04:15:00 +00004683 Py_DECREF(meth);
4684 return res;
4685}
4686
Guido van Rossum14a6f832001-10-17 13:59:09 +00004687/* There are two slot dispatch functions for tp_getattro.
4688
4689 - slot_tp_getattro() is used when __getattribute__ is overridden
4690 but no __getattr__ hook is present;
4691
4692 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
4693
Guido van Rossumc334df52002-04-04 23:44:47 +00004694 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
4695 detects the absence of __getattr__ and then installs the simpler slot if
4696 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00004697
Tim Peters6d6c1a32001-08-02 04:15:00 +00004698static PyObject *
4699slot_tp_getattro(PyObject *self, PyObject *name)
4700{
Guido van Rossum14a6f832001-10-17 13:59:09 +00004701 static PyObject *getattribute_str = NULL;
4702 return call_method(self, "__getattribute__", &getattribute_str,
4703 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004704}
4705
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004706static PyObject *
4707slot_tp_getattr_hook(PyObject *self, PyObject *name)
4708{
4709 PyTypeObject *tp = self->ob_type;
4710 PyObject *getattr, *getattribute, *res;
4711 static PyObject *getattribute_str = NULL;
4712 static PyObject *getattr_str = NULL;
4713
4714 if (getattr_str == NULL) {
4715 getattr_str = PyString_InternFromString("__getattr__");
4716 if (getattr_str == NULL)
4717 return NULL;
4718 }
4719 if (getattribute_str == NULL) {
4720 getattribute_str =
4721 PyString_InternFromString("__getattribute__");
4722 if (getattribute_str == NULL)
4723 return NULL;
4724 }
4725 getattr = _PyType_Lookup(tp, getattr_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004726 if (getattr == NULL) {
Guido van Rossumd396b9c2001-10-13 20:02:41 +00004727 /* No __getattr__ hook: use a simpler dispatcher */
4728 tp->tp_getattro = slot_tp_getattro;
4729 return slot_tp_getattro(self, name);
4730 }
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004731 getattribute = _PyType_Lookup(tp, getattribute_str);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004732 if (getattribute == NULL ||
4733 (getattribute->ob_type == &PyWrapperDescr_Type &&
4734 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
4735 (void *)PyObject_GenericGetAttr))
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004736 res = PyObject_GenericGetAttr(self, name);
4737 else
Georg Brandl684fd0c2006-05-25 19:15:31 +00004738 res = PyObject_CallFunctionObjArgs(getattribute, self, name, NULL);
Guido van Rossum14a6f832001-10-17 13:59:09 +00004739 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004740 PyErr_Clear();
Georg Brandl684fd0c2006-05-25 19:15:31 +00004741 res = PyObject_CallFunctionObjArgs(getattr, self, name, NULL);
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004742 }
4743 return res;
4744}
4745
Tim Peters6d6c1a32001-08-02 04:15:00 +00004746static int
4747slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
4748{
4749 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004750 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004751
4752 if (value == NULL)
Guido van Rossum2730b132001-08-28 18:22:14 +00004753 res = call_method(self, "__delattr__", &delattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004754 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004755 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004756 res = call_method(self, "__setattr__", &setattr_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004757 "(OO)", name, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004758 if (res == NULL)
4759 return -1;
4760 Py_DECREF(res);
4761 return 0;
4762}
4763
4764/* Map rich comparison operators to their __xx__ namesakes */
4765static char *name_op[] = {
4766 "__lt__",
4767 "__le__",
4768 "__eq__",
4769 "__ne__",
4770 "__gt__",
4771 "__ge__",
4772};
4773
4774static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00004775half_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004776{
Guido van Rossumb8f63662001-08-15 23:57:02 +00004777 PyObject *func, *args, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004778 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00004779
Guido van Rossum60718732001-08-28 17:47:51 +00004780 func = lookup_method(self, name_op[op], &op_str[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004781 if (func == NULL) {
4782 PyErr_Clear();
4783 Py_INCREF(Py_NotImplemented);
4784 return Py_NotImplemented;
4785 }
Raymond Hettinger8ae46892003-10-12 19:09:37 +00004786 args = PyTuple_Pack(1, other);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004787 if (args == NULL)
4788 res = NULL;
4789 else {
Guido van Rossum717ce002001-09-14 16:58:08 +00004790 res = PyObject_Call(func, args, NULL);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004791 Py_DECREF(args);
4792 }
4793 Py_DECREF(func);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004794 return res;
4795}
4796
Guido van Rossumb8f63662001-08-15 23:57:02 +00004797static PyObject *
4798slot_tp_richcompare(PyObject *self, PyObject *other, int op)
4799{
4800 PyObject *res;
4801
4802 if (self->ob_type->tp_richcompare == slot_tp_richcompare) {
4803 res = half_richcompare(self, other, op);
4804 if (res != Py_NotImplemented)
4805 return res;
4806 Py_DECREF(res);
4807 }
4808 if (other->ob_type->tp_richcompare == slot_tp_richcompare) {
Tim Petersf4aca752004-09-23 02:39:37 +00004809 res = half_richcompare(other, self, _Py_SwappedOp[op]);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004810 if (res != Py_NotImplemented) {
4811 return res;
4812 }
4813 Py_DECREF(res);
4814 }
4815 Py_INCREF(Py_NotImplemented);
4816 return Py_NotImplemented;
4817}
4818
4819static PyObject *
4820slot_tp_iter(PyObject *self)
4821{
4822 PyObject *func, *res;
Guido van Rossum60718732001-08-28 17:47:51 +00004823 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004824
Guido van Rossum60718732001-08-28 17:47:51 +00004825 func = lookup_method(self, "__iter__", &iter_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004826 if (func != NULL) {
Guido van Rossum84b2bed2002-08-16 17:01:09 +00004827 PyObject *args;
4828 args = res = PyTuple_New(0);
4829 if (args != NULL) {
4830 res = PyObject_Call(func, args, NULL);
4831 Py_DECREF(args);
4832 }
4833 Py_DECREF(func);
4834 return res;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004835 }
4836 PyErr_Clear();
Guido van Rossum60718732001-08-28 17:47:51 +00004837 func = lookup_method(self, "__getitem__", &getitem_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004838 if (func == NULL) {
Georg Brandlccff7852006-06-18 22:17:29 +00004839 PyErr_Format(PyExc_TypeError,
4840 "'%.200s' object is not iterable",
4841 self->ob_type->tp_name);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004842 return NULL;
4843 }
4844 Py_DECREF(func);
4845 return PySeqIter_New(self);
4846}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004847
4848static PyObject *
4849slot_tp_iternext(PyObject *self)
4850{
Guido van Rossum2730b132001-08-28 18:22:14 +00004851 static PyObject *next_str;
Guido van Rossum717ce002001-09-14 16:58:08 +00004852 return call_method(self, "next", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00004853}
4854
Guido van Rossum1a493502001-08-17 16:47:50 +00004855static PyObject *
4856slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
4857{
4858 PyTypeObject *tp = self->ob_type;
4859 PyObject *get;
4860 static PyObject *get_str = NULL;
4861
4862 if (get_str == NULL) {
4863 get_str = PyString_InternFromString("__get__");
4864 if (get_str == NULL)
4865 return NULL;
4866 }
4867 get = _PyType_Lookup(tp, get_str);
4868 if (get == NULL) {
4869 /* Avoid further slowdowns */
4870 if (tp->tp_descr_get == slot_tp_descr_get)
4871 tp->tp_descr_get = NULL;
4872 Py_INCREF(self);
4873 return self;
4874 }
Guido van Rossum2c252392001-08-24 10:13:31 +00004875 if (obj == NULL)
4876 obj = Py_None;
4877 if (type == NULL)
4878 type = Py_None;
Georg Brandl684fd0c2006-05-25 19:15:31 +00004879 return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
Guido van Rossum1a493502001-08-17 16:47:50 +00004880}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004881
4882static int
4883slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
4884{
Guido van Rossum2c252392001-08-24 10:13:31 +00004885 PyObject *res;
Guido van Rossum2730b132001-08-28 18:22:14 +00004886 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00004887
4888 if (value == NULL)
Guido van Rossum1d5b3f22001-12-03 00:08:33 +00004889 res = call_method(self, "__delete__", &del_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004890 "(O)", target);
Guido van Rossum2c252392001-08-24 10:13:31 +00004891 else
Guido van Rossum2730b132001-08-28 18:22:14 +00004892 res = call_method(self, "__set__", &set_str,
Guido van Rossum717ce002001-09-14 16:58:08 +00004893 "(OO)", target, value);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004894 if (res == NULL)
4895 return -1;
4896 Py_DECREF(res);
4897 return 0;
4898}
4899
4900static int
4901slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
4902{
Guido van Rossum60718732001-08-28 17:47:51 +00004903 static PyObject *init_str;
4904 PyObject *meth = lookup_method(self, "__init__", &init_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004905 PyObject *res;
4906
4907 if (meth == NULL)
4908 return -1;
4909 res = PyObject_Call(meth, args, kwds);
4910 Py_DECREF(meth);
4911 if (res == NULL)
4912 return -1;
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004913 if (res != Py_None) {
Georg Brandlccff7852006-06-18 22:17:29 +00004914 PyErr_Format(PyExc_TypeError,
4915 "__init__() should return None, not '%.200s'",
4916 res->ob_type->tp_name);
Raymond Hettingerb67cc802005-03-03 16:45:19 +00004917 Py_DECREF(res);
4918 return -1;
4919 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00004920 Py_DECREF(res);
4921 return 0;
4922}
4923
4924static PyObject *
4925slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4926{
Guido van Rossum7bed2132002-08-08 21:57:53 +00004927 static PyObject *new_str;
4928 PyObject *func;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004929 PyObject *newargs, *x;
Martin v. Löwis18e16552006-02-15 17:27:45 +00004930 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004931
Guido van Rossum7bed2132002-08-08 21:57:53 +00004932 if (new_str == NULL) {
4933 new_str = PyString_InternFromString("__new__");
4934 if (new_str == NULL)
4935 return NULL;
4936 }
4937 func = PyObject_GetAttr((PyObject *)type, new_str);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004938 if (func == NULL)
4939 return NULL;
4940 assert(PyTuple_Check(args));
4941 n = PyTuple_GET_SIZE(args);
4942 newargs = PyTuple_New(n+1);
4943 if (newargs == NULL)
4944 return NULL;
4945 Py_INCREF(type);
4946 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
4947 for (i = 0; i < n; i++) {
4948 x = PyTuple_GET_ITEM(args, i);
4949 Py_INCREF(x);
4950 PyTuple_SET_ITEM(newargs, i+1, x);
4951 }
4952 x = PyObject_Call(func, newargs, kwds);
Guido van Rossum25d18072001-10-01 15:55:28 +00004953 Py_DECREF(newargs);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004954 Py_DECREF(func);
4955 return x;
4956}
4957
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004958static void
4959slot_tp_del(PyObject *self)
4960{
4961 static PyObject *del_str = NULL;
4962 PyObject *del, *res;
4963 PyObject *error_type, *error_value, *error_traceback;
4964
4965 /* Temporarily resurrect the object. */
4966 assert(self->ob_refcnt == 0);
4967 self->ob_refcnt = 1;
4968
4969 /* Save the current exception, if any. */
4970 PyErr_Fetch(&error_type, &error_value, &error_traceback);
4971
4972 /* Execute __del__ method, if any. */
4973 del = lookup_maybe(self, "__del__", &del_str);
4974 if (del != NULL) {
4975 res = PyEval_CallObject(del, NULL);
4976 if (res == NULL)
4977 PyErr_WriteUnraisable(del);
4978 else
4979 Py_DECREF(res);
4980 Py_DECREF(del);
4981 }
4982
4983 /* Restore the saved exception. */
4984 PyErr_Restore(error_type, error_value, error_traceback);
4985
4986 /* Undo the temporary resurrection; can't use DECREF here, it would
4987 * cause a recursive call.
4988 */
4989 assert(self->ob_refcnt > 0);
4990 if (--self->ob_refcnt == 0)
4991 return; /* this is the normal path out */
4992
4993 /* __del__ resurrected it! Make it look like the original Py_DECREF
4994 * never happened.
4995 */
4996 {
Martin v. Löwis725507b2006-03-07 12:08:51 +00004997 Py_ssize_t refcnt = self->ob_refcnt;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00004998 _Py_NewReference(self);
4999 self->ob_refcnt = refcnt;
5000 }
5001 assert(!PyType_IS_GC(self->ob_type) ||
5002 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
Michael W. Hudson3f3b6682004-08-03 10:21:03 +00005003 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
5004 * we need to undo that. */
5005 _Py_DEC_REFTOTAL;
5006 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
5007 * chain, so no more to do there.
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005008 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
5009 * _Py_NewReference bumped tp_allocs: both of those need to be
5010 * undone.
5011 */
5012#ifdef COUNT_ALLOCS
5013 --self->ob_type->tp_frees;
5014 --self->ob_type->tp_allocs;
5015#endif
5016}
5017
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005018
5019/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
Tim Petersbf9b2442003-03-23 05:35:36 +00005020 functions. The offsets here are relative to the 'PyHeapTypeObject'
Guido van Rossume5c691a2003-03-07 15:13:17 +00005021 structure, which incorporates the additional structures used for numbers,
5022 sequences and mappings.
5023 Note that multiple names may map to the same slot (e.g. __eq__,
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005024 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00005025 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
5026 terminated with an all-zero entry. (This table is further initialized and
5027 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005028
Guido van Rossum6d204072001-10-21 00:44:31 +00005029typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005030
5031#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00005032#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005033#undef ETSLOT
5034#undef SQSLOT
5035#undef MPSLOT
5036#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00005037#undef UNSLOT
5038#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005039#undef BINSLOT
5040#undef RBINSLOT
5041
Guido van Rossum6d204072001-10-21 00:44:31 +00005042#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005043 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5044 PyDoc_STR(DOC)}
Guido van Rossumc8e56452001-10-22 00:43:43 +00005045#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
5046 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005047 PyDoc_STR(DOC), FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00005048#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Guido van Rossume5c691a2003-03-07 15:13:17 +00005049 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
Neal Norwitzd47714a2002-08-13 19:01:38 +00005050 PyDoc_STR(DOC)}
Guido van Rossum6d204072001-10-21 00:44:31 +00005051#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5052 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
5053#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5054 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
5055#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5056 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
5057#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5058 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5059 "x." NAME "() <==> " DOC)
5060#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
5061 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5062 "x." NAME "(y) <==> x" DOC "y")
5063#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
5064 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5065 "x." NAME "(y) <==> x" DOC "y")
5066#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
5067 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5068 "x." NAME "(y) <==> y" DOC "x")
Anthony Baxter56616992005-06-03 14:12:21 +00005069#define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5070 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5071 "x." NAME "(y) <==> " DOC)
5072#define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
5073 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5074 "x." NAME "(y) <==> " DOC)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005075
5076static slotdef slotdefs[] = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00005077 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005078 "x.__len__() <==> len(x)"),
Armin Rigofd163f92005-12-29 15:59:19 +00005079 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
5080 The logic in abstract.c always falls back to nb_add/nb_multiply in
5081 this case. Defining both the nb_* and the sq_* slots to call the
5082 user-defined methods has unexpected side-effects, as shown by
5083 test_descr.notimplemented() */
5084 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005085 "x.__add__(y) <==> x+y"),
Armin Rigo314861c2006-03-30 14:04:02 +00005086 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005087 "x.__mul__(n) <==> x*n"),
Armin Rigo314861c2006-03-30 14:04:02 +00005088 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005089 "x.__rmul__(n) <==> n*x"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005090 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
5091 "x.__getitem__(y) <==> x[y]"),
Martin v. Löwis18e16552006-02-15 17:27:45 +00005092 SQSLOT("__getslice__", sq_slice, slot_sq_slice, wrap_ssizessizeargfunc,
Brett Cannon154da9b2003-05-20 02:30:04 +00005093 "x.__getslice__(i, j) <==> x[i:j]\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005094 \n\
5095 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005096 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005097 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005098 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
Brett Cannonbe67d872003-05-20 02:40:12 +00005099 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005100 SQSLOT("__setslice__", sq_ass_slice, slot_sq_ass_slice,
Martin v. Löwis18e16552006-02-15 17:27:45 +00005101 wrap_ssizessizeobjargproc,
Brett Cannonbe67d872003-05-20 02:40:12 +00005102 "x.__setslice__(i, j, y) <==> x[i:j]=y\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005103 \n\
5104 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005105 SQSLOT("__delslice__", sq_ass_slice, slot_sq_ass_slice, wrap_delslice,
Brett Cannonbe67d872003-05-20 02:40:12 +00005106 "x.__delslice__(i, j) <==> del x[i:j]\n\
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005107 \n\
5108 Use of negative indices is not supported."),
Guido van Rossum6d204072001-10-21 00:44:31 +00005109 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
5110 "x.__contains__(y) <==> y in x"),
Armin Rigofd163f92005-12-29 15:59:19 +00005111 SQSLOT("__iadd__", sq_inplace_concat, NULL,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005112 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
Armin Rigofd163f92005-12-29 15:59:19 +00005113 SQSLOT("__imul__", sq_inplace_repeat, NULL,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005114 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005115
Martin v. Löwis18e16552006-02-15 17:27:45 +00005116 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
Guido van Rossum6d204072001-10-21 00:44:31 +00005117 "x.__len__() <==> len(x)"),
Guido van Rossumfd38f8e2001-10-09 20:17:57 +00005118 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005119 wrap_binaryfunc,
5120 "x.__getitem__(y) <==> x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005121 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005122 wrap_objobjargproc,
5123 "x.__setitem__(i, y) <==> x[i]=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005124 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
Guido van Rossum6d204072001-10-21 00:44:31 +00005125 wrap_delitem,
5126 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005127
Guido van Rossum6d204072001-10-21 00:44:31 +00005128 BINSLOT("__add__", nb_add, slot_nb_add,
5129 "+"),
5130 RBINSLOT("__radd__", nb_add, slot_nb_add,
5131 "+"),
5132 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
5133 "-"),
5134 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
5135 "-"),
5136 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
5137 "*"),
5138 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
5139 "*"),
5140 BINSLOT("__div__", nb_divide, slot_nb_divide,
5141 "/"),
5142 RBINSLOT("__rdiv__", nb_divide, slot_nb_divide,
5143 "/"),
5144 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
5145 "%"),
5146 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
5147 "%"),
Anthony Baxter56616992005-06-03 14:12:21 +00005148 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005149 "divmod(x, y)"),
Anthony Baxter56616992005-06-03 14:12:21 +00005150 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
Guido van Rossum6d204072001-10-21 00:44:31 +00005151 "divmod(y, x)"),
5152 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
5153 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
5154 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
5155 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
5156 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
5157 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
5158 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
5159 "abs(x)"),
Raymond Hettingerf34f2642003-10-11 17:29:04 +00005160 UNSLOT("__nonzero__", nb_nonzero, slot_nb_nonzero, wrap_inquirypred,
Guido van Rossum6d204072001-10-21 00:44:31 +00005161 "x != 0"),
5162 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
5163 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
5164 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
5165 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
5166 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
5167 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
5168 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
5169 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
5170 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
5171 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
5172 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
5173 NBSLOT("__coerce__", nb_coerce, slot_nb_coerce, wrap_coercefunc,
5174 "x.__coerce__(y) <==> coerce(x, y)"),
5175 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
5176 "int(x)"),
5177 UNSLOT("__long__", nb_long, slot_nb_long, wrap_unaryfunc,
5178 "long(x)"),
5179 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
5180 "float(x)"),
5181 UNSLOT("__oct__", nb_oct, slot_nb_oct, wrap_unaryfunc,
5182 "oct(x)"),
5183 UNSLOT("__hex__", nb_hex, slot_nb_hex, wrap_unaryfunc,
5184 "hex(x)"),
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00005185 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
Guido van Rossum38fff8c2006-03-07 18:50:55 +00005186 "x[y:z] <==> x[y.__index__():z.__index__()]"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005187 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
5188 wrap_binaryfunc, "+"),
5189 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
5190 wrap_binaryfunc, "-"),
5191 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
5192 wrap_binaryfunc, "*"),
5193 IBSLOT("__idiv__", nb_inplace_divide, slot_nb_inplace_divide,
5194 wrap_binaryfunc, "/"),
5195 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
5196 wrap_binaryfunc, "%"),
5197 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
Guido van Rossum6e5680f2002-10-15 01:01:53 +00005198 wrap_binaryfunc, "**"),
Guido van Rossum6d204072001-10-21 00:44:31 +00005199 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
5200 wrap_binaryfunc, "<<"),
5201 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
5202 wrap_binaryfunc, ">>"),
5203 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
5204 wrap_binaryfunc, "&"),
5205 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
5206 wrap_binaryfunc, "^"),
5207 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
5208 wrap_binaryfunc, "|"),
5209 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5210 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5211 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
5212 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
5213 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
5214 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
5215 IBSLOT("__itruediv__", nb_inplace_true_divide,
5216 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005217
Guido van Rossum6d204072001-10-21 00:44:31 +00005218 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
5219 "x.__str__() <==> str(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005220 TPSLOT("__str__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005221 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
5222 "x.__repr__() <==> repr(x)"),
Guido van Rossumafe7a942001-10-29 14:33:44 +00005223 TPSLOT("__repr__", tp_print, NULL, NULL, ""),
Guido van Rossum6d204072001-10-21 00:44:31 +00005224 TPSLOT("__cmp__", tp_compare, _PyObject_SlotCompare, wrap_cmpfunc,
5225 "x.__cmp__(y) <==> cmp(x,y)"),
5226 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
5227 "x.__hash__() <==> hash(x)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005228 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
5229 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005230 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
Guido van Rossum6d204072001-10-21 00:44:31 +00005231 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
5232 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
5233 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
5234 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
5235 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
5236 "x.__setattr__('name', value) <==> x.name = value"),
5237 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
5238 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
5239 "x.__delattr__('name') <==> del x.name"),
5240 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
5241 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
5242 "x.__lt__(y) <==> x<y"),
5243 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
5244 "x.__le__(y) <==> x<=y"),
5245 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
5246 "x.__eq__(y) <==> x==y"),
5247 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
5248 "x.__ne__(y) <==> x!=y"),
5249 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
5250 "x.__gt__(y) <==> x>y"),
5251 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
5252 "x.__ge__(y) <==> x>=y"),
5253 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
5254 "x.__iter__() <==> iter(x)"),
5255 TPSLOT("next", tp_iternext, slot_tp_iternext, wrap_next,
5256 "x.next() -> the next value, or raise StopIteration"),
5257 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
5258 "descr.__get__(obj[, type]) -> value"),
5259 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
5260 "descr.__set__(obj, value)"),
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00005261 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
5262 wrap_descr_delete, "descr.__delete__(obj)"),
Guido van Rossumc8e56452001-10-22 00:43:43 +00005263 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
Guido van Rossum6d204072001-10-21 00:44:31 +00005264 "x.__init__(...) initializes x; "
Guido van Rossumc8e56452001-10-22 00:43:43 +00005265 "see x.__class__.__doc__ for signature",
5266 PyWrapperFlag_KEYWORDS),
5267 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005268 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005269 {NULL}
5270};
5271
Guido van Rossumc334df52002-04-04 23:44:47 +00005272/* Given a type pointer and an offset gotten from a slotdef entry, return a
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005273 pointer to the actual slot. This is not quite the same as simply adding
Guido van Rossumc334df52002-04-04 23:44:47 +00005274 the offset to the type pointer, since it takes care to indirect through the
5275 proper indirection pointer (as_buffer, etc.); it returns NULL if the
5276 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005277static void **
Martin v. Löwis18e16552006-02-15 17:27:45 +00005278slotptr(PyTypeObject *type, int ioffset)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005279{
5280 char *ptr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005281 long offset = ioffset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005282
Guido van Rossume5c691a2003-03-07 15:13:17 +00005283 /* Note: this depends on the order of the members of PyHeapTypeObject! */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005284 assert(offset >= 0);
Skip Montanaro429433b2006-04-18 00:35:43 +00005285 assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
5286 if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005287 ptr = (char *)type->tp_as_sequence;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005288 offset -= offsetof(PyHeapTypeObject, as_sequence);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005289 }
Skip Montanaro429433b2006-04-18 00:35:43 +00005290 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005291 ptr = (char *)type->tp_as_mapping;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005292 offset -= offsetof(PyHeapTypeObject, as_mapping);
Guido van Rossum09638c12002-06-13 19:17:46 +00005293 }
Skip Montanaro429433b2006-04-18 00:35:43 +00005294 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005295 ptr = (char *)type->tp_as_number;
Guido van Rossume5c691a2003-03-07 15:13:17 +00005296 offset -= offsetof(PyHeapTypeObject, as_number);
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005297 }
5298 else {
Martin v. Löwisee36d652006-04-11 09:08:02 +00005299 ptr = (char *)type;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005300 }
5301 if (ptr != NULL)
5302 ptr += offset;
5303 return (void **)ptr;
5304}
Guido van Rossumf040ede2001-08-07 16:40:56 +00005305
Guido van Rossumc334df52002-04-04 23:44:47 +00005306/* Length of array of slotdef pointers used to store slots with the
5307 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
5308 the same __name__, for any __name__. Since that's a static property, it is
5309 appropriate to declare fixed-size arrays for this. */
5310#define MAX_EQUIV 10
5311
5312/* Return a slot pointer for a given name, but ONLY if the attribute has
5313 exactly one slot function. The name must be an interned string. */
5314static void **
5315resolve_slotdups(PyTypeObject *type, PyObject *name)
5316{
5317 /* XXX Maybe this could be optimized more -- but is it worth it? */
5318
5319 /* pname and ptrs act as a little cache */
5320 static PyObject *pname;
5321 static slotdef *ptrs[MAX_EQUIV];
5322 slotdef *p, **pp;
5323 void **res, **ptr;
5324
5325 if (pname != name) {
5326 /* Collect all slotdefs that match name into ptrs. */
5327 pname = name;
5328 pp = ptrs;
5329 for (p = slotdefs; p->name_strobj; p++) {
5330 if (p->name_strobj == name)
5331 *pp++ = p;
5332 }
5333 *pp = NULL;
5334 }
5335
5336 /* Look in all matching slots of the type; if exactly one of these has
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005337 a filled-in slot, return its value. Otherwise return NULL. */
Guido van Rossumc334df52002-04-04 23:44:47 +00005338 res = NULL;
5339 for (pp = ptrs; *pp; pp++) {
5340 ptr = slotptr(type, (*pp)->offset);
5341 if (ptr == NULL || *ptr == NULL)
5342 continue;
5343 if (res != NULL)
5344 return NULL;
5345 res = ptr;
5346 }
5347 return res;
5348}
5349
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005350/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This
Guido van Rossumc334df52002-04-04 23:44:47 +00005351 does some incredibly complex thinking and then sticks something into the
5352 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
5353 interests, and then stores a generic wrapper or a specific function into
5354 the slot.) Return a pointer to the next slotdef with a different offset,
5355 because that's convenient for fixup_slot_dispatchers(). */
5356static slotdef *
5357update_one_slot(PyTypeObject *type, slotdef *p)
5358{
5359 PyObject *descr;
5360 PyWrapperDescrObject *d;
5361 void *generic = NULL, *specific = NULL;
5362 int use_generic = 0;
5363 int offset = p->offset;
5364 void **ptr = slotptr(type, offset);
5365
5366 if (ptr == NULL) {
5367 do {
5368 ++p;
5369 } while (p->offset == offset);
5370 return p;
5371 }
5372 do {
5373 descr = _PyType_Lookup(type, p->name_strobj);
5374 if (descr == NULL)
5375 continue;
5376 if (descr->ob_type == &PyWrapperDescr_Type) {
5377 void **tptr = resolve_slotdups(type, p->name_strobj);
5378 if (tptr == NULL || tptr == ptr)
5379 generic = p->function;
5380 d = (PyWrapperDescrObject *)descr;
5381 if (d->d_base->wrapper == p->wrapper &&
5382 PyType_IsSubtype(type, d->d_type))
5383 {
5384 if (specific == NULL ||
5385 specific == d->d_wrapped)
5386 specific = d->d_wrapped;
5387 else
5388 use_generic = 1;
5389 }
5390 }
Guido van Rossum721f62e2002-08-09 02:14:34 +00005391 else if (descr->ob_type == &PyCFunction_Type &&
5392 PyCFunction_GET_FUNCTION(descr) ==
5393 (PyCFunction)tp_new_wrapper &&
5394 strcmp(p->name, "__new__") == 0)
5395 {
5396 /* The __new__ wrapper is not a wrapper descriptor,
5397 so must be special-cased differently.
5398 If we don't do this, creating an instance will
5399 always use slot_tp_new which will look up
5400 __new__ in the MRO which will call tp_new_wrapper
5401 which will look through the base classes looking
5402 for a static base and call its tp_new (usually
5403 PyType_GenericNew), after performing various
5404 sanity checks and constructing a new argument
5405 list. Cut all that nonsense short -- this speeds
5406 up instance creation tremendously. */
Martin v. Löwisa94568a2003-05-10 07:36:56 +00005407 specific = (void *)type->tp_new;
Guido van Rossum721f62e2002-08-09 02:14:34 +00005408 /* XXX I'm not 100% sure that there isn't a hole
5409 in this reasoning that requires additional
5410 sanity checks. I'll buy the first person to
5411 point out a bug in this reasoning a beer. */
5412 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005413 else {
5414 use_generic = 1;
5415 generic = p->function;
5416 }
5417 } while ((++p)->offset == offset);
5418 if (specific && !use_generic)
5419 *ptr = specific;
5420 else
5421 *ptr = generic;
5422 return p;
5423}
5424
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005425/* In the type, update the slots whose slotdefs are gathered in the pp array.
5426 This is a callback for update_subclasses(). */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005427static int
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005428update_slots_callback(PyTypeObject *type, void *data)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005429{
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005430 slotdef **pp = (slotdef **)data;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005431
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005432 for (; *pp; pp++)
Guido van Rossumc334df52002-04-04 23:44:47 +00005433 update_one_slot(type, *pp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005434 return 0;
5435}
5436
Guido van Rossumc334df52002-04-04 23:44:47 +00005437/* Comparison function for qsort() to compare slotdefs by their offset, and
5438 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005439static int
5440slotdef_cmp(const void *aa, const void *bb)
5441{
5442 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
5443 int c = a->offset - b->offset;
5444 if (c != 0)
5445 return c;
5446 else
Martin v. Löwis18e16552006-02-15 17:27:45 +00005447 /* Cannot use a-b, as this gives off_t,
5448 which may lose precision when converted to int. */
5449 return (a > b) ? 1 : (a < b) ? -1 : 0;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005450}
5451
Guido van Rossumc334df52002-04-04 23:44:47 +00005452/* Initialize the slotdefs table by adding interned string objects for the
5453 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005454static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005455init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005456{
5457 slotdef *p;
5458 static int initialized = 0;
5459
5460 if (initialized)
5461 return;
5462 for (p = slotdefs; p->name; p++) {
5463 p->name_strobj = PyString_InternFromString(p->name);
5464 if (!p->name_strobj)
Guido van Rossumc334df52002-04-04 23:44:47 +00005465 Py_FatalError("Out of memory interning slotdef names");
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005466 }
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005467 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
5468 slotdef_cmp);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005469 initialized = 1;
5470}
5471
Guido van Rossumc334df52002-04-04 23:44:47 +00005472/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005473static int
5474update_slot(PyTypeObject *type, PyObject *name)
5475{
Guido van Rossumc334df52002-04-04 23:44:47 +00005476 slotdef *ptrs[MAX_EQUIV];
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005477 slotdef *p;
5478 slotdef **pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005479 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005480
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005481 init_slotdefs();
5482 pp = ptrs;
5483 for (p = slotdefs; p->name; p++) {
5484 /* XXX assume name is interned! */
5485 if (p->name_strobj == name)
5486 *pp++ = p;
5487 }
5488 *pp = NULL;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005489 for (pp = ptrs; *pp; pp++) {
5490 p = *pp;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005491 offset = p->offset;
5492 while (p > slotdefs && (p-1)->offset == offset)
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005493 --p;
Guido van Rossumb85a8b72001-10-16 17:00:48 +00005494 *pp = p;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005495 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005496 if (ptrs[0] == NULL)
5497 return 0; /* Not an attribute that affects any slots */
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005498 return update_subclasses(type, name,
5499 update_slots_callback, (void *)ptrs);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005500}
5501
Guido van Rossumc334df52002-04-04 23:44:47 +00005502/* Store the proper functions in the slot dispatches at class (type)
5503 definition time, based upon which operations the class overrides in its
5504 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00005505static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005506fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005507{
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005508 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005509
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005510 init_slotdefs();
Guido van Rossumc334df52002-04-04 23:44:47 +00005511 for (p = slotdefs; p->name; )
5512 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00005513}
Guido van Rossum705f0f52001-08-24 16:47:00 +00005514
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005515static void
5516update_all_slots(PyTypeObject* type)
5517{
5518 slotdef *p;
5519
5520 init_slotdefs();
5521 for (p = slotdefs; p->name; p++) {
5522 /* update_slot returns int but can't actually fail */
5523 update_slot(type, p->name_strobj);
5524 }
5525}
5526
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005527/* recurse_down_subclasses() and update_subclasses() are mutually
5528 recursive functions to call a callback for all subclasses,
5529 but refraining from recursing into subclasses that define 'name'. */
5530
5531static int
5532update_subclasses(PyTypeObject *type, PyObject *name,
5533 update_callback callback, void *data)
5534{
5535 if (callback(type, data) < 0)
5536 return -1;
5537 return recurse_down_subclasses(type, name, callback, data);
5538}
5539
5540static int
5541recurse_down_subclasses(PyTypeObject *type, PyObject *name,
5542 update_callback callback, void *data)
5543{
5544 PyTypeObject *subclass;
5545 PyObject *ref, *subclasses, *dict;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005546 Py_ssize_t i, n;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005547
5548 subclasses = type->tp_subclasses;
5549 if (subclasses == NULL)
5550 return 0;
5551 assert(PyList_Check(subclasses));
5552 n = PyList_GET_SIZE(subclasses);
5553 for (i = 0; i < n; i++) {
5554 ref = PyList_GET_ITEM(subclasses, i);
5555 assert(PyWeakref_CheckRef(ref));
5556 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
5557 assert(subclass != NULL);
5558 if ((PyObject *)subclass == Py_None)
5559 continue;
5560 assert(PyType_Check(subclass));
5561 /* Avoid recursing down into unaffected classes */
5562 dict = subclass->tp_dict;
5563 if (dict != NULL && PyDict_Check(dict) &&
5564 PyDict_GetItem(dict, name) != NULL)
5565 continue;
5566 if (update_subclasses(subclass, name, callback, data) < 0)
5567 return -1;
5568 }
5569 return 0;
5570}
5571
Guido van Rossum6d204072001-10-21 00:44:31 +00005572/* This function is called by PyType_Ready() to populate the type's
5573 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00005574 function slot (like tp_repr) that's defined in the type, one or more
5575 corresponding descriptors are added in the type's tp_dict dictionary
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005576 under the appropriate name (like __repr__). Some function slots
Guido van Rossum09638c12002-06-13 19:17:46 +00005577 cause more than one descriptor to be added (for example, the nb_add
5578 slot adds both __add__ and __radd__ descriptors) and some function
5579 slots compete for the same descriptor (for example both sq_item and
5580 mp_subscript generate a __getitem__ descriptor).
5581
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005582 In the latter case, the first slotdef entry encoutered wins. Since
Tim Petersbf9b2442003-03-23 05:35:36 +00005583 slotdef entries are sorted by the offset of the slot in the
Guido van Rossume5c691a2003-03-07 15:13:17 +00005584 PyHeapTypeObject, this gives us some control over disambiguating
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005585 between competing slots: the members of PyHeapTypeObject are listed
5586 from most general to least general, so the most general slot is
5587 preferred. In particular, because as_mapping comes before as_sequence,
5588 for a type that defines both mp_subscript and sq_item, mp_subscript
5589 wins.
Guido van Rossum09638c12002-06-13 19:17:46 +00005590
5591 This only adds new descriptors and doesn't overwrite entries in
5592 tp_dict that were previously defined. The descriptors contain a
5593 reference to the C function they must call, so that it's safe if they
5594 are copied into a subtype's __dict__ and the subtype has a different
5595 C function in its slot -- calling the method defined by the
5596 descriptor will call the C function that was used to create it,
5597 rather than the C function present in the slot when it is called.
5598 (This is important because a subtype may have a C function in the
5599 slot that calls the method from the dictionary, and we want to avoid
5600 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00005601
5602static int
5603add_operators(PyTypeObject *type)
5604{
5605 PyObject *dict = type->tp_dict;
5606 slotdef *p;
5607 PyObject *descr;
5608 void **ptr;
5609
5610 init_slotdefs();
5611 for (p = slotdefs; p->name; p++) {
5612 if (p->wrapper == NULL)
5613 continue;
5614 ptr = slotptr(type, p->offset);
5615 if (!ptr || !*ptr)
5616 continue;
5617 if (PyDict_GetItem(dict, p->name_strobj))
5618 continue;
5619 descr = PyDescr_NewWrapper(type, p, *ptr);
5620 if (descr == NULL)
5621 return -1;
5622 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
5623 return -1;
5624 Py_DECREF(descr);
5625 }
5626 if (type->tp_new != NULL) {
5627 if (add_tp_new_wrapper(type) < 0)
5628 return -1;
5629 }
5630 return 0;
5631}
5632
Guido van Rossum705f0f52001-08-24 16:47:00 +00005633
5634/* Cooperative 'super' */
5635
5636typedef struct {
5637 PyObject_HEAD
Guido van Rossume705ef12001-08-29 15:47:06 +00005638 PyTypeObject *type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005639 PyObject *obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005640 PyTypeObject *obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005641} superobject;
5642
Guido van Rossum6f799372001-09-20 20:46:19 +00005643static PyMemberDef super_members[] = {
5644 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
5645 "the class invoking super()"},
5646 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
5647 "the instance invoking super(); may be None"},
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005648 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
Walter Dörwaldf0dfc7a2003-10-20 14:01:56 +00005649 "the type of the instance invoking super(); may be None"},
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005650 {0}
5651};
5652
Guido van Rossum705f0f52001-08-24 16:47:00 +00005653static void
5654super_dealloc(PyObject *self)
5655{
5656 superobject *su = (superobject *)self;
5657
Guido van Rossum048eb752001-10-02 21:24:57 +00005658 _PyObject_GC_UNTRACK(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005659 Py_XDECREF(su->obj);
5660 Py_XDECREF(su->type);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005661 Py_XDECREF(su->obj_type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005662 self->ob_type->tp_free(self);
5663}
5664
5665static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005666super_repr(PyObject *self)
5667{
5668 superobject *su = (superobject *)self;
5669
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005670 if (su->obj_type)
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005671 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005672 "<super: <class '%s'>, <%s object>>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005673 su->type ? su->type->tp_name : "NULL",
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005674 su->obj_type->tp_name);
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005675 else
5676 return PyString_FromFormat(
Guido van Rossuma4cb7882001-09-25 03:56:29 +00005677 "<super: <class '%s'>, NULL>",
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005678 su->type ? su->type->tp_name : "NULL");
5679}
5680
5681static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00005682super_getattro(PyObject *self, PyObject *name)
5683{
5684 superobject *su = (superobject *)self;
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005685 int skip = su->obj_type == NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005686
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005687 if (!skip) {
5688 /* We want __class__ to return the class of the super object
5689 (i.e. super, or a subclass), not the class of su->obj. */
5690 skip = (PyString_Check(name) &&
5691 PyString_GET_SIZE(name) == 9 &&
5692 strcmp(PyString_AS_STRING(name), "__class__") == 0);
5693 }
5694
5695 if (!skip) {
Tim Petersa91e9642001-11-14 23:32:33 +00005696 PyObject *mro, *res, *tmp, *dict;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005697 PyTypeObject *starttype;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005698 descrgetfunc f;
Martin v. Löwis18e16552006-02-15 17:27:45 +00005699 Py_ssize_t i, n;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005700
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005701 starttype = su->obj_type;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005702 mro = starttype->tp_mro;
5703
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005704 if (mro == NULL)
5705 n = 0;
5706 else {
5707 assert(PyTuple_Check(mro));
5708 n = PyTuple_GET_SIZE(mro);
5709 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005710 for (i = 0; i < n; i++) {
Guido van Rossume705ef12001-08-29 15:47:06 +00005711 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
Guido van Rossum705f0f52001-08-24 16:47:00 +00005712 break;
5713 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005714 i++;
5715 res = NULL;
5716 for (; i < n; i++) {
5717 tmp = PyTuple_GET_ITEM(mro, i);
Tim Petersa91e9642001-11-14 23:32:33 +00005718 if (PyType_Check(tmp))
5719 dict = ((PyTypeObject *)tmp)->tp_dict;
5720 else if (PyClass_Check(tmp))
5721 dict = ((PyClassObject *)tmp)->cl_dict;
5722 else
5723 continue;
5724 res = PyDict_GetItem(dict, name);
Guido van Rossum6cc5bb62003-04-16 20:01:36 +00005725 if (res != NULL) {
Guido van Rossum705f0f52001-08-24 16:47:00 +00005726 Py_INCREF(res);
5727 f = res->ob_type->tp_descr_get;
5728 if (f != NULL) {
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005729 tmp = f(res,
5730 /* Only pass 'obj' param if
5731 this is instance-mode super
5732 (See SF ID #743627)
5733 */
Hye-Shik Changff365c92004-03-25 16:37:03 +00005734 (su->obj == (PyObject *)
5735 su->obj_type
Phillip J. Eby91a968a2004-03-25 02:19:34 +00005736 ? (PyObject *)NULL
5737 : su->obj),
Guido van Rossumd4641072002-04-03 02:13:37 +00005738 (PyObject *)starttype);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005739 Py_DECREF(res);
5740 res = tmp;
5741 }
5742 return res;
5743 }
5744 }
5745 }
5746 return PyObject_GenericGetAttr(self, name);
5747}
5748
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005749static PyTypeObject *
Guido van Rossum5b443c62001-12-03 15:38:28 +00005750supercheck(PyTypeObject *type, PyObject *obj)
5751{
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005752 /* Check that a super() call makes sense. Return a type object.
5753
5754 obj can be a new-style class, or an instance of one:
5755
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005756 - If it is a class, it must be a subclass of 'type'. This case is
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005757 used for class methods; the return value is obj.
5758
5759 - If it is an instance, it must be an instance of 'type'. This is
5760 the normal case; the return value is obj.__class__.
5761
5762 But... when obj is an instance, we want to allow for the case where
5763 obj->ob_type is not a subclass of type, but obj.__class__ is!
5764 This will allow using super() with a proxy for obj.
5765 */
5766
Guido van Rossum8e80a722003-02-18 19:22:22 +00005767 /* Check for first bullet above (special case) */
5768 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
5769 Py_INCREF(obj);
5770 return (PyTypeObject *)obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005771 }
Guido van Rossum8e80a722003-02-18 19:22:22 +00005772
5773 /* Normal case */
5774 if (PyType_IsSubtype(obj->ob_type, type)) {
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005775 Py_INCREF(obj->ob_type);
5776 return obj->ob_type;
5777 }
5778 else {
5779 /* Try the slow way */
5780 static PyObject *class_str = NULL;
5781 PyObject *class_attr;
5782
5783 if (class_str == NULL) {
5784 class_str = PyString_FromString("__class__");
5785 if (class_str == NULL)
5786 return NULL;
5787 }
5788
5789 class_attr = PyObject_GetAttr(obj, class_str);
5790
5791 if (class_attr != NULL &&
5792 PyType_Check(class_attr) &&
5793 (PyTypeObject *)class_attr != obj->ob_type)
5794 {
5795 int ok = PyType_IsSubtype(
5796 (PyTypeObject *)class_attr, type);
5797 if (ok)
5798 return (PyTypeObject *)class_attr;
5799 }
5800
5801 if (class_attr == NULL)
5802 PyErr_Clear();
5803 else
5804 Py_DECREF(class_attr);
5805 }
5806
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005807 PyErr_SetString(PyExc_TypeError,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005808 "super(type, obj): "
5809 "obj must be an instance or subtype of type");
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005810 return NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005811}
5812
Guido van Rossum705f0f52001-08-24 16:47:00 +00005813static PyObject *
5814super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
5815{
5816 superobject *su = (superobject *)self;
Anthony Baxtera6286212006-04-11 07:42:36 +00005817 superobject *newobj;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005818
5819 if (obj == NULL || obj == Py_None || su->obj != NULL) {
5820 /* Not binding to an object, or already bound */
5821 Py_INCREF(self);
5822 return self;
5823 }
Guido van Rossum5b443c62001-12-03 15:38:28 +00005824 if (su->ob_type != &PySuper_Type)
Armin Rigo7726dc02005-05-15 15:32:08 +00005825 /* If su is an instance of a (strict) subclass of super,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005826 call its type */
Georg Brandl684fd0c2006-05-25 19:15:31 +00005827 return PyObject_CallFunctionObjArgs((PyObject *)su->ob_type,
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005828 su->type, obj, NULL);
Guido van Rossum5b443c62001-12-03 15:38:28 +00005829 else {
5830 /* Inline the common case */
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005831 PyTypeObject *obj_type = supercheck(su->type, obj);
5832 if (obj_type == NULL)
Guido van Rossum5b443c62001-12-03 15:38:28 +00005833 return NULL;
Anthony Baxtera6286212006-04-11 07:42:36 +00005834 newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
Guido van Rossum5b443c62001-12-03 15:38:28 +00005835 NULL, NULL);
Anthony Baxtera6286212006-04-11 07:42:36 +00005836 if (newobj == NULL)
Guido van Rossum5b443c62001-12-03 15:38:28 +00005837 return NULL;
5838 Py_INCREF(su->type);
5839 Py_INCREF(obj);
Anthony Baxtera6286212006-04-11 07:42:36 +00005840 newobj->type = su->type;
5841 newobj->obj = obj;
5842 newobj->obj_type = obj_type;
5843 return (PyObject *)newobj;
Guido van Rossum5b443c62001-12-03 15:38:28 +00005844 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005845}
5846
5847static int
5848super_init(PyObject *self, PyObject *args, PyObject *kwds)
5849{
5850 superobject *su = (superobject *)self;
Guido van Rossume705ef12001-08-29 15:47:06 +00005851 PyTypeObject *type;
5852 PyObject *obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005853 PyTypeObject *obj_type = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005854
Georg Brandl5d59c092006-09-30 08:43:30 +00005855 if (!_PyArg_NoKeywords("super", kwds))
5856 return -1;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005857 if (!PyArg_ParseTuple(args, "O!|O:super", &PyType_Type, &type, &obj))
5858 return -1;
5859 if (obj == Py_None)
5860 obj = NULL;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005861 if (obj != NULL) {
5862 obj_type = supercheck(type, obj);
5863 if (obj_type == NULL)
5864 return -1;
5865 Py_INCREF(obj);
5866 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00005867 Py_INCREF(type);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005868 su->type = type;
5869 su->obj = obj;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00005870 su->obj_type = obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005871 return 0;
5872}
5873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00005874PyDoc_STRVAR(super_doc,
Guido van Rossum705f0f52001-08-24 16:47:00 +00005875"super(type) -> unbound super object\n"
5876"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00005877"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00005878"Typical use to call a cooperative superclass method:\n"
5879"class C(B):\n"
5880" def meth(self, arg):\n"
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005881" super(C, self).meth(arg)");
Guido van Rossum705f0f52001-08-24 16:47:00 +00005882
Guido van Rossum048eb752001-10-02 21:24:57 +00005883static int
5884super_traverse(PyObject *self, visitproc visit, void *arg)
5885{
5886 superobject *su = (superobject *)self;
Guido van Rossum048eb752001-10-02 21:24:57 +00005887
Thomas Woutersc6e55062006-04-15 21:47:09 +00005888 Py_VISIT(su->obj);
5889 Py_VISIT(su->type);
5890 Py_VISIT(su->obj_type);
Guido van Rossum048eb752001-10-02 21:24:57 +00005891
5892 return 0;
5893}
5894
Guido van Rossum705f0f52001-08-24 16:47:00 +00005895PyTypeObject PySuper_Type = {
5896 PyObject_HEAD_INIT(&PyType_Type)
5897 0, /* ob_size */
5898 "super", /* tp_name */
5899 sizeof(superobject), /* tp_basicsize */
5900 0, /* tp_itemsize */
5901 /* methods */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005902 super_dealloc, /* tp_dealloc */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005903 0, /* tp_print */
5904 0, /* tp_getattr */
5905 0, /* tp_setattr */
5906 0, /* tp_compare */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005907 super_repr, /* tp_repr */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005908 0, /* tp_as_number */
5909 0, /* tp_as_sequence */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005910 0, /* tp_as_mapping */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005911 0, /* tp_hash */
5912 0, /* tp_call */
5913 0, /* tp_str */
5914 super_getattro, /* tp_getattro */
5915 0, /* tp_setattro */
5916 0, /* tp_as_buffer */
Guido van Rossum048eb752001-10-02 21:24:57 +00005917 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
5918 Py_TPFLAGS_BASETYPE, /* tp_flags */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005919 super_doc, /* tp_doc */
5920 super_traverse, /* tp_traverse */
5921 0, /* tp_clear */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005922 0, /* tp_richcompare */
5923 0, /* tp_weaklistoffset */
5924 0, /* tp_iter */
5925 0, /* tp_iternext */
5926 0, /* tp_methods */
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005927 super_members, /* tp_members */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005928 0, /* tp_getset */
5929 0, /* tp_base */
5930 0, /* tp_dict */
5931 super_descr_get, /* tp_descr_get */
5932 0, /* tp_descr_set */
5933 0, /* tp_dictoffset */
5934 super_init, /* tp_init */
5935 PyType_GenericAlloc, /* tp_alloc */
5936 PyType_GenericNew, /* tp_new */
Jeremy Hylton2d1f5c92007-02-27 17:24:48 +00005937 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00005938};