blob: 268a9244bbf37a566f9cc5ac74a5ae4b3fa076bd [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"
Guido van Rossumcd16bf62007-06-13 18:07:49 +00004#include "frameobject.h"
Tim Peters6d6c1a32001-08-02 04:15:00 +00005#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
Guido van Rossum9923ffe2002-06-04 19:52:53 +00007#include <ctype.h>
8
Christian Heimesa62da1d2008-01-12 19:39:10 +00009
10/* Support type attribute cache */
11
12/* The cache can keep references to the names alive for longer than
13 they normally would. This is why the maximum size is limited to
14 MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large
15 strings are used as attribute names. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000016#define MCACHE_MAX_ATTR_SIZE 100
17#define MCACHE_SIZE_EXP 10
18#define MCACHE_HASH(version, name_hash) \
19 (((unsigned int)(version) * (unsigned int)(name_hash)) \
20 >> (8*sizeof(unsigned int) - MCACHE_SIZE_EXP))
Christian Heimesa62da1d2008-01-12 19:39:10 +000021#define MCACHE_HASH_METHOD(type, name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 MCACHE_HASH((type)->tp_version_tag, \
23 ((PyUnicodeObject *)(name))->hash)
Christian Heimesa62da1d2008-01-12 19:39:10 +000024#define MCACHE_CACHEABLE_NAME(name) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000025 PyUnicode_CheckExact(name) && \
26 PyUnicode_GET_SIZE(name) <= MCACHE_MAX_ATTR_SIZE
Christian Heimesa62da1d2008-01-12 19:39:10 +000027
28struct method_cache_entry {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000029 unsigned int version;
30 PyObject *name; /* reference to exactly a str or None */
31 PyObject *value; /* borrowed */
Christian Heimesa62da1d2008-01-12 19:39:10 +000032};
33
34static struct method_cache_entry method_cache[1 << MCACHE_SIZE_EXP];
35static unsigned int next_version_tag = 0;
Christian Heimes26855632008-01-27 23:50:43 +000036
37unsigned int
38PyType_ClearCache(void)
39{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 Py_ssize_t i;
41 unsigned int cur_version_tag = next_version_tag - 1;
42
43 for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
44 method_cache[i].version = 0;
45 Py_CLEAR(method_cache[i].name);
46 method_cache[i].value = NULL;
47 }
48 next_version_tag = 0;
49 /* mark all version tags as invalid */
50 PyType_Modified(&PyBaseObject_Type);
51 return cur_version_tag;
Christian Heimes26855632008-01-27 23:50:43 +000052}
Christian Heimesa62da1d2008-01-12 19:39:10 +000053
Georg Brandlf08a9dd2008-06-10 16:57:31 +000054void
55PyType_Modified(PyTypeObject *type)
Christian Heimesa62da1d2008-01-12 19:39:10 +000056{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 /* Invalidate any cached data for the specified type and all
58 subclasses. This function is called after the base
59 classes, mro, or attributes of the type are altered.
Christian Heimesa62da1d2008-01-12 19:39:10 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 Invariants:
Christian Heimesa62da1d2008-01-12 19:39:10 +000062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063 - Py_TPFLAGS_VALID_VERSION_TAG is never set if
64 Py_TPFLAGS_HAVE_VERSION_TAG is not set (e.g. on type
65 objects coming from non-recompiled extension modules)
Christian Heimesa62da1d2008-01-12 19:39:10 +000066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type,
68 it must first be set on all super types.
Christian Heimesa62da1d2008-01-12 19:39:10 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070 This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a
71 type (so it must first clear it on all subclasses). The
72 tp_version_tag value is meaningless unless this flag is set.
73 We don't assign new version tags eagerly, but only as
74 needed.
75 */
76 PyObject *raw, *ref;
77 Py_ssize_t i, n;
Christian Heimesa62da1d2008-01-12 19:39:10 +000078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 if (!PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
80 return;
Christian Heimesa62da1d2008-01-12 19:39:10 +000081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 raw = type->tp_subclasses;
83 if (raw != NULL) {
84 n = PyList_GET_SIZE(raw);
85 for (i = 0; i < n; i++) {
86 ref = PyList_GET_ITEM(raw, i);
87 ref = PyWeakref_GET_OBJECT(ref);
88 if (ref != Py_None) {
89 PyType_Modified((PyTypeObject *)ref);
90 }
91 }
92 }
93 type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
Christian Heimesa62da1d2008-01-12 19:39:10 +000094}
95
96static void
97type_mro_modified(PyTypeObject *type, PyObject *bases) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 /*
99 Check that all base classes or elements of the mro of type are
100 able to be cached. This function is called after the base
101 classes or mro of the type are altered.
Christian Heimesa62da1d2008-01-12 19:39:10 +0000102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000103 Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
104 inherits from an old-style class, either directly or if it
105 appears in the MRO of a new-style class. No support either for
106 custom MROs that include types that are not officially super
107 types.
Christian Heimesa62da1d2008-01-12 19:39:10 +0000108
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 Called from mro_internal, which will subsequently be called on
110 each subclass when their mro is recursively updated.
111 */
112 Py_ssize_t i, n;
113 int clear = 0;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG))
116 return;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 n = PyTuple_GET_SIZE(bases);
119 for (i = 0; i < n; i++) {
120 PyObject *b = PyTuple_GET_ITEM(bases, i);
121 PyTypeObject *cls;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000122
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000123 if (!PyType_Check(b) ) {
124 clear = 1;
125 break;
126 }
Christian Heimesa62da1d2008-01-12 19:39:10 +0000127
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 cls = (PyTypeObject *)b;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000129
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000130 if (!PyType_HasFeature(cls, Py_TPFLAGS_HAVE_VERSION_TAG) ||
131 !PyType_IsSubtype(type, cls)) {
132 clear = 1;
133 break;
134 }
135 }
Christian Heimesa62da1d2008-01-12 19:39:10 +0000136
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000137 if (clear)
138 type->tp_flags &= ~(Py_TPFLAGS_HAVE_VERSION_TAG|
139 Py_TPFLAGS_VALID_VERSION_TAG);
Christian Heimesa62da1d2008-01-12 19:39:10 +0000140}
141
142static int
143assign_version_tag(PyTypeObject *type)
144{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000145 /* Ensure that the tp_version_tag is valid and set
146 Py_TPFLAGS_VALID_VERSION_TAG. To respect the invariant, this
147 must first be done on all super classes. Return 0 if this
148 cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG.
149 */
150 Py_ssize_t i, n;
151 PyObject *bases;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000152
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000153 if (PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG))
154 return 1;
155 if (!PyType_HasFeature(type, Py_TPFLAGS_HAVE_VERSION_TAG))
156 return 0;
157 if (!PyType_HasFeature(type, Py_TPFLAGS_READY))
158 return 0;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000159
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000160 type->tp_version_tag = next_version_tag++;
161 /* for stress-testing: next_version_tag &= 0xFF; */
Christian Heimesa62da1d2008-01-12 19:39:10 +0000162
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000163 if (type->tp_version_tag == 0) {
164 /* wrap-around or just starting Python - clear the whole
165 cache by filling names with references to Py_None.
166 Values are also set to NULL for added protection, as they
167 are borrowed reference */
168 for (i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
169 method_cache[i].value = NULL;
170 Py_XDECREF(method_cache[i].name);
171 method_cache[i].name = Py_None;
172 Py_INCREF(Py_None);
173 }
174 /* mark all version tags as invalid */
175 PyType_Modified(&PyBaseObject_Type);
176 return 1;
177 }
178 bases = type->tp_bases;
179 n = PyTuple_GET_SIZE(bases);
180 for (i = 0; i < n; i++) {
181 PyObject *b = PyTuple_GET_ITEM(bases, i);
182 assert(PyType_Check(b));
183 if (!assign_version_tag((PyTypeObject *)b))
184 return 0;
185 }
186 type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG;
187 return 1;
Christian Heimesa62da1d2008-01-12 19:39:10 +0000188}
189
190
Guido van Rossum6f799372001-09-20 20:46:19 +0000191static PyMemberDef type_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000192 {"__basicsize__", T_INT, offsetof(PyTypeObject,tp_basicsize),READONLY},
193 {"__itemsize__", T_INT, offsetof(PyTypeObject, tp_itemsize), READONLY},
194 {"__flags__", T_LONG, offsetof(PyTypeObject, tp_flags), READONLY},
195 {"__weakrefoffset__", T_LONG,
196 offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
197 {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
198 {"__dictoffset__", T_LONG,
199 offsetof(PyTypeObject, tp_dictoffset), READONLY},
200 {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
201 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000202};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000204static PyObject *
Guido van Rossumc3542212001-08-16 09:18:56 +0000205type_name(PyTypeObject *type, void *context)
206{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000207 const char *s;
Guido van Rossumc3542212001-08-16 09:18:56 +0000208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000209 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
210 PyHeapTypeObject* et = (PyHeapTypeObject*)type;
Tim Petersea7f75d2002-12-07 21:39:16 +0000211
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000212 Py_INCREF(et->ht_name);
213 return et->ht_name;
214 }
215 else {
216 s = strrchr(type->tp_name, '.');
217 if (s == NULL)
218 s = type->tp_name;
219 else
220 s++;
221 return PyUnicode_FromString(s);
222 }
Guido van Rossumc3542212001-08-16 09:18:56 +0000223}
224
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000225static int
226type_set_name(PyTypeObject *type, PyObject *value, void *context)
227{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 PyHeapTypeObject* et;
229 char *tp_name;
230 PyObject *tmp;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000231
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
233 PyErr_Format(PyExc_TypeError,
234 "can't set %s.__name__", type->tp_name);
235 return -1;
236 }
237 if (!value) {
238 PyErr_Format(PyExc_TypeError,
239 "can't delete %s.__name__", type->tp_name);
240 return -1;
241 }
242 if (!PyUnicode_Check(value)) {
243 PyErr_Format(PyExc_TypeError,
244 "can only assign string to %s.__name__, not '%s'",
245 type->tp_name, Py_TYPE(value)->tp_name);
246 return -1;
247 }
Guido van Rossume845c0f2007-11-02 23:07:07 +0000248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000249 /* Check absence of null characters */
250 tmp = PyUnicode_FromStringAndSize("\0", 1);
251 if (tmp == NULL)
252 return -1;
253 if (PyUnicode_Contains(value, tmp) != 0) {
254 Py_DECREF(tmp);
255 PyErr_Format(PyExc_ValueError,
256 "__name__ must not contain null bytes");
257 return -1;
258 }
259 Py_DECREF(tmp);
Guido van Rossume845c0f2007-11-02 23:07:07 +0000260
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000261 tp_name = _PyUnicode_AsString(value);
262 if (tp_name == NULL)
263 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 et = (PyHeapTypeObject*)type;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 Py_INCREF(value);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000268
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 Py_DECREF(et->ht_name);
270 et->ht_name = value;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000271
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000272 type->tp_name = tp_name;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000273
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000274 return 0;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000275}
276
Guido van Rossumc3542212001-08-16 09:18:56 +0000277static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000278type_module(PyTypeObject *type, void *context)
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000279{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 PyObject *mod;
281 char *s;
Guido van Rossumc3542212001-08-16 09:18:56 +0000282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
284 mod = PyDict_GetItemString(type->tp_dict, "__module__");
285 if (!mod) {
286 PyErr_Format(PyExc_AttributeError, "__module__");
287 return 0;
288 }
289 Py_XINCREF(mod);
290 return mod;
291 }
292 else {
293 s = strrchr(type->tp_name, '.');
294 if (s != NULL)
295 return PyUnicode_FromStringAndSize(
296 type->tp_name, (Py_ssize_t)(s - type->tp_name));
297 return PyUnicode_FromString("builtins");
298 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000299}
300
Guido van Rossum3926a632001-09-25 16:25:58 +0000301static int
302type_set_module(PyTypeObject *type, PyObject *value, void *context)
303{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000304 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
305 PyErr_Format(PyExc_TypeError,
306 "can't set %s.__module__", type->tp_name);
307 return -1;
308 }
309 if (!value) {
310 PyErr_Format(PyExc_TypeError,
311 "can't delete %s.__module__", type->tp_name);
312 return -1;
313 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000314
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000315 PyType_Modified(type);
Christian Heimesa62da1d2008-01-12 19:39:10 +0000316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000317 return PyDict_SetItemString(type->tp_dict, "__module__", value);
Guido van Rossum3926a632001-09-25 16:25:58 +0000318}
319
Tim Peters6d6c1a32001-08-02 04:15:00 +0000320static PyObject *
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000321type_abstractmethods(PyTypeObject *type, void *context)
322{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000323 PyObject *mod = PyDict_GetItemString(type->tp_dict,
324 "__abstractmethods__");
325 if (!mod) {
326 PyErr_Format(PyExc_AttributeError, "__abstractmethods__");
327 return NULL;
328 }
329 Py_XINCREF(mod);
330 return mod;
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000331}
332
333static int
334type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
335{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000336 /* __abstractmethods__ should only be set once on a type, in
337 abc.ABCMeta.__new__, so this function doesn't do anything
338 special to update subclasses.
339 */
340 int res = PyDict_SetItemString(type->tp_dict,
341 "__abstractmethods__", value);
342 if (res == 0) {
343 PyType_Modified(type);
344 if (value && PyObject_IsTrue(value)) {
345 type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
346 }
347 else {
348 type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT;
349 }
350 }
351 return res;
Christian Heimes9e7f1d22008-02-28 12:27:11 +0000352}
353
354static PyObject *
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000355type_get_bases(PyTypeObject *type, void *context)
356{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 Py_INCREF(type->tp_bases);
358 return type->tp_bases;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000359}
360
361static PyTypeObject *best_base(PyObject *);
362static int mro_internal(PyTypeObject *);
363static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, char *);
364static int add_subclass(PyTypeObject*, PyTypeObject*);
365static void remove_subclass(PyTypeObject *, PyTypeObject *);
366static void update_all_slots(PyTypeObject *);
367
Guido van Rossum8d24ee92003-03-24 23:49:49 +0000368typedef int (*update_callback)(PyTypeObject *, void *);
369static int update_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 update_callback callback, void *data);
Guido van Rossum8d24ee92003-03-24 23:49:49 +0000371static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 update_callback callback, void *data);
Guido van Rossum8d24ee92003-03-24 23:49:49 +0000373
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000374static int
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000375mro_subclasses(PyTypeObject *type, PyObject* temp)
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000376{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 PyTypeObject *subclass;
378 PyObject *ref, *subclasses, *old_mro;
379 Py_ssize_t i, n;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000380
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000381 subclasses = type->tp_subclasses;
382 if (subclasses == NULL)
383 return 0;
384 assert(PyList_Check(subclasses));
385 n = PyList_GET_SIZE(subclasses);
386 for (i = 0; i < n; i++) {
387 ref = PyList_GET_ITEM(subclasses, i);
388 assert(PyWeakref_CheckRef(ref));
389 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
390 assert(subclass != NULL);
391 if ((PyObject *)subclass == Py_None)
392 continue;
393 assert(PyType_Check(subclass));
394 old_mro = subclass->tp_mro;
395 if (mro_internal(subclass) < 0) {
396 subclass->tp_mro = old_mro;
397 return -1;
398 }
399 else {
400 PyObject* tuple;
401 tuple = PyTuple_Pack(2, subclass, old_mro);
402 Py_DECREF(old_mro);
403 if (!tuple)
404 return -1;
405 if (PyList_Append(temp, tuple) < 0)
406 return -1;
407 Py_DECREF(tuple);
408 }
409 if (mro_subclasses(subclass, temp) < 0)
410 return -1;
411 }
412 return 0;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000413}
414
415static int
416type_set_bases(PyTypeObject *type, PyObject *value, void *context)
417{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 Py_ssize_t i;
419 int r = 0;
420 PyObject *ob, *temp;
421 PyTypeObject *new_base, *old_base;
422 PyObject *old_bases, *old_mro;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000423
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
425 PyErr_Format(PyExc_TypeError,
426 "can't set %s.__bases__", type->tp_name);
427 return -1;
428 }
429 if (!value) {
430 PyErr_Format(PyExc_TypeError,
431 "can't delete %s.__bases__", type->tp_name);
432 return -1;
433 }
434 if (!PyTuple_Check(value)) {
435 PyErr_Format(PyExc_TypeError,
436 "can only assign tuple to %s.__bases__, not %s",
437 type->tp_name, Py_TYPE(value)->tp_name);
438 return -1;
439 }
440 if (PyTuple_GET_SIZE(value) == 0) {
441 PyErr_Format(PyExc_TypeError,
442 "can only assign non-empty tuple to %s.__bases__, not ()",
443 type->tp_name);
444 return -1;
445 }
446 for (i = 0; i < PyTuple_GET_SIZE(value); i++) {
447 ob = PyTuple_GET_ITEM(value, i);
448 if (!PyType_Check(ob)) {
449 PyErr_Format(
450 PyExc_TypeError,
451 "%s.__bases__ must be tuple of old- or new-style classes, not '%s'",
452 type->tp_name, Py_TYPE(ob)->tp_name);
453 return -1;
454 }
455 if (PyType_Check(ob)) {
456 if (PyType_IsSubtype((PyTypeObject*)ob, type)) {
457 PyErr_SetString(PyExc_TypeError,
458 "a __bases__ item causes an inheritance cycle");
459 return -1;
460 }
461 }
462 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000463
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000464 new_base = best_base(value);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 if (!new_base) {
467 return -1;
468 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000469
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000470 if (!compatible_for_assignment(type->tp_base, new_base, "__bases__"))
471 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000472
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000473 Py_INCREF(new_base);
474 Py_INCREF(value);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 old_bases = type->tp_bases;
477 old_base = type->tp_base;
478 old_mro = type->tp_mro;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 type->tp_bases = value;
481 type->tp_base = new_base;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 if (mro_internal(type) < 0) {
484 goto bail;
485 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000486
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000487 temp = PyList_New(0);
488 if (!temp)
489 goto bail;
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 r = mro_subclasses(type, temp);
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 if (r < 0) {
494 for (i = 0; i < PyList_Size(temp); i++) {
495 PyTypeObject* cls;
496 PyObject* mro;
497 PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
498 "", 2, 2, &cls, &mro);
499 Py_INCREF(mro);
500 ob = cls->tp_mro;
501 cls->tp_mro = mro;
502 Py_DECREF(ob);
503 }
504 Py_DECREF(temp);
505 goto bail;
506 }
Michael W. Hudson586da8f2002-11-27 15:20:19 +0000507
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 Py_DECREF(temp);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 /* any base that was in __bases__ but now isn't, we
511 need to remove |type| from its tp_subclasses.
512 conversely, any class now in __bases__ that wasn't
513 needs to have |type| added to its subclasses. */
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000514
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000515 /* for now, sod that: just remove from all old_bases,
516 add to all new_bases */
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000517
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000518 for (i = PyTuple_GET_SIZE(old_bases) - 1; i >= 0; i--) {
519 ob = PyTuple_GET_ITEM(old_bases, i);
520 if (PyType_Check(ob)) {
521 remove_subclass(
522 (PyTypeObject*)ob, type);
523 }
524 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000525
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 for (i = PyTuple_GET_SIZE(value) - 1; i >= 0; i--) {
527 ob = PyTuple_GET_ITEM(value, i);
528 if (PyType_Check(ob)) {
529 if (add_subclass((PyTypeObject*)ob, type) < 0)
530 r = -1;
531 }
532 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000533
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 update_all_slots(type);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 Py_DECREF(old_bases);
537 Py_DECREF(old_base);
538 Py_DECREF(old_mro);
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000539
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000540 return r;
Michael W. Hudson7e7c00d2002-11-27 15:40:09 +0000541
542 bail:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 Py_DECREF(type->tp_bases);
544 Py_DECREF(type->tp_base);
545 if (type->tp_mro != old_mro) {
546 Py_DECREF(type->tp_mro);
547 }
Michael W. Hudsone723e452003-08-07 14:58:10 +0000548
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 type->tp_bases = old_bases;
550 type->tp_base = old_base;
551 type->tp_mro = old_mro;
Tim Petersea7f75d2002-12-07 21:39:16 +0000552
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000553 return -1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +0000554}
555
556static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000557type_dict(PyTypeObject *type, void *context)
558{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 if (type->tp_dict == NULL) {
560 Py_INCREF(Py_None);
561 return Py_None;
562 }
563 return PyDictProxy_New(type->tp_dict);
Guido van Rossum29ca26e1995-01-07 11:58:15 +0000564}
565
Tim Peters24008312002-03-17 18:56:20 +0000566static PyObject *
567type_get_doc(PyTypeObject *type, void *context)
568{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000569 PyObject *result;
570 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL)
571 return PyUnicode_FromString(type->tp_doc);
572 result = PyDict_GetItemString(type->tp_dict, "__doc__");
573 if (result == NULL) {
574 result = Py_None;
575 Py_INCREF(result);
576 }
577 else if (Py_TYPE(result)->tp_descr_get) {
578 result = Py_TYPE(result)->tp_descr_get(result, NULL,
579 (PyObject *)type);
580 }
581 else {
582 Py_INCREF(result);
583 }
584 return result;
Tim Peters24008312002-03-17 18:56:20 +0000585}
586
Antoine Pitrouec569b72008-08-26 22:40:48 +0000587static PyObject *
588type___instancecheck__(PyObject *type, PyObject *inst)
589{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000590 switch (_PyObject_RealIsInstance(inst, type)) {
591 case -1:
592 return NULL;
593 case 0:
594 Py_RETURN_FALSE;
595 default:
596 Py_RETURN_TRUE;
597 }
Antoine Pitrouec569b72008-08-26 22:40:48 +0000598}
599
600
601static PyObject *
Antoine Pitrouec569b72008-08-26 22:40:48 +0000602type___subclasscheck__(PyObject *type, PyObject *inst)
603{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 switch (_PyObject_RealIsSubclass(inst, type)) {
605 case -1:
606 return NULL;
607 case 0:
608 Py_RETURN_FALSE;
609 default:
610 Py_RETURN_TRUE;
611 }
Antoine Pitrouec569b72008-08-26 22:40:48 +0000612}
613
Antoine Pitrouec569b72008-08-26 22:40:48 +0000614
Neil Schemenauerf23473f2001-10-21 22:28:58 +0000615static PyGetSetDef type_getsets[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000616 {"__name__", (getter)type_name, (setter)type_set_name, NULL},
617 {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
618 {"__module__", (getter)type_module, (setter)type_set_module, NULL},
619 {"__abstractmethods__", (getter)type_abstractmethods,
620 (setter)type_set_abstractmethods, NULL},
621 {"__dict__", (getter)type_dict, NULL, NULL},
622 {"__doc__", (getter)type_get_doc, NULL, NULL},
623 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000624};
625
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +0000627type_repr(PyTypeObject *type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000629 PyObject *mod, *name, *rtn;
Guido van Rossumc3542212001-08-16 09:18:56 +0000630
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000631 mod = type_module(type, NULL);
632 if (mod == NULL)
633 PyErr_Clear();
634 else if (!PyUnicode_Check(mod)) {
635 Py_DECREF(mod);
636 mod = NULL;
637 }
638 name = type_name(type, NULL);
639 if (name == NULL)
640 return NULL;
Barry Warsaw7ce36942001-08-24 18:34:26 +0000641
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000642 if (mod != NULL && PyUnicode_CompareWithASCIIString(mod, "builtins"))
643 rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
644 else
645 rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
Barry Warsaw7ce36942001-08-24 18:34:26 +0000646
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000647 Py_XDECREF(mod);
648 Py_DECREF(name);
649 return rtn;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000650}
651
Tim Peters6d6c1a32001-08-02 04:15:00 +0000652static PyObject *
653type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
654{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000655 PyObject *obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000656
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 if (type->tp_new == NULL) {
658 PyErr_Format(PyExc_TypeError,
659 "cannot create '%.100s' instances",
660 type->tp_name);
661 return NULL;
662 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 obj = type->tp_new(type, args, kwds);
665 if (obj != NULL) {
666 /* Ugly exception: when the call was type(something),
667 don't call tp_init on the result. */
668 if (type == &PyType_Type &&
669 PyTuple_Check(args) && PyTuple_GET_SIZE(args) == 1 &&
670 (kwds == NULL ||
671 (PyDict_Check(kwds) && PyDict_Size(kwds) == 0)))
672 return obj;
673 /* If the returned object is not an instance of type,
674 it won't be initialized. */
675 if (!PyType_IsSubtype(Py_TYPE(obj), type))
676 return obj;
677 type = Py_TYPE(obj);
678 if (type->tp_init != NULL &&
679 type->tp_init(obj, args, kwds) < 0) {
680 Py_DECREF(obj);
681 obj = NULL;
682 }
683 }
684 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000685}
686
687PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000688PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Tim Peters6d6c1a32001-08-02 04:15:00 +0000689{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 PyObject *obj;
691 const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
692 /* note that we need to add one, for the sentinel */
Tim Peters406fe3b2001-10-06 19:04:01 +0000693
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000694 if (PyType_IS_GC(type))
695 obj = _PyObject_GC_Malloc(size);
696 else
697 obj = (PyObject *)PyObject_MALLOC(size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000698
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 if (obj == NULL)
700 return PyErr_NoMemory();
Tim Peters406fe3b2001-10-06 19:04:01 +0000701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 memset(obj, '\0', size);
Tim Peters406fe3b2001-10-06 19:04:01 +0000703
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
705 Py_INCREF(type);
Tim Peters406fe3b2001-10-06 19:04:01 +0000706
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000707 if (type->tp_itemsize == 0)
708 PyObject_INIT(obj, type);
709 else
710 (void) PyObject_INIT_VAR((PyVarObject *)obj, type, nitems);
Tim Peters406fe3b2001-10-06 19:04:01 +0000711
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 if (PyType_IS_GC(type))
713 _PyObject_GC_TRACK(obj);
714 return obj;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000715}
716
717PyObject *
718PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000720 return type->tp_alloc(type, 0);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000721}
722
Guido van Rossum9475a232001-10-05 20:51:39 +0000723/* Helpers for subtyping */
724
725static int
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000726traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
727{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000728 Py_ssize_t i, n;
729 PyMemberDef *mp;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000730
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000731 n = Py_SIZE(type);
732 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
733 for (i = 0; i < n; i++, mp++) {
734 if (mp->type == T_OBJECT_EX) {
735 char *addr = (char *)self + mp->offset;
736 PyObject *obj = *(PyObject **)addr;
737 if (obj != NULL) {
738 int err = visit(obj, arg);
739 if (err)
740 return err;
741 }
742 }
743 }
744 return 0;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000745}
746
747static int
Guido van Rossum9475a232001-10-05 20:51:39 +0000748subtype_traverse(PyObject *self, visitproc visit, void *arg)
749{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 PyTypeObject *type, *base;
751 traverseproc basetraverse;
Guido van Rossum9475a232001-10-05 20:51:39 +0000752
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000753 /* Find the nearest base with a different tp_traverse,
754 and traverse slots while we're at it */
755 type = Py_TYPE(self);
756 base = type;
757 while ((basetraverse = base->tp_traverse) == subtype_traverse) {
758 if (Py_SIZE(base)) {
759 int err = traverse_slots(base, self, visit, arg);
760 if (err)
761 return err;
762 }
763 base = base->tp_base;
764 assert(base);
765 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000766
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000767 if (type->tp_dictoffset != base->tp_dictoffset) {
768 PyObject **dictptr = _PyObject_GetDictPtr(self);
769 if (dictptr && *dictptr)
770 Py_VISIT(*dictptr);
771 }
Guido van Rossum9475a232001-10-05 20:51:39 +0000772
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000773 if (type->tp_flags & Py_TPFLAGS_HEAPTYPE)
774 /* For a heaptype, the instances count as references
775 to the type. Traverse the type so the collector
776 can find cycles involving this link. */
777 Py_VISIT(type);
Guido van Rossuma3862092002-06-10 15:24:42 +0000778
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000779 if (basetraverse)
780 return basetraverse(self, visit, arg);
781 return 0;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000782}
783
784static void
785clear_slots(PyTypeObject *type, PyObject *self)
786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000787 Py_ssize_t i, n;
788 PyMemberDef *mp;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000790 n = Py_SIZE(type);
791 mp = PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
792 for (i = 0; i < n; i++, mp++) {
793 if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
794 char *addr = (char *)self + mp->offset;
795 PyObject *obj = *(PyObject **)addr;
796 if (obj != NULL) {
797 *(PyObject **)addr = NULL;
798 Py_DECREF(obj);
799 }
800 }
801 }
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000802}
803
804static int
805subtype_clear(PyObject *self)
806{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 PyTypeObject *type, *base;
808 inquiry baseclear;
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 /* Find the nearest base with a different tp_clear
811 and clear slots while we're at it */
812 type = Py_TYPE(self);
813 base = type;
814 while ((baseclear = base->tp_clear) == subtype_clear) {
815 if (Py_SIZE(base))
816 clear_slots(base, self);
817 base = base->tp_base;
818 assert(base);
819 }
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000821 /* There's no need to clear the instance dict (if any);
822 the collector will call its tp_clear handler. */
Guido van Rossum9923ffe2002-06-04 19:52:53 +0000823
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 if (baseclear)
825 return baseclear(self);
826 return 0;
Guido van Rossum9475a232001-10-05 20:51:39 +0000827}
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828
829static void
830subtype_dealloc(PyObject *self)
831{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000832 PyTypeObject *type, *base;
833 destructor basedealloc;
Tim Peters6d6c1a32001-08-02 04:15:00 +0000834
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000835 /* Extract the type; we expect it to be a heap type */
836 type = Py_TYPE(self);
837 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000838
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000839 /* Test whether the type has GC exactly once */
Guido van Rossum22b13872002-08-06 21:41:44 +0000840
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000841 if (!PyType_IS_GC(type)) {
842 /* It's really rare to find a dynamic type that doesn't have
843 GC; it can only happen when deriving from 'object' and not
844 adding any slots or instance variables. This allows
845 certain simplifications: there's no need to call
846 clear_slots(), or DECREF the dict, or clear weakrefs. */
Guido van Rossum22b13872002-08-06 21:41:44 +0000847
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000848 /* Maybe call finalizer; exit early if resurrected */
849 if (type->tp_del) {
850 type->tp_del(self);
851 if (self->ob_refcnt > 0)
852 return;
853 }
Guido van Rossum22b13872002-08-06 21:41:44 +0000854
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000855 /* Find the nearest base with a different tp_dealloc */
856 base = type;
857 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
858 assert(Py_SIZE(base) == 0);
859 base = base->tp_base;
860 assert(base);
861 }
Guido van Rossum22b13872002-08-06 21:41:44 +0000862
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000863 /* Extract the type again; tp_del may have changed it */
864 type = Py_TYPE(self);
Benjamin Peterson193152c2009-04-25 01:08:45 +0000865
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000866 /* Call the base tp_dealloc() */
867 assert(basedealloc);
868 basedealloc(self);
Guido van Rossum22b13872002-08-06 21:41:44 +0000869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000870 /* Can't reference self beyond this point */
871 Py_DECREF(type);
Guido van Rossum22b13872002-08-06 21:41:44 +0000872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 /* Done */
874 return;
875 }
Guido van Rossum22b13872002-08-06 21:41:44 +0000876
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000877 /* We get here only if the type has GC */
Guido van Rossum22b13872002-08-06 21:41:44 +0000878
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000879 /* UnTrack and re-Track around the trashcan macro, alas */
880 /* See explanation at end of function for full disclosure */
881 PyObject_GC_UnTrack(self);
882 ++_PyTrash_delete_nesting;
883 Py_TRASHCAN_SAFE_BEGIN(self);
884 --_PyTrash_delete_nesting;
885 /* DO NOT restore GC tracking at this point. weakref callbacks
886 * (if any, and whether directly here or indirectly in something we
887 * call) may trigger GC, and if self is tracked at that point, it
888 * will look like trash to GC and GC will try to delete self again.
889 */
Guido van Rossum22b13872002-08-06 21:41:44 +0000890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000891 /* Find the nearest base with a different tp_dealloc */
892 base = type;
893 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
894 base = base->tp_base;
895 assert(base);
896 }
Guido van Rossum14227b42001-12-06 02:35:58 +0000897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000898 /* If we added a weaklist, we clear it. Do this *before* calling
899 the finalizer (__del__), clearing slots, or clearing the instance
900 dict. */
Guido van Rossum59195fd2003-06-13 20:54:40 +0000901
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000902 if (type->tp_weaklistoffset && !base->tp_weaklistoffset)
903 PyObject_ClearWeakRefs(self);
Guido van Rossum1987c662003-05-29 14:29:23 +0000904
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000905 /* Maybe call finalizer; exit early if resurrected */
906 if (type->tp_del) {
907 _PyObject_GC_TRACK(self);
908 type->tp_del(self);
909 if (self->ob_refcnt > 0)
910 goto endlabel; /* resurrected */
911 else
912 _PyObject_GC_UNTRACK(self);
913 /* New weakrefs could be created during the finalizer call.
914 If this occurs, clear them out without calling their
915 finalizers since they might rely on part of the object
916 being finalized that has already been destroyed. */
917 if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
918 /* Modeled after GET_WEAKREFS_LISTPTR() */
919 PyWeakReference **list = (PyWeakReference **) \
920 PyObject_GET_WEAKREFS_LISTPTR(self);
921 while (*list)
922 _PyWeakref_ClearRef(*list);
923 }
924 }
Guido van Rossum1987c662003-05-29 14:29:23 +0000925
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000926 /* Clear slots up to the nearest base with a different tp_dealloc */
927 base = type;
928 while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
929 if (Py_SIZE(base))
930 clear_slots(base, self);
931 base = base->tp_base;
932 assert(base);
933 }
Guido van Rossum59195fd2003-06-13 20:54:40 +0000934
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000935 /* If we added a dict, DECREF it */
936 if (type->tp_dictoffset && !base->tp_dictoffset) {
937 PyObject **dictptr = _PyObject_GetDictPtr(self);
938 if (dictptr != NULL) {
939 PyObject *dict = *dictptr;
940 if (dict != NULL) {
941 Py_DECREF(dict);
942 *dictptr = NULL;
943 }
944 }
945 }
Tim Peters6d6c1a32001-08-02 04:15:00 +0000946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000947 /* Extract the type again; tp_del may have changed it */
948 type = Py_TYPE(self);
Benjamin Peterson193152c2009-04-25 01:08:45 +0000949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000950 /* Call the base tp_dealloc(); first retrack self if
951 * basedealloc knows about gc.
952 */
953 if (PyType_IS_GC(base))
954 _PyObject_GC_TRACK(self);
955 assert(basedealloc);
956 basedealloc(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +0000957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000958 /* Can't reference self beyond this point */
959 Py_DECREF(type);
Guido van Rossum22b13872002-08-06 21:41:44 +0000960
Guido van Rossum0906e072002-08-07 20:42:09 +0000961 endlabel:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 ++_PyTrash_delete_nesting;
963 Py_TRASHCAN_SAFE_END(self);
964 --_PyTrash_delete_nesting;
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 /* Explanation of the weirdness around the trashcan macros:
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000967
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000968 Q. What do the trashcan macros do?
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000969
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000970 A. Read the comment titled "Trashcan mechanism" in object.h.
971 For one, this explains why there must be a call to GC-untrack
972 before the trashcan begin macro. Without understanding the
973 trashcan code, the answers to the following questions don't make
974 sense.
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000976 Q. Why do we GC-untrack before the trashcan and then immediately
977 GC-track again afterward?
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000978
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000979 A. In the case that the base class is GC-aware, the base class
980 probably GC-untracks the object. If it does that using the
981 UNTRACK macro, this will crash when the object is already
982 untracked. Because we don't know what the base class does, the
983 only safe thing is to make sure the object is tracked when we
984 call the base class dealloc. But... The trashcan begin macro
985 requires that the object is *untracked* before it is called. So
986 the dance becomes:
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000987
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000988 GC untrack
989 trashcan begin
990 GC track
Guido van Rossumce8bcd82003-02-05 22:39:45 +0000991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000992 Q. Why did the last question say "immediately GC-track again"?
993 It's nowhere near immediately.
Tim Petersf7f9e992003-11-13 21:59:32 +0000994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 A. Because the code *used* to re-track immediately. Bad Idea.
996 self has a refcount of 0, and if gc ever gets its hands on it
997 (which can happen if any weakref callback gets invoked), it
998 looks like trash to gc too, and gc also tries to delete self
999 then. But we're already deleting self. Double dealloction is
1000 a subtle disaster.
Tim Petersf7f9e992003-11-13 21:59:32 +00001001
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001002 Q. Why the bizarre (net-zero) manipulation of
1003 _PyTrash_delete_nesting around the trashcan macros?
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001004
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001005 A. Some base classes (e.g. list) also use the trashcan mechanism.
1006 The following scenario used to be possible:
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001008 - suppose the trashcan level is one below the trashcan limit
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 - subtype_dealloc() is called
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001012 - the trashcan limit is not yet reached, so the trashcan level
1013 is incremented and the code between trashcan begin and end is
1014 executed
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001015
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 - this destroys much of the object's contents, including its
1017 slots and __dict__
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001018
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001019 - basedealloc() is called; this is really list_dealloc(), or
1020 some other type which also uses the trashcan macros
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001022 - the trashcan limit is now reached, so the object is put on the
1023 trashcan's to-be-deleted-later list
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001025 - basedealloc() returns
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001027 - subtype_dealloc() decrefs the object's type
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001028
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001029 - subtype_dealloc() returns
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001030
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001031 - later, the trashcan code starts deleting the objects from its
1032 to-be-deleted-later list
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001034 - subtype_dealloc() is called *AGAIN* for the same object
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001035
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001036 - at the very least (if the destroyed slots and __dict__ don't
1037 cause problems) the object's type gets decref'ed a second
1038 time, which is *BAD*!!!
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001040 The remedy is to make sure that if the code between trashcan
1041 begin and end in subtype_dealloc() is called, the code between
1042 trashcan begin and end in basedealloc() will also be called.
1043 This is done by decrementing the level after passing into the
1044 trashcan block, and incrementing it just before leaving the
1045 block.
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001046
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 But now it's possible that a chain of objects consisting solely
1048 of objects whose deallocator is subtype_dealloc() will defeat
1049 the trashcan mechanism completely: the decremented level means
1050 that the effective level never reaches the limit. Therefore, we
1051 *increment* the level *before* entering the trashcan block, and
1052 matchingly decrement it after leaving. This means the trashcan
1053 code will trigger a little early, but that's no big deal.
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001055 Q. Are there any live examples of code in need of all this
1056 complexity?
Guido van Rossumce8bcd82003-02-05 22:39:45 +00001057
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001058 A. Yes. See SF bug 668433 for code that crashed (when Python was
1059 compiled in debug mode) before the trashcan level manipulations
1060 were added. For more discussion, see SF patches 581742, 575073
1061 and bug 574207.
1062 */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001063}
1064
Jeremy Hylton938ace62002-07-17 16:30:39 +00001065static PyTypeObject *solid_base(PyTypeObject *type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001066
Tim Peters6d6c1a32001-08-02 04:15:00 +00001067/* type test with subclassing support */
1068
1069int
1070PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
1071{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001072 PyObject *mro;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001073
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001074 mro = a->tp_mro;
1075 if (mro != NULL) {
1076 /* Deal with multiple inheritance without recursion
1077 by walking the MRO tuple */
1078 Py_ssize_t i, n;
1079 assert(PyTuple_Check(mro));
1080 n = PyTuple_GET_SIZE(mro);
1081 for (i = 0; i < n; i++) {
1082 if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
1083 return 1;
1084 }
1085 return 0;
1086 }
1087 else {
1088 /* a is not completely initilized yet; follow tp_base */
1089 do {
1090 if (a == b)
1091 return 1;
1092 a = a->tp_base;
1093 } while (a != NULL);
1094 return b == &PyBaseObject_Type;
1095 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001096}
1097
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001098/* Internal routines to do a method lookup in the type
Guido van Rossum60718732001-08-28 17:47:51 +00001099 without looking in the instance dictionary
1100 (so we can't use PyObject_GetAttr) but still binding
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001101 it to the instance. The arguments are the object,
Guido van Rossum60718732001-08-28 17:47:51 +00001102 the method name as a C string, and the address of a
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001103 static variable used to cache the interned Python string.
1104
1105 Two variants:
1106
1107 - lookup_maybe() returns NULL without raising an exception
1108 when the _PyType_Lookup() call fails;
1109
1110 - lookup_method() always raises an exception upon errors.
Benjamin Peterson224205f2009-05-08 03:25:19 +00001111
1112 - _PyObject_LookupSpecial() exported for the benefit of other places.
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001113*/
Guido van Rossum60718732001-08-28 17:47:51 +00001114
1115static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001116lookup_maybe(PyObject *self, char *attrstr, PyObject **attrobj)
Guido van Rossum60718732001-08-28 17:47:51 +00001117{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001118 PyObject *res;
Guido van Rossum60718732001-08-28 17:47:51 +00001119
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001120 if (*attrobj == NULL) {
1121 *attrobj = PyUnicode_InternFromString(attrstr);
1122 if (*attrobj == NULL)
1123 return NULL;
1124 }
1125 res = _PyType_Lookup(Py_TYPE(self), *attrobj);
1126 if (res != NULL) {
1127 descrgetfunc f;
1128 if ((f = Py_TYPE(res)->tp_descr_get) == NULL)
1129 Py_INCREF(res);
1130 else
1131 res = f(res, self, (PyObject *)(Py_TYPE(self)));
1132 }
1133 return res;
Guido van Rossum60718732001-08-28 17:47:51 +00001134}
1135
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001136static PyObject *
1137lookup_method(PyObject *self, char *attrstr, PyObject **attrobj)
1138{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001139 PyObject *res = lookup_maybe(self, attrstr, attrobj);
1140 if (res == NULL && !PyErr_Occurred())
1141 PyErr_SetObject(PyExc_AttributeError, *attrobj);
1142 return res;
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001143}
1144
Benjamin Peterson224205f2009-05-08 03:25:19 +00001145PyObject *
1146_PyObject_LookupSpecial(PyObject *self, char *attrstr, PyObject **attrobj)
1147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001148 return lookup_maybe(self, attrstr, attrobj);
Benjamin Peterson224205f2009-05-08 03:25:19 +00001149}
1150
Guido van Rossum2730b132001-08-28 18:22:14 +00001151/* A variation of PyObject_CallMethod that uses lookup_method()
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001152 instead of PyObject_GetAttrString(). This uses the same convention
Guido van Rossum2730b132001-08-28 18:22:14 +00001153 as lookup_method to cache the interned name string object. */
1154
Neil Schemenauerf23473f2001-10-21 22:28:58 +00001155static PyObject *
Guido van Rossum2730b132001-08-28 18:22:14 +00001156call_method(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
1157{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001158 va_list va;
1159 PyObject *args, *func = 0, *retval;
1160 va_start(va, format);
Guido van Rossum2730b132001-08-28 18:22:14 +00001161
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001162 func = lookup_maybe(o, name, nameobj);
1163 if (func == NULL) {
1164 va_end(va);
1165 if (!PyErr_Occurred())
1166 PyErr_SetObject(PyExc_AttributeError, *nameobj);
1167 return NULL;
1168 }
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001169
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001170 if (format && *format)
1171 args = Py_VaBuildValue(format, va);
1172 else
1173 args = PyTuple_New(0);
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001174
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001175 va_end(va);
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001176
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001177 if (args == NULL)
1178 return NULL;
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001179
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001180 assert(PyTuple_Check(args));
1181 retval = PyObject_Call(func, args, NULL);
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001183 Py_DECREF(args);
1184 Py_DECREF(func);
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001185
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001186 return retval;
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001187}
1188
1189/* Clone of call_method() that returns NotImplemented when the lookup fails. */
1190
Neil Schemenauerf23473f2001-10-21 22:28:58 +00001191static PyObject *
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001192call_maybe(PyObject *o, char *name, PyObject **nameobj, char *format, ...)
1193{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001194 va_list va;
1195 PyObject *args, *func = 0, *retval;
1196 va_start(va, format);
Guido van Rossumf21c6be2001-09-14 17:51:50 +00001197
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001198 func = lookup_maybe(o, name, nameobj);
1199 if (func == NULL) {
1200 va_end(va);
1201 if (!PyErr_Occurred()) {
1202 Py_INCREF(Py_NotImplemented);
1203 return Py_NotImplemented;
1204 }
1205 return NULL;
1206 }
Guido van Rossum2730b132001-08-28 18:22:14 +00001207
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001208 if (format && *format)
1209 args = Py_VaBuildValue(format, va);
1210 else
1211 args = PyTuple_New(0);
Guido van Rossum2730b132001-08-28 18:22:14 +00001212
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001213 va_end(va);
Guido van Rossum2730b132001-08-28 18:22:14 +00001214
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001215 if (args == NULL)
1216 return NULL;
Guido van Rossum2730b132001-08-28 18:22:14 +00001217
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001218 assert(PyTuple_Check(args));
1219 retval = PyObject_Call(func, args, NULL);
Guido van Rossum2730b132001-08-28 18:22:14 +00001220
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001221 Py_DECREF(args);
1222 Py_DECREF(func);
Guido van Rossum2730b132001-08-28 18:22:14 +00001223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001224 return retval;
Guido van Rossum2730b132001-08-28 18:22:14 +00001225}
1226
Tim Petersea7f75d2002-12-07 21:39:16 +00001227/*
Guido van Rossum1f121312002-11-14 19:49:16 +00001228 Method resolution order algorithm C3 described in
1229 "A Monotonic Superclass Linearization for Dylan",
1230 by Kim Barrett, Bob Cassel, Paul Haahr,
Tim Petersea7f75d2002-12-07 21:39:16 +00001231 David A. Moon, Keith Playford, and P. Tucker Withington.
Guido van Rossum1f121312002-11-14 19:49:16 +00001232 (OOPSLA 1996)
1233
Guido van Rossum98f33732002-11-25 21:36:54 +00001234 Some notes about the rules implied by C3:
1235
Tim Petersea7f75d2002-12-07 21:39:16 +00001236 No duplicate bases.
Guido van Rossum98f33732002-11-25 21:36:54 +00001237 It isn't legal to repeat a class in a list of base classes.
1238
1239 The next three properties are the 3 constraints in "C3".
1240
Tim Petersea7f75d2002-12-07 21:39:16 +00001241 Local precendece order.
Guido van Rossum98f33732002-11-25 21:36:54 +00001242 If A precedes B in C's MRO, then A will precede B in the MRO of all
1243 subclasses of C.
1244
1245 Monotonicity.
1246 The MRO of a class must be an extension without reordering of the
1247 MRO of each of its superclasses.
1248
1249 Extended Precedence Graph (EPG).
1250 Linearization is consistent if there is a path in the EPG from
1251 each class to all its successors in the linearization. See
1252 the paper for definition of EPG.
Guido van Rossum1f121312002-11-14 19:49:16 +00001253 */
1254
Tim Petersea7f75d2002-12-07 21:39:16 +00001255static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001256tail_contains(PyObject *list, int whence, PyObject *o) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001257 Py_ssize_t j, size;
1258 size = PyList_GET_SIZE(list);
Guido van Rossum1f121312002-11-14 19:49:16 +00001259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001260 for (j = whence+1; j < size; j++) {
1261 if (PyList_GET_ITEM(list, j) == o)
1262 return 1;
1263 }
1264 return 0;
Guido van Rossum1f121312002-11-14 19:49:16 +00001265}
1266
Guido van Rossum98f33732002-11-25 21:36:54 +00001267static PyObject *
1268class_name(PyObject *cls)
1269{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001270 PyObject *name = PyObject_GetAttrString(cls, "__name__");
1271 if (name == NULL) {
1272 PyErr_Clear();
1273 Py_XDECREF(name);
1274 name = PyObject_Repr(cls);
1275 }
1276 if (name == NULL)
1277 return NULL;
1278 if (!PyUnicode_Check(name)) {
1279 Py_DECREF(name);
1280 return NULL;
1281 }
1282 return name;
Guido van Rossum98f33732002-11-25 21:36:54 +00001283}
1284
1285static int
1286check_duplicates(PyObject *list)
1287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001288 Py_ssize_t i, j, n;
1289 /* Let's use a quadratic time algorithm,
1290 assuming that the bases lists is short.
1291 */
1292 n = PyList_GET_SIZE(list);
1293 for (i = 0; i < n; i++) {
1294 PyObject *o = PyList_GET_ITEM(list, i);
1295 for (j = i + 1; j < n; j++) {
1296 if (PyList_GET_ITEM(list, j) == o) {
1297 o = class_name(o);
1298 if (o != NULL) {
1299 PyErr_Format(PyExc_TypeError,
1300 "duplicate base class %U",
1301 o);
1302 Py_DECREF(o);
1303 } else {
1304 PyErr_SetString(PyExc_TypeError,
1305 "duplicate base class");
1306 }
1307 return -1;
1308 }
1309 }
1310 }
1311 return 0;
Guido van Rossum98f33732002-11-25 21:36:54 +00001312}
1313
1314/* Raise a TypeError for an MRO order disagreement.
1315
1316 It's hard to produce a good error message. In the absence of better
1317 insight into error reporting, report the classes that were candidates
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001318 to be put next into the MRO. There is some conflict between the
Guido van Rossum98f33732002-11-25 21:36:54 +00001319 order in which they should be put in the MRO, but it's hard to
1320 diagnose what constraint can't be satisfied.
1321*/
1322
1323static void
1324set_mro_error(PyObject *to_merge, int *remain)
1325{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001326 Py_ssize_t i, n, off, to_merge_size;
1327 char buf[1000];
1328 PyObject *k, *v;
1329 PyObject *set = PyDict_New();
1330 if (!set) return;
Guido van Rossum98f33732002-11-25 21:36:54 +00001331
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001332 to_merge_size = PyList_GET_SIZE(to_merge);
1333 for (i = 0; i < to_merge_size; i++) {
1334 PyObject *L = PyList_GET_ITEM(to_merge, i);
1335 if (remain[i] < PyList_GET_SIZE(L)) {
1336 PyObject *c = PyList_GET_ITEM(L, remain[i]);
1337 if (PyDict_SetItem(set, c, Py_None) < 0) {
1338 Py_DECREF(set);
1339 return;
1340 }
1341 }
1342 }
1343 n = PyDict_Size(set);
Guido van Rossum98f33732002-11-25 21:36:54 +00001344
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001345 off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
Raymond Hettingerf394df42003-04-06 19:13:41 +00001346consistent method resolution\norder (MRO) for bases");
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001347 i = 0;
1348 while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
1349 PyObject *name = class_name(k);
Victor Stinnere5f99f32010-05-19 01:42:46 +00001350 char *name_str;
1351 if (name != NULL) {
1352 name_str = _PyUnicode_AsString(name);
1353 if (name_str == NULL)
Victor Stinnerba644a62010-05-19 01:50:45 +00001354 name_str = "?";
Victor Stinnere5f99f32010-05-19 01:42:46 +00001355 } else
Victor Stinnerba644a62010-05-19 01:50:45 +00001356 name_str = "?";
Victor Stinnere5f99f32010-05-19 01:42:46 +00001357 off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001358 Py_XDECREF(name);
1359 if (--n && (size_t)(off+1) < sizeof(buf)) {
1360 buf[off++] = ',';
1361 buf[off] = '\0';
1362 }
1363 }
1364 PyErr_SetString(PyExc_TypeError, buf);
1365 Py_DECREF(set);
Guido van Rossum98f33732002-11-25 21:36:54 +00001366}
1367
Tim Petersea7f75d2002-12-07 21:39:16 +00001368static int
Guido van Rossum1f121312002-11-14 19:49:16 +00001369pmerge(PyObject *acc, PyObject* to_merge) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001370 Py_ssize_t i, j, to_merge_size, empty_cnt;
1371 int *remain;
1372 int ok;
Tim Petersea7f75d2002-12-07 21:39:16 +00001373
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001374 to_merge_size = PyList_GET_SIZE(to_merge);
Guido van Rossum1f121312002-11-14 19:49:16 +00001375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001376 /* remain stores an index into each sublist of to_merge.
1377 remain[i] is the index of the next base in to_merge[i]
1378 that is not included in acc.
1379 */
1380 remain = (int *)PyMem_MALLOC(SIZEOF_INT*to_merge_size);
1381 if (remain == NULL)
1382 return -1;
1383 for (i = 0; i < to_merge_size; i++)
1384 remain[i] = 0;
Guido van Rossum1f121312002-11-14 19:49:16 +00001385
1386 again:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001387 empty_cnt = 0;
1388 for (i = 0; i < to_merge_size; i++) {
1389 PyObject *candidate;
Tim Petersea7f75d2002-12-07 21:39:16 +00001390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001391 PyObject *cur_list = PyList_GET_ITEM(to_merge, i);
Guido van Rossum1f121312002-11-14 19:49:16 +00001392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001393 if (remain[i] >= PyList_GET_SIZE(cur_list)) {
1394 empty_cnt++;
1395 continue;
1396 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001397
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001398 /* Choose next candidate for MRO.
Guido van Rossum98f33732002-11-25 21:36:54 +00001399
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001400 The input sequences alone can determine the choice.
1401 If not, choose the class which appears in the MRO
1402 of the earliest direct superclass of the new class.
1403 */
Guido van Rossum98f33732002-11-25 21:36:54 +00001404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001405 candidate = PyList_GET_ITEM(cur_list, remain[i]);
1406 for (j = 0; j < to_merge_size; j++) {
1407 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
1408 if (tail_contains(j_lst, remain[j], candidate)) {
1409 goto skip; /* continue outer loop */
1410 }
1411 }
1412 ok = PyList_Append(acc, candidate);
1413 if (ok < 0) {
1414 PyMem_Free(remain);
1415 return -1;
1416 }
1417 for (j = 0; j < to_merge_size; j++) {
1418 PyObject *j_lst = PyList_GET_ITEM(to_merge, j);
1419 if (remain[j] < PyList_GET_SIZE(j_lst) &&
1420 PyList_GET_ITEM(j_lst, remain[j]) == candidate) {
1421 remain[j]++;
1422 }
1423 }
1424 goto again;
1425 skip: ;
1426 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001427
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001428 if (empty_cnt == to_merge_size) {
1429 PyMem_FREE(remain);
1430 return 0;
1431 }
1432 set_mro_error(to_merge, remain);
1433 PyMem_FREE(remain);
1434 return -1;
Guido van Rossum1f121312002-11-14 19:49:16 +00001435}
1436
Tim Peters6d6c1a32001-08-02 04:15:00 +00001437static PyObject *
1438mro_implementation(PyTypeObject *type)
1439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001440 Py_ssize_t i, n;
1441 int ok;
1442 PyObject *bases, *result;
1443 PyObject *to_merge, *bases_aslist;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001444
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001445 if (type->tp_dict == NULL) {
1446 if (PyType_Ready(type) < 0)
1447 return NULL;
1448 }
Guido van Rossum63517572002-06-18 16:44:57 +00001449
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001450 /* Find a superclass linearization that honors the constraints
1451 of the explicit lists of bases and the constraints implied by
1452 each base class.
Guido van Rossum98f33732002-11-25 21:36:54 +00001453
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001454 to_merge is a list of lists, where each list is a superclass
1455 linearization implied by a base class. The last element of
1456 to_merge is the declared list of bases.
1457 */
Guido van Rossum98f33732002-11-25 21:36:54 +00001458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001459 bases = type->tp_bases;
1460 n = PyTuple_GET_SIZE(bases);
Guido van Rossum1f121312002-11-14 19:49:16 +00001461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001462 to_merge = PyList_New(n+1);
1463 if (to_merge == NULL)
1464 return NULL;
Guido van Rossum1f121312002-11-14 19:49:16 +00001465
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001466 for (i = 0; i < n; i++) {
1467 PyObject *base = PyTuple_GET_ITEM(bases, i);
1468 PyObject *parentMRO;
1469 parentMRO = PySequence_List(((PyTypeObject*)base)->tp_mro);
1470 if (parentMRO == NULL) {
1471 Py_DECREF(to_merge);
1472 return NULL;
1473 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001474
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001475 PyList_SET_ITEM(to_merge, i, parentMRO);
1476 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001478 bases_aslist = PySequence_List(bases);
1479 if (bases_aslist == NULL) {
1480 Py_DECREF(to_merge);
1481 return NULL;
1482 }
1483 /* This is just a basic sanity check. */
1484 if (check_duplicates(bases_aslist) < 0) {
1485 Py_DECREF(to_merge);
1486 Py_DECREF(bases_aslist);
1487 return NULL;
1488 }
1489 PyList_SET_ITEM(to_merge, n, bases_aslist);
Guido van Rossum1f121312002-11-14 19:49:16 +00001490
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001491 result = Py_BuildValue("[O]", (PyObject *)type);
1492 if (result == NULL) {
1493 Py_DECREF(to_merge);
1494 return NULL;
1495 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001496
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001497 ok = pmerge(result, to_merge);
1498 Py_DECREF(to_merge);
1499 if (ok < 0) {
1500 Py_DECREF(result);
1501 return NULL;
1502 }
Guido van Rossum1f121312002-11-14 19:49:16 +00001503
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001504 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001505}
1506
1507static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001508mro_external(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +00001509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001510 PyTypeObject *type = (PyTypeObject *)self;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001511
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001512 return mro_implementation(type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001513}
1514
1515static int
1516mro_internal(PyTypeObject *type)
1517{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001518 PyObject *mro, *result, *tuple;
1519 int checkit = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001520
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001521 if (Py_TYPE(type) == &PyType_Type) {
1522 result = mro_implementation(type);
1523 }
1524 else {
1525 static PyObject *mro_str;
1526 checkit = 1;
1527 mro = lookup_method((PyObject *)type, "mro", &mro_str);
1528 if (mro == NULL)
1529 return -1;
1530 result = PyObject_CallObject(mro, NULL);
1531 Py_DECREF(mro);
1532 }
1533 if (result == NULL)
1534 return -1;
1535 tuple = PySequence_Tuple(result);
1536 Py_DECREF(result);
1537 if (tuple == NULL)
1538 return -1;
1539 if (checkit) {
1540 Py_ssize_t i, len;
1541 PyObject *cls;
1542 PyTypeObject *solid;
Armin Rigo037d1e02005-12-29 17:07:39 +00001543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001544 solid = solid_base(type);
Armin Rigo037d1e02005-12-29 17:07:39 +00001545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001546 len = PyTuple_GET_SIZE(tuple);
Armin Rigo037d1e02005-12-29 17:07:39 +00001547
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001548 for (i = 0; i < len; i++) {
1549 PyTypeObject *t;
1550 cls = PyTuple_GET_ITEM(tuple, i);
1551 if (!PyType_Check(cls)) {
1552 PyErr_Format(PyExc_TypeError,
1553 "mro() returned a non-class ('%.500s')",
1554 Py_TYPE(cls)->tp_name);
1555 Py_DECREF(tuple);
1556 return -1;
1557 }
1558 t = (PyTypeObject*)cls;
1559 if (!PyType_IsSubtype(solid, solid_base(t))) {
1560 PyErr_Format(PyExc_TypeError,
1561 "mro() returned base with unsuitable layout ('%.500s')",
1562 t->tp_name);
1563 Py_DECREF(tuple);
1564 return -1;
1565 }
1566 }
1567 }
1568 type->tp_mro = tuple;
Christian Heimesa62da1d2008-01-12 19:39:10 +00001569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001570 type_mro_modified(type, type->tp_mro);
1571 /* corner case: the old-style super class might have been hidden
1572 from the custom MRO */
1573 type_mro_modified(type, type->tp_bases);
Christian Heimesa62da1d2008-01-12 19:39:10 +00001574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001575 PyType_Modified(type);
Christian Heimesa62da1d2008-01-12 19:39:10 +00001576
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001577 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001578}
1579
1580
1581/* Calculate the best base amongst multiple base classes.
1582 This is the first one that's on the path to the "solid base". */
1583
1584static PyTypeObject *
1585best_base(PyObject *bases)
1586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001587 Py_ssize_t i, n;
1588 PyTypeObject *base, *winner, *candidate, *base_i;
1589 PyObject *base_proto;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001590
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001591 assert(PyTuple_Check(bases));
1592 n = PyTuple_GET_SIZE(bases);
1593 assert(n > 0);
1594 base = NULL;
1595 winner = NULL;
1596 for (i = 0; i < n; i++) {
1597 base_proto = PyTuple_GET_ITEM(bases, i);
1598 if (!PyType_Check(base_proto)) {
1599 PyErr_SetString(
1600 PyExc_TypeError,
1601 "bases must be types");
1602 return NULL;
1603 }
1604 base_i = (PyTypeObject *)base_proto;
1605 if (base_i->tp_dict == NULL) {
1606 if (PyType_Ready(base_i) < 0)
1607 return NULL;
1608 }
1609 candidate = solid_base(base_i);
1610 if (winner == NULL) {
1611 winner = candidate;
1612 base = base_i;
1613 }
1614 else if (PyType_IsSubtype(winner, candidate))
1615 ;
1616 else if (PyType_IsSubtype(candidate, winner)) {
1617 winner = candidate;
1618 base = base_i;
1619 }
1620 else {
1621 PyErr_SetString(
1622 PyExc_TypeError,
1623 "multiple bases have "
1624 "instance lay-out conflict");
1625 return NULL;
1626 }
1627 }
1628 if (base == NULL)
1629 PyErr_SetString(PyExc_TypeError,
1630 "a new-style class can't have only classic bases");
1631 return base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001632}
1633
1634static int
1635extra_ivars(PyTypeObject *type, PyTypeObject *base)
1636{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001637 size_t t_size = type->tp_basicsize;
1638 size_t b_size = base->tp_basicsize;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001640 assert(t_size >= b_size); /* Else type smaller than base! */
1641 if (type->tp_itemsize || base->tp_itemsize) {
1642 /* If itemsize is involved, stricter rules */
1643 return t_size != b_size ||
1644 type->tp_itemsize != base->tp_itemsize;
1645 }
1646 if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
1647 type->tp_weaklistoffset + sizeof(PyObject *) == t_size &&
1648 type->tp_flags & Py_TPFLAGS_HEAPTYPE)
1649 t_size -= sizeof(PyObject *);
1650 if (type->tp_dictoffset && base->tp_dictoffset == 0 &&
1651 type->tp_dictoffset + sizeof(PyObject *) == t_size &&
1652 type->tp_flags & Py_TPFLAGS_HEAPTYPE)
1653 t_size -= sizeof(PyObject *);
Guido van Rossum9676b222001-08-17 20:32:36 +00001654
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001655 return t_size != b_size;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001656}
1657
1658static PyTypeObject *
1659solid_base(PyTypeObject *type)
1660{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001661 PyTypeObject *base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001662
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001663 if (type->tp_base)
1664 base = solid_base(type->tp_base);
1665 else
1666 base = &PyBaseObject_Type;
1667 if (extra_ivars(type, base))
1668 return type;
1669 else
1670 return base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001671}
1672
Jeremy Hylton938ace62002-07-17 16:30:39 +00001673static void object_dealloc(PyObject *);
1674static int object_init(PyObject *, PyObject *, PyObject *);
1675static int update_slot(PyTypeObject *, PyObject *);
1676static void fixup_slot_dispatchers(PyTypeObject *);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001677
Guido van Rossum360e4b82007-05-14 22:51:27 +00001678/*
1679 * Helpers for __dict__ descriptor. We don't want to expose the dicts
1680 * inherited from various builtin types. The builtin base usually provides
1681 * its own __dict__ descriptor, so we use that when we can.
1682 */
1683static PyTypeObject *
1684get_builtin_base_with_dict(PyTypeObject *type)
1685{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001686 while (type->tp_base != NULL) {
1687 if (type->tp_dictoffset != 0 &&
1688 !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
1689 return type;
1690 type = type->tp_base;
1691 }
1692 return NULL;
Guido van Rossum360e4b82007-05-14 22:51:27 +00001693}
1694
1695static PyObject *
1696get_dict_descriptor(PyTypeObject *type)
1697{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001698 static PyObject *dict_str;
1699 PyObject *descr;
Guido van Rossum360e4b82007-05-14 22:51:27 +00001700
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001701 if (dict_str == NULL) {
1702 dict_str = PyUnicode_InternFromString("__dict__");
1703 if (dict_str == NULL)
1704 return NULL;
1705 }
1706 descr = _PyType_Lookup(type, dict_str);
1707 if (descr == NULL || !PyDescr_IsData(descr))
1708 return NULL;
Guido van Rossum360e4b82007-05-14 22:51:27 +00001709
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001710 return descr;
Guido van Rossum360e4b82007-05-14 22:51:27 +00001711}
1712
1713static void
1714raise_dict_descr_error(PyObject *obj)
1715{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001716 PyErr_Format(PyExc_TypeError,
1717 "this __dict__ descriptor does not support "
1718 "'%.200s' objects", Py_TYPE(obj)->tp_name);
Guido van Rossum360e4b82007-05-14 22:51:27 +00001719}
1720
Tim Peters6d6c1a32001-08-02 04:15:00 +00001721static PyObject *
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001722subtype_dict(PyObject *obj, void *context)
1723{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001724 PyObject **dictptr;
1725 PyObject *dict;
1726 PyTypeObject *base;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001727
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001728 base = get_builtin_base_with_dict(Py_TYPE(obj));
1729 if (base != NULL) {
1730 descrgetfunc func;
1731 PyObject *descr = get_dict_descriptor(base);
1732 if (descr == NULL) {
1733 raise_dict_descr_error(obj);
1734 return NULL;
1735 }
1736 func = Py_TYPE(descr)->tp_descr_get;
1737 if (func == NULL) {
1738 raise_dict_descr_error(obj);
1739 return NULL;
1740 }
1741 return func(descr, obj, (PyObject *)(Py_TYPE(obj)));
1742 }
Guido van Rossum360e4b82007-05-14 22:51:27 +00001743
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001744 dictptr = _PyObject_GetDictPtr(obj);
1745 if (dictptr == NULL) {
1746 PyErr_SetString(PyExc_AttributeError,
1747 "This object has no __dict__");
1748 return NULL;
1749 }
1750 dict = *dictptr;
1751 if (dict == NULL)
1752 *dictptr = dict = PyDict_New();
1753 Py_XINCREF(dict);
1754 return dict;
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001755}
1756
Guido van Rossum6661be32001-10-26 04:26:12 +00001757static int
1758subtype_setdict(PyObject *obj, PyObject *value, void *context)
1759{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001760 PyObject **dictptr;
1761 PyObject *dict;
1762 PyTypeObject *base;
Guido van Rossum6661be32001-10-26 04:26:12 +00001763
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001764 base = get_builtin_base_with_dict(Py_TYPE(obj));
1765 if (base != NULL) {
1766 descrsetfunc func;
1767 PyObject *descr = get_dict_descriptor(base);
1768 if (descr == NULL) {
1769 raise_dict_descr_error(obj);
1770 return -1;
1771 }
1772 func = Py_TYPE(descr)->tp_descr_set;
1773 if (func == NULL) {
1774 raise_dict_descr_error(obj);
1775 return -1;
1776 }
1777 return func(descr, obj, value);
1778 }
Guido van Rossum360e4b82007-05-14 22:51:27 +00001779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001780 dictptr = _PyObject_GetDictPtr(obj);
1781 if (dictptr == NULL) {
1782 PyErr_SetString(PyExc_AttributeError,
1783 "This object has no __dict__");
1784 return -1;
1785 }
1786 if (value != NULL && !PyDict_Check(value)) {
1787 PyErr_Format(PyExc_TypeError,
1788 "__dict__ must be set to a dictionary, "
1789 "not a '%.200s'", Py_TYPE(value)->tp_name);
1790 return -1;
1791 }
1792 dict = *dictptr;
1793 Py_XINCREF(value);
1794 *dictptr = value;
1795 Py_XDECREF(dict);
1796 return 0;
Guido van Rossum6661be32001-10-26 04:26:12 +00001797}
1798
Guido van Rossumad47da02002-08-12 19:05:44 +00001799static PyObject *
1800subtype_getweakref(PyObject *obj, void *context)
1801{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001802 PyObject **weaklistptr;
1803 PyObject *result;
Guido van Rossumad47da02002-08-12 19:05:44 +00001804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001805 if (Py_TYPE(obj)->tp_weaklistoffset == 0) {
1806 PyErr_SetString(PyExc_AttributeError,
1807 "This object has no __weakref__");
1808 return NULL;
1809 }
1810 assert(Py_TYPE(obj)->tp_weaklistoffset > 0);
1811 assert(Py_TYPE(obj)->tp_weaklistoffset + sizeof(PyObject *) <=
1812 (size_t)(Py_TYPE(obj)->tp_basicsize));
1813 weaklistptr = (PyObject **)
1814 ((char *)obj + Py_TYPE(obj)->tp_weaklistoffset);
1815 if (*weaklistptr == NULL)
1816 result = Py_None;
1817 else
1818 result = *weaklistptr;
1819 Py_INCREF(result);
1820 return result;
Guido van Rossumad47da02002-08-12 19:05:44 +00001821}
1822
Guido van Rossum373c7412003-01-07 13:41:37 +00001823/* Three variants on the subtype_getsets list. */
1824
1825static PyGetSetDef subtype_getsets_full[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001826 {"__dict__", subtype_dict, subtype_setdict,
1827 PyDoc_STR("dictionary for instance variables (if defined)")},
1828 {"__weakref__", subtype_getweakref, NULL,
1829 PyDoc_STR("list of weak references to the object (if defined)")},
1830 {0}
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001831};
1832
Guido van Rossum373c7412003-01-07 13:41:37 +00001833static PyGetSetDef subtype_getsets_dict_only[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001834 {"__dict__", subtype_dict, subtype_setdict,
1835 PyDoc_STR("dictionary for instance variables (if defined)")},
1836 {0}
Guido van Rossum373c7412003-01-07 13:41:37 +00001837};
1838
1839static PyGetSetDef subtype_getsets_weakref_only[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001840 {"__weakref__", subtype_getweakref, NULL,
1841 PyDoc_STR("list of weak references to the object (if defined)")},
1842 {0}
Guido van Rossum373c7412003-01-07 13:41:37 +00001843};
1844
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001845static int
1846valid_identifier(PyObject *s)
1847{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001848 if (!PyUnicode_Check(s)) {
1849 PyErr_Format(PyExc_TypeError,
1850 "__slots__ items must be strings, not '%.200s'",
1851 Py_TYPE(s)->tp_name);
1852 return 0;
1853 }
1854 if (!PyUnicode_IsIdentifier(s)) {
1855 PyErr_SetString(PyExc_TypeError,
1856 "__slots__ must be identifiers");
1857 return 0;
1858 }
1859 return 1;
Guido van Rossum9923ffe2002-06-04 19:52:53 +00001860}
1861
Guido van Rossumd8faa362007-04-27 19:54:29 +00001862/* Forward */
1863static int
1864object_init(PyObject *self, PyObject *args, PyObject *kwds);
1865
1866static int
1867type_init(PyObject *cls, PyObject *args, PyObject *kwds)
1868{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001869 int res;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001870
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001871 assert(args != NULL && PyTuple_Check(args));
1872 assert(kwds == NULL || PyDict_Check(kwds));
Guido van Rossumd8faa362007-04-27 19:54:29 +00001873
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001874 if (kwds != NULL && PyDict_Check(kwds) && PyDict_Size(kwds) != 0) {
1875 PyErr_SetString(PyExc_TypeError,
1876 "type.__init__() takes no keyword arguments");
1877 return -1;
1878 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001879
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001880 if (args != NULL && PyTuple_Check(args) &&
1881 (PyTuple_GET_SIZE(args) != 1 && PyTuple_GET_SIZE(args) != 3)) {
1882 PyErr_SetString(PyExc_TypeError,
1883 "type.__init__() takes 1 or 3 arguments");
1884 return -1;
1885 }
Guido van Rossumd8faa362007-04-27 19:54:29 +00001886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001887 /* Call object.__init__(self) now. */
1888 /* XXX Could call super(type, cls).__init__() but what's the point? */
1889 args = PyTuple_GetSlice(args, 0, 0);
1890 res = object_init(cls, args, NULL);
1891 Py_DECREF(args);
1892 return res;
Guido van Rossumd8faa362007-04-27 19:54:29 +00001893}
1894
Guido van Rossum6fb3fde2001-08-30 20:00:07 +00001895static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00001896type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
1897{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001898 PyObject *name, *bases, *dict;
1899 static char *kwlist[] = {"name", "bases", "dict", 0};
1900 PyObject *slots, *tmp, *newslots;
1901 PyTypeObject *type, *base, *tmptype, *winner;
1902 PyHeapTypeObject *et;
1903 PyMemberDef *mp;
1904 Py_ssize_t i, nbases, nslots, slotoffset, add_dict, add_weak;
1905 int j, may_add_dict, may_add_weak;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001906
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001907 assert(args != NULL && PyTuple_Check(args));
1908 assert(kwds == NULL || PyDict_Check(kwds));
Tim Peters3abca122001-10-27 19:37:48 +00001909
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001910 /* Special case: type(x) should return x->ob_type */
1911 {
1912 const Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1913 const Py_ssize_t nkwds = kwds == NULL ? 0 : PyDict_Size(kwds);
Tim Peters3abca122001-10-27 19:37:48 +00001914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001915 if (PyType_CheckExact(metatype) && nargs == 1 && nkwds == 0) {
1916 PyObject *x = PyTuple_GET_ITEM(args, 0);
1917 Py_INCREF(Py_TYPE(x));
1918 return (PyObject *) Py_TYPE(x);
1919 }
Tim Peters3abca122001-10-27 19:37:48 +00001920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001921 /* SF bug 475327 -- if that didn't trigger, we need 3
1922 arguments. but PyArg_ParseTupleAndKeywords below may give
1923 a msg saying type() needs exactly 3. */
1924 if (nargs + nkwds != 3) {
1925 PyErr_SetString(PyExc_TypeError,
1926 "type() takes 1 or 3 arguments");
1927 return NULL;
1928 }
1929 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001930
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001931 /* Check arguments: (name, bases, dict) */
1932 if (!PyArg_ParseTupleAndKeywords(args, kwds, "UO!O!:type", kwlist,
1933 &name,
1934 &PyTuple_Type, &bases,
1935 &PyDict_Type, &dict))
1936 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001937
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001938 /* Determine the proper metatype to deal with this,
1939 and check for metatype conflicts while we're at it.
1940 Note that if some other metatype wins to contract,
1941 it's possible that its instances are not types. */
1942 nbases = PyTuple_GET_SIZE(bases);
1943 winner = metatype;
1944 for (i = 0; i < nbases; i++) {
1945 tmp = PyTuple_GET_ITEM(bases, i);
1946 tmptype = Py_TYPE(tmp);
1947 if (PyType_IsSubtype(winner, tmptype))
1948 continue;
1949 if (PyType_IsSubtype(tmptype, winner)) {
1950 winner = tmptype;
1951 continue;
1952 }
1953 PyErr_SetString(PyExc_TypeError,
1954 "metaclass conflict: "
1955 "the metaclass of a derived class "
1956 "must be a (non-strict) subclass "
1957 "of the metaclasses of all its bases");
1958 return NULL;
1959 }
1960 if (winner != metatype) {
1961 if (winner->tp_new != type_new) /* Pass it to the winner */
1962 return winner->tp_new(winner, args, kwds);
1963 metatype = winner;
1964 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001966 /* Adjust for empty tuple bases */
1967 if (nbases == 0) {
1968 bases = PyTuple_Pack(1, &PyBaseObject_Type);
1969 if (bases == NULL)
1970 return NULL;
1971 nbases = 1;
1972 }
1973 else
1974 Py_INCREF(bases);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001976 /* XXX From here until type is allocated, "return NULL" leaks bases! */
Tim Peters6d6c1a32001-08-02 04:15:00 +00001977
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001978 /* Calculate best base, and check that all bases are type objects */
1979 base = best_base(bases);
1980 if (base == NULL) {
1981 Py_DECREF(bases);
1982 return NULL;
1983 }
1984 if (!PyType_HasFeature(base, Py_TPFLAGS_BASETYPE)) {
1985 PyErr_Format(PyExc_TypeError,
1986 "type '%.100s' is not an acceptable base type",
1987 base->tp_name);
1988 Py_DECREF(bases);
1989 return NULL;
1990 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00001991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001992 /* Check for a __slots__ sequence variable in dict, and count it */
1993 slots = PyDict_GetItemString(dict, "__slots__");
1994 nslots = 0;
1995 add_dict = 0;
1996 add_weak = 0;
1997 may_add_dict = base->tp_dictoffset == 0;
1998 may_add_weak = base->tp_weaklistoffset == 0 && base->tp_itemsize == 0;
1999 if (slots == NULL) {
2000 if (may_add_dict) {
2001 add_dict++;
2002 }
2003 if (may_add_weak) {
2004 add_weak++;
2005 }
2006 }
2007 else {
2008 /* Have slots */
Guido van Rossumad47da02002-08-12 19:05:44 +00002009
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002010 /* Make it into a tuple */
2011 if (PyUnicode_Check(slots))
2012 slots = PyTuple_Pack(1, slots);
2013 else
2014 slots = PySequence_Tuple(slots);
2015 if (slots == NULL) {
2016 Py_DECREF(bases);
2017 return NULL;
2018 }
2019 assert(PyTuple_Check(slots));
Guido van Rossumad47da02002-08-12 19:05:44 +00002020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002021 /* Are slots allowed? */
2022 nslots = PyTuple_GET_SIZE(slots);
2023 if (nslots > 0 && base->tp_itemsize != 0) {
2024 PyErr_Format(PyExc_TypeError,
2025 "nonempty __slots__ "
2026 "not supported for subtype of '%s'",
2027 base->tp_name);
2028 bad_slots:
2029 Py_DECREF(bases);
2030 Py_DECREF(slots);
2031 return NULL;
2032 }
Guido van Rossumad47da02002-08-12 19:05:44 +00002033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002034 /* Check for valid slot names and two special cases */
2035 for (i = 0; i < nslots; i++) {
2036 PyObject *tmp = PyTuple_GET_ITEM(slots, i);
2037 if (!valid_identifier(tmp))
2038 goto bad_slots;
2039 assert(PyUnicode_Check(tmp));
2040 if (PyUnicode_CompareWithASCIIString(tmp, "__dict__") == 0) {
2041 if (!may_add_dict || add_dict) {
2042 PyErr_SetString(PyExc_TypeError,
2043 "__dict__ slot disallowed: "
2044 "we already got one");
2045 goto bad_slots;
2046 }
2047 add_dict++;
2048 }
2049 if (PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0) {
2050 if (!may_add_weak || add_weak) {
2051 PyErr_SetString(PyExc_TypeError,
2052 "__weakref__ slot disallowed: "
2053 "either we already got one, "
2054 "or __itemsize__ != 0");
2055 goto bad_slots;
2056 }
2057 add_weak++;
2058 }
2059 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00002060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002061 /* Copy slots into a list, mangle names and sort them.
2062 Sorted names are needed for __class__ assignment.
2063 Convert them back to tuple at the end.
2064 */
2065 newslots = PyList_New(nslots - add_dict - add_weak);
2066 if (newslots == NULL)
2067 goto bad_slots;
2068 for (i = j = 0; i < nslots; i++) {
2069 tmp = PyTuple_GET_ITEM(slots, i);
2070 if ((add_dict &&
2071 PyUnicode_CompareWithASCIIString(tmp, "__dict__") == 0) ||
2072 (add_weak &&
2073 PyUnicode_CompareWithASCIIString(tmp, "__weakref__") == 0))
2074 continue;
2075 tmp =_Py_Mangle(name, tmp);
2076 if (!tmp)
2077 goto bad_slots;
2078 PyList_SET_ITEM(newslots, j, tmp);
2079 j++;
2080 }
2081 assert(j == nslots - add_dict - add_weak);
2082 nslots = j;
2083 Py_DECREF(slots);
2084 if (PyList_Sort(newslots) == -1) {
2085 Py_DECREF(bases);
2086 Py_DECREF(newslots);
2087 return NULL;
2088 }
2089 slots = PyList_AsTuple(newslots);
2090 Py_DECREF(newslots);
2091 if (slots == NULL) {
2092 Py_DECREF(bases);
2093 return NULL;
2094 }
Raymond Hettinger0ae0c072002-06-20 22:23:15 +00002095
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002096 /* Secondary bases may provide weakrefs or dict */
2097 if (nbases > 1 &&
2098 ((may_add_dict && !add_dict) ||
2099 (may_add_weak && !add_weak))) {
2100 for (i = 0; i < nbases; i++) {
2101 tmp = PyTuple_GET_ITEM(bases, i);
2102 if (tmp == (PyObject *)base)
2103 continue; /* Skip primary base */
2104 assert(PyType_Check(tmp));
2105 tmptype = (PyTypeObject *)tmp;
2106 if (may_add_dict && !add_dict &&
2107 tmptype->tp_dictoffset != 0)
2108 add_dict++;
2109 if (may_add_weak && !add_weak &&
2110 tmptype->tp_weaklistoffset != 0)
2111 add_weak++;
2112 if (may_add_dict && !add_dict)
2113 continue;
2114 if (may_add_weak && !add_weak)
2115 continue;
2116 /* Nothing more to check */
2117 break;
2118 }
2119 }
2120 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002121
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002122 /* XXX From here until type is safely allocated,
2123 "return NULL" may leak slots! */
Tim Peters6d6c1a32001-08-02 04:15:00 +00002124
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002125 /* Allocate the type object */
2126 type = (PyTypeObject *)metatype->tp_alloc(metatype, nslots);
2127 if (type == NULL) {
2128 Py_XDECREF(slots);
2129 Py_DECREF(bases);
2130 return NULL;
2131 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002132
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002133 /* Keep name and slots alive in the extended type object */
2134 et = (PyHeapTypeObject *)type;
2135 Py_INCREF(name);
2136 et->ht_name = name;
2137 et->ht_slots = slots;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002139 /* Initialize tp_flags */
2140 type->tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
2141 Py_TPFLAGS_BASETYPE;
2142 if (base->tp_flags & Py_TPFLAGS_HAVE_GC)
2143 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossumdc91b992001-08-08 22:26:22 +00002144
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002145 /* Initialize essential fields */
2146 type->tp_as_number = &et->as_number;
2147 type->tp_as_sequence = &et->as_sequence;
2148 type->tp_as_mapping = &et->as_mapping;
2149 type->tp_as_buffer = &et->as_buffer;
2150 type->tp_name = _PyUnicode_AsString(name);
2151 if (!type->tp_name) {
2152 Py_DECREF(type);
2153 return NULL;
2154 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002156 /* Set tp_base and tp_bases */
2157 type->tp_bases = bases;
2158 Py_INCREF(base);
2159 type->tp_base = base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002160
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002161 /* Initialize tp_dict from passed-in dict */
2162 type->tp_dict = dict = PyDict_Copy(dict);
2163 if (dict == NULL) {
2164 Py_DECREF(type);
2165 return NULL;
2166 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002167
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002168 /* Set __module__ in the dict */
2169 if (PyDict_GetItemString(dict, "__module__") == NULL) {
2170 tmp = PyEval_GetGlobals();
2171 if (tmp != NULL) {
2172 tmp = PyDict_GetItemString(tmp, "__name__");
2173 if (tmp != NULL) {
2174 if (PyDict_SetItemString(dict, "__module__",
2175 tmp) < 0)
2176 return NULL;
2177 }
2178 }
2179 }
Guido van Rossumc3542212001-08-16 09:18:56 +00002180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002181 /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
2182 and is a string. The __doc__ accessor will first look for tp_doc;
2183 if that fails, it will still look into __dict__.
2184 */
2185 {
2186 PyObject *doc = PyDict_GetItemString(dict, "__doc__");
2187 if (doc != NULL && PyUnicode_Check(doc)) {
2188 Py_ssize_t len;
2189 char *doc_str;
2190 char *tp_doc;
Alexandre Vassalottia85998a2008-05-03 18:24:43 +00002191
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002192 doc_str = _PyUnicode_AsString(doc);
2193 if (doc_str == NULL) {
2194 Py_DECREF(type);
2195 return NULL;
2196 }
2197 /* Silently truncate the docstring if it contains null bytes. */
2198 len = strlen(doc_str);
2199 tp_doc = (char *)PyObject_MALLOC(len + 1);
2200 if (tp_doc == NULL) {
2201 Py_DECREF(type);
2202 return NULL;
2203 }
2204 memcpy(tp_doc, doc_str, len + 1);
2205 type->tp_doc = tp_doc;
2206 }
2207 }
Tim Peters2f93e282001-10-04 05:27:00 +00002208
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002209 /* Special-case __new__: if it's a plain function,
2210 make it a static function */
2211 tmp = PyDict_GetItemString(dict, "__new__");
2212 if (tmp != NULL && PyFunction_Check(tmp)) {
2213 tmp = PyStaticMethod_New(tmp);
2214 if (tmp == NULL) {
2215 Py_DECREF(type);
2216 return NULL;
2217 }
2218 PyDict_SetItemString(dict, "__new__", tmp);
2219 Py_DECREF(tmp);
2220 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002222 /* Add descriptors for custom slots from __slots__, or for __dict__ */
2223 mp = PyHeapType_GET_MEMBERS(et);
2224 slotoffset = base->tp_basicsize;
2225 if (slots != NULL) {
2226 for (i = 0; i < nslots; i++, mp++) {
2227 mp->name = _PyUnicode_AsString(
2228 PyTuple_GET_ITEM(slots, i));
Victor Stinnere5f99f32010-05-19 01:42:46 +00002229 if (mp->name == NULL) {
2230 Py_DECREF(type);
2231 return NULL;
2232 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002233 mp->type = T_OBJECT_EX;
2234 mp->offset = slotoffset;
Guido van Rossumd8faa362007-04-27 19:54:29 +00002235
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002236 /* __dict__ and __weakref__ are already filtered out */
2237 assert(strcmp(mp->name, "__dict__") != 0);
2238 assert(strcmp(mp->name, "__weakref__") != 0);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002240 slotoffset += sizeof(PyObject *);
2241 }
2242 }
2243 if (add_dict) {
2244 if (base->tp_itemsize)
2245 type->tp_dictoffset = -(long)sizeof(PyObject *);
2246 else
2247 type->tp_dictoffset = slotoffset;
2248 slotoffset += sizeof(PyObject *);
2249 }
2250 if (add_weak) {
2251 assert(!base->tp_itemsize);
2252 type->tp_weaklistoffset = slotoffset;
2253 slotoffset += sizeof(PyObject *);
2254 }
2255 type->tp_basicsize = slotoffset;
2256 type->tp_itemsize = base->tp_itemsize;
2257 type->tp_members = PyHeapType_GET_MEMBERS(et);
Guido van Rossum373c7412003-01-07 13:41:37 +00002258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002259 if (type->tp_weaklistoffset && type->tp_dictoffset)
2260 type->tp_getset = subtype_getsets_full;
2261 else if (type->tp_weaklistoffset && !type->tp_dictoffset)
2262 type->tp_getset = subtype_getsets_weakref_only;
2263 else if (!type->tp_weaklistoffset && type->tp_dictoffset)
2264 type->tp_getset = subtype_getsets_dict_only;
2265 else
2266 type->tp_getset = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002267
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002268 /* Special case some slots */
2269 if (type->tp_dictoffset != 0 || nslots > 0) {
2270 if (base->tp_getattr == NULL && base->tp_getattro == NULL)
2271 type->tp_getattro = PyObject_GenericGetAttr;
2272 if (base->tp_setattr == NULL && base->tp_setattro == NULL)
2273 type->tp_setattro = PyObject_GenericSetAttr;
2274 }
2275 type->tp_dealloc = subtype_dealloc;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002276
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002277 /* Enable GC unless there are really no instance variables possible */
2278 if (!(type->tp_basicsize == sizeof(PyObject) &&
2279 type->tp_itemsize == 0))
2280 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
Guido van Rossum9475a232001-10-05 20:51:39 +00002281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002282 /* Always override allocation strategy to use regular heap */
2283 type->tp_alloc = PyType_GenericAlloc;
2284 if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
2285 type->tp_free = PyObject_GC_Del;
2286 type->tp_traverse = subtype_traverse;
2287 type->tp_clear = subtype_clear;
2288 }
2289 else
2290 type->tp_free = PyObject_Del;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002291
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002292 /* Initialize the rest */
2293 if (PyType_Ready(type) < 0) {
2294 Py_DECREF(type);
2295 return NULL;
2296 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002297
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002298 /* Put the proper slots in place */
2299 fixup_slot_dispatchers(type);
Guido van Rossumf040ede2001-08-07 16:40:56 +00002300
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002301 return (PyObject *)type;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002302}
2303
2304/* Internal API to look for a name through the MRO.
2305 This returns a borrowed reference, and doesn't set an exception! */
2306PyObject *
2307_PyType_Lookup(PyTypeObject *type, PyObject *name)
2308{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002309 Py_ssize_t i, n;
2310 PyObject *mro, *res, *base, *dict;
2311 unsigned int h;
Christian Heimesa62da1d2008-01-12 19:39:10 +00002312
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002313 if (MCACHE_CACHEABLE_NAME(name) &&
2314 PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) {
2315 /* fast path */
2316 h = MCACHE_HASH_METHOD(type, name);
2317 if (method_cache[h].version == type->tp_version_tag &&
2318 method_cache[h].name == name)
2319 return method_cache[h].value;
2320 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002321
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002322 /* Look in tp_dict of types in MRO */
2323 mro = type->tp_mro;
Guido van Rossum23094982002-06-10 14:30:43 +00002324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002325 /* If mro is NULL, the type is either not yet initialized
2326 by PyType_Ready(), or already cleared by type_clear().
2327 Either way the safest thing to do is to return NULL. */
2328 if (mro == NULL)
2329 return NULL;
Guido van Rossum23094982002-06-10 14:30:43 +00002330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002331 res = NULL;
2332 assert(PyTuple_Check(mro));
2333 n = PyTuple_GET_SIZE(mro);
2334 for (i = 0; i < n; i++) {
2335 base = PyTuple_GET_ITEM(mro, i);
2336 assert(PyType_Check(base));
2337 dict = ((PyTypeObject *)base)->tp_dict;
2338 assert(dict && PyDict_Check(dict));
2339 res = PyDict_GetItem(dict, name);
2340 if (res != NULL)
2341 break;
2342 }
Christian Heimesa62da1d2008-01-12 19:39:10 +00002343
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002344 if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(type)) {
2345 h = MCACHE_HASH_METHOD(type, name);
2346 method_cache[h].version = type->tp_version_tag;
2347 method_cache[h].value = res; /* borrowed */
2348 Py_INCREF(name);
2349 Py_DECREF(method_cache[h].name);
2350 method_cache[h].name = name;
2351 }
2352 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002353}
2354
2355/* This is similar to PyObject_GenericGetAttr(),
2356 but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
2357static PyObject *
2358type_getattro(PyTypeObject *type, PyObject *name)
2359{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002360 PyTypeObject *metatype = Py_TYPE(type);
2361 PyObject *meta_attribute, *attribute;
2362 descrgetfunc meta_get;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002363
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002364 /* Initialize this type (we'll assume the metatype is initialized) */
2365 if (type->tp_dict == NULL) {
2366 if (PyType_Ready(type) < 0)
2367 return NULL;
2368 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002370 /* No readable descriptor found yet */
2371 meta_get = NULL;
Tim Peters34592512002-07-11 06:23:50 +00002372
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002373 /* Look for the attribute in the metatype */
2374 meta_attribute = _PyType_Lookup(metatype, name);
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002375
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002376 if (meta_attribute != NULL) {
2377 meta_get = Py_TYPE(meta_attribute)->tp_descr_get;
Tim Peters34592512002-07-11 06:23:50 +00002378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002379 if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
2380 /* Data descriptors implement tp_descr_set to intercept
2381 * writes. Assume the attribute is not overridden in
2382 * type's tp_dict (and bases): call the descriptor now.
2383 */
2384 return meta_get(meta_attribute, (PyObject *)type,
2385 (PyObject *)metatype);
2386 }
2387 Py_INCREF(meta_attribute);
2388 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002390 /* No data descriptor found on metatype. Look in tp_dict of this
2391 * type and its bases */
2392 attribute = _PyType_Lookup(type, name);
2393 if (attribute != NULL) {
2394 /* Implement descriptor functionality, if any */
2395 descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get;
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002396
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002397 Py_XDECREF(meta_attribute);
Michael W. Hudsonb2c7de42003-08-15 13:07:47 +00002398
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002399 if (local_get != NULL) {
2400 /* NULL 2nd argument indicates the descriptor was
2401 * found on the target object itself (or a base) */
2402 return local_get(attribute, (PyObject *)NULL,
2403 (PyObject *)type);
2404 }
Tim Peters34592512002-07-11 06:23:50 +00002405
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002406 Py_INCREF(attribute);
2407 return attribute;
2408 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002409
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002410 /* No attribute found in local __dict__ (or bases): use the
2411 * descriptor from the metatype, if any */
2412 if (meta_get != NULL) {
2413 PyObject *res;
2414 res = meta_get(meta_attribute, (PyObject *)type,
2415 (PyObject *)metatype);
2416 Py_DECREF(meta_attribute);
2417 return res;
2418 }
Guido van Rossumbfc2e5e2002-04-04 17:50:54 +00002419
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002420 /* If an ordinary attribute was found on the metatype, return it now */
2421 if (meta_attribute != NULL) {
2422 return meta_attribute;
2423 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00002424
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002425 /* Give up */
2426 PyErr_Format(PyExc_AttributeError,
2427 "type object '%.50s' has no attribute '%U'",
2428 type->tp_name, name);
2429 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002430}
2431
2432static int
2433type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
2434{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002435 if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
2436 PyErr_Format(
2437 PyExc_TypeError,
2438 "can't set attributes of built-in/extension type '%s'",
2439 type->tp_name);
2440 return -1;
2441 }
2442 if (PyObject_GenericSetAttr((PyObject *)type, name, value) < 0)
2443 return -1;
2444 return update_slot(type, name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002445}
2446
2447static void
2448type_dealloc(PyTypeObject *type)
2449{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002450 PyHeapTypeObject *et;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002452 /* Assert this is a heap-allocated type object */
2453 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
2454 _PyObject_GC_UNTRACK(type);
2455 PyObject_ClearWeakRefs((PyObject *)type);
2456 et = (PyHeapTypeObject *)type;
2457 Py_XDECREF(type->tp_base);
2458 Py_XDECREF(type->tp_dict);
2459 Py_XDECREF(type->tp_bases);
2460 Py_XDECREF(type->tp_mro);
2461 Py_XDECREF(type->tp_cache);
2462 Py_XDECREF(type->tp_subclasses);
2463 /* A type's tp_doc is heap allocated, unlike the tp_doc slots
2464 * of most other objects. It's okay to cast it to char *.
2465 */
2466 PyObject_Free((char *)type->tp_doc);
2467 Py_XDECREF(et->ht_name);
2468 Py_XDECREF(et->ht_slots);
2469 Py_TYPE(type)->tp_free((PyObject *)type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002470}
2471
Guido van Rossum1c450732001-10-08 15:18:27 +00002472static PyObject *
2473type_subclasses(PyTypeObject *type, PyObject *args_ignored)
2474{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002475 PyObject *list, *raw, *ref;
2476 Py_ssize_t i, n;
Guido van Rossum1c450732001-10-08 15:18:27 +00002477
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002478 list = PyList_New(0);
2479 if (list == NULL)
2480 return NULL;
2481 raw = type->tp_subclasses;
2482 if (raw == NULL)
2483 return list;
2484 assert(PyList_Check(raw));
2485 n = PyList_GET_SIZE(raw);
2486 for (i = 0; i < n; i++) {
2487 ref = PyList_GET_ITEM(raw, i);
2488 assert(PyWeakref_CheckRef(ref));
2489 ref = PyWeakref_GET_OBJECT(ref);
2490 if (ref != Py_None) {
2491 if (PyList_Append(list, ref) < 0) {
2492 Py_DECREF(list);
2493 return NULL;
2494 }
2495 }
2496 }
2497 return list;
Guido van Rossum1c450732001-10-08 15:18:27 +00002498}
2499
Guido van Rossum47374822007-08-02 16:48:17 +00002500static PyObject *
2501type_prepare(PyObject *self, PyObject *args, PyObject *kwds)
2502{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002503 return PyDict_New();
Guido van Rossum47374822007-08-02 16:48:17 +00002504}
2505
Tim Peters6d6c1a32001-08-02 04:15:00 +00002506static PyMethodDef type_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002507 {"mro", (PyCFunction)mro_external, METH_NOARGS,
2508 PyDoc_STR("mro() -> list\nreturn a type's method resolution order")},
2509 {"__subclasses__", (PyCFunction)type_subclasses, METH_NOARGS,
2510 PyDoc_STR("__subclasses__() -> list of immediate subclasses")},
2511 {"__prepare__", (PyCFunction)type_prepare,
2512 METH_VARARGS | METH_KEYWORDS | METH_CLASS,
2513 PyDoc_STR("__prepare__() -> dict\n"
2514 "used to create the namespace for the class statement")},
2515 {"__instancecheck__", type___instancecheck__, METH_O,
2516 PyDoc_STR("__instancecheck__() -> check if an object is an instance")},
2517 {"__subclasscheck__", type___subclasscheck__, METH_O,
2518 PyDoc_STR("__subclasschck__ -> check if an class is a subclass")},
2519 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +00002520};
2521
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002522PyDoc_STRVAR(type_doc,
Tim Peters6d6c1a32001-08-02 04:15:00 +00002523"type(object) -> the object's type\n"
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002524"type(name, bases, dict) -> a new type");
Tim Peters6d6c1a32001-08-02 04:15:00 +00002525
Guido van Rossum048eb752001-10-02 21:24:57 +00002526static int
2527type_traverse(PyTypeObject *type, visitproc visit, void *arg)
2528{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002529 /* Because of type_is_gc(), the collector only calls this
2530 for heaptypes. */
2531 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002532
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002533 Py_VISIT(type->tp_dict);
2534 Py_VISIT(type->tp_cache);
2535 Py_VISIT(type->tp_mro);
2536 Py_VISIT(type->tp_bases);
2537 Py_VISIT(type->tp_base);
Guido van Rossuma3862092002-06-10 15:24:42 +00002538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002539 /* There's no need to visit type->tp_subclasses or
2540 ((PyHeapTypeObject *)type)->ht_slots, because they can't be involved
2541 in cycles; tp_subclasses is a list of weak references,
2542 and slots is a tuple of strings. */
Guido van Rossum048eb752001-10-02 21:24:57 +00002543
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002544 return 0;
Guido van Rossum048eb752001-10-02 21:24:57 +00002545}
2546
2547static int
2548type_clear(PyTypeObject *type)
2549{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002550 /* Because of type_is_gc(), the collector only calls this
2551 for heaptypes. */
2552 assert(type->tp_flags & Py_TPFLAGS_HEAPTYPE);
Guido van Rossum048eb752001-10-02 21:24:57 +00002553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002554 /* The only field we need to clear is tp_mro, which is part of a
2555 hard cycle (its first element is the class itself) that won't
2556 be broken otherwise (it's a tuple and tuples don't have a
2557 tp_clear handler). None of the other fields need to be
2558 cleared, and here's why:
Guido van Rossum048eb752001-10-02 21:24:57 +00002559
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002560 tp_dict:
2561 It is a dict, so the collector will call its tp_clear.
Guido van Rossuma3862092002-06-10 15:24:42 +00002562
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002563 tp_cache:
2564 Not used; if it were, it would be a dict.
Guido van Rossuma3862092002-06-10 15:24:42 +00002565
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002566 tp_bases, tp_base:
2567 If these are involved in a cycle, there must be at least
2568 one other, mutable object in the cycle, e.g. a base
2569 class's dict; the cycle will be broken that way.
Guido van Rossuma3862092002-06-10 15:24:42 +00002570
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002571 tp_subclasses:
2572 A list of weak references can't be part of a cycle; and
2573 lists have their own tp_clear.
Guido van Rossuma3862092002-06-10 15:24:42 +00002574
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002575 slots (in PyHeapTypeObject):
2576 A tuple of strings can't be part of a cycle.
2577 */
Guido van Rossuma3862092002-06-10 15:24:42 +00002578
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002579 Py_CLEAR(type->tp_mro);
Guido van Rossum048eb752001-10-02 21:24:57 +00002580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002581 return 0;
Guido van Rossum048eb752001-10-02 21:24:57 +00002582}
2583
2584static int
2585type_is_gc(PyTypeObject *type)
2586{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002587 return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
Guido van Rossum048eb752001-10-02 21:24:57 +00002588}
2589
Guido van Rossumc0b618a1997-05-02 03:12:38 +00002590PyTypeObject PyType_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002591 PyVarObject_HEAD_INIT(&PyType_Type, 0)
2592 "type", /* tp_name */
2593 sizeof(PyHeapTypeObject), /* tp_basicsize */
2594 sizeof(PyMemberDef), /* tp_itemsize */
2595 (destructor)type_dealloc, /* tp_dealloc */
2596 0, /* tp_print */
2597 0, /* tp_getattr */
2598 0, /* tp_setattr */
2599 0, /* tp_reserved */
2600 (reprfunc)type_repr, /* tp_repr */
2601 0, /* tp_as_number */
2602 0, /* tp_as_sequence */
2603 0, /* tp_as_mapping */
2604 0, /* tp_hash */
2605 (ternaryfunc)type_call, /* tp_call */
2606 0, /* tp_str */
2607 (getattrofunc)type_getattro, /* tp_getattro */
2608 (setattrofunc)type_setattro, /* tp_setattro */
2609 0, /* tp_as_buffer */
2610 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
2611 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS, /* tp_flags */
2612 type_doc, /* tp_doc */
2613 (traverseproc)type_traverse, /* tp_traverse */
2614 (inquiry)type_clear, /* tp_clear */
2615 0, /* tp_richcompare */
2616 offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
2617 0, /* tp_iter */
2618 0, /* tp_iternext */
2619 type_methods, /* tp_methods */
2620 type_members, /* tp_members */
2621 type_getsets, /* tp_getset */
2622 0, /* tp_base */
2623 0, /* tp_dict */
2624 0, /* tp_descr_get */
2625 0, /* tp_descr_set */
2626 offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
2627 type_init, /* tp_init */
2628 0, /* tp_alloc */
2629 type_new, /* tp_new */
2630 PyObject_GC_Del, /* tp_free */
2631 (inquiry)type_is_gc, /* tp_is_gc */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00002632};
Tim Peters6d6c1a32001-08-02 04:15:00 +00002633
2634
2635/* The base type of all types (eventually)... except itself. */
2636
Guido van Rossumd8faa362007-04-27 19:54:29 +00002637/* You may wonder why object.__new__() only complains about arguments
2638 when object.__init__() is not overridden, and vice versa.
2639
2640 Consider the use cases:
2641
2642 1. When neither is overridden, we want to hear complaints about
2643 excess (i.e., any) arguments, since their presence could
2644 indicate there's a bug.
2645
2646 2. When defining an Immutable type, we are likely to override only
2647 __new__(), since __init__() is called too late to initialize an
2648 Immutable object. Since __new__() defines the signature for the
2649 type, it would be a pain to have to override __init__() just to
2650 stop it from complaining about excess arguments.
2651
2652 3. When defining a Mutable type, we are likely to override only
2653 __init__(). So here the converse reasoning applies: we don't
2654 want to have to override __new__() just to stop it from
2655 complaining.
2656
2657 4. When __init__() is overridden, and the subclass __init__() calls
2658 object.__init__(), the latter should complain about excess
2659 arguments; ditto for __new__().
2660
2661 Use cases 2 and 3 make it unattractive to unconditionally check for
2662 excess arguments. The best solution that addresses all four use
2663 cases is as follows: __init__() complains about excess arguments
2664 unless __new__() is overridden and __init__() is not overridden
2665 (IOW, if __init__() is overridden or __new__() is not overridden);
2666 symmetrically, __new__() complains about excess arguments unless
2667 __init__() is overridden and __new__() is not overridden
2668 (IOW, if __new__() is overridden or __init__() is not overridden).
2669
2670 However, for backwards compatibility, this breaks too much code.
2671 Therefore, in 2.6, we'll *warn* about excess arguments when both
2672 methods are overridden; for all other cases we'll use the above
2673 rules.
2674
2675*/
2676
2677/* Forward */
2678static PyObject *
2679object_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
2680
2681static int
2682excess_args(PyObject *args, PyObject *kwds)
2683{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002684 return PyTuple_GET_SIZE(args) ||
2685 (kwds && PyDict_Check(kwds) && PyDict_Size(kwds));
Guido van Rossumd8faa362007-04-27 19:54:29 +00002686}
2687
Tim Peters6d6c1a32001-08-02 04:15:00 +00002688static int
2689object_init(PyObject *self, PyObject *args, PyObject *kwds)
2690{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002691 int err = 0;
2692 if (excess_args(args, kwds)) {
2693 PyTypeObject *type = Py_TYPE(self);
2694 if (type->tp_init != object_init &&
2695 type->tp_new != object_new)
2696 {
2697 err = PyErr_WarnEx(PyExc_DeprecationWarning,
2698 "object.__init__() takes no parameters",
2699 1);
2700 }
2701 else if (type->tp_init != object_init ||
2702 type->tp_new == object_new)
2703 {
2704 PyErr_SetString(PyExc_TypeError,
2705 "object.__init__() takes no parameters");
2706 err = -1;
2707 }
2708 }
2709 return err;
Tim Peters6d6c1a32001-08-02 04:15:00 +00002710}
2711
Guido van Rossum298e4212003-02-13 16:30:16 +00002712static PyObject *
2713object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
2714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002715 int err = 0;
2716 if (excess_args(args, kwds)) {
2717 if (type->tp_new != object_new &&
2718 type->tp_init != object_init)
2719 {
2720 err = PyErr_WarnEx(PyExc_DeprecationWarning,
2721 "object.__new__() takes no parameters",
2722 1);
2723 }
2724 else if (type->tp_new != object_new ||
2725 type->tp_init == object_init)
2726 {
2727 PyErr_SetString(PyExc_TypeError,
2728 "object.__new__() takes no parameters");
2729 err = -1;
2730 }
2731 }
2732 if (err < 0)
2733 return NULL;
Christian Heimes9e7f1d22008-02-28 12:27:11 +00002734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002735 if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
2736 static PyObject *comma = NULL;
2737 PyObject *abstract_methods = NULL;
2738 PyObject *builtins;
2739 PyObject *sorted;
2740 PyObject *sorted_methods = NULL;
2741 PyObject *joined = NULL;
Christian Heimes9e7f1d22008-02-28 12:27:11 +00002742
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002743 /* Compute ", ".join(sorted(type.__abstractmethods__))
2744 into joined. */
2745 abstract_methods = type_abstractmethods(type, NULL);
2746 if (abstract_methods == NULL)
2747 goto error;
2748 builtins = PyEval_GetBuiltins();
2749 if (builtins == NULL)
2750 goto error;
2751 sorted = PyDict_GetItemString(builtins, "sorted");
2752 if (sorted == NULL)
2753 goto error;
2754 sorted_methods = PyObject_CallFunctionObjArgs(sorted,
2755 abstract_methods,
2756 NULL);
2757 if (sorted_methods == NULL)
2758 goto error;
2759 if (comma == NULL) {
2760 comma = PyUnicode_InternFromString(", ");
2761 if (comma == NULL)
2762 goto error;
2763 }
2764 joined = PyObject_CallMethod(comma, "join",
2765 "O", sorted_methods);
2766 if (joined == NULL)
2767 goto error;
Christian Heimes9e7f1d22008-02-28 12:27:11 +00002768
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002769 PyErr_Format(PyExc_TypeError,
2770 "Can't instantiate abstract class %s "
2771 "with abstract methods %U",
2772 type->tp_name,
2773 joined);
2774 error:
2775 Py_XDECREF(joined);
2776 Py_XDECREF(sorted_methods);
2777 Py_XDECREF(abstract_methods);
2778 return NULL;
2779 }
2780 return type->tp_alloc(type, 0);
Guido van Rossum298e4212003-02-13 16:30:16 +00002781}
2782
Tim Peters6d6c1a32001-08-02 04:15:00 +00002783static void
2784object_dealloc(PyObject *self)
2785{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002786 Py_TYPE(self)->tp_free(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +00002787}
2788
Guido van Rossum8e248182001-08-12 05:17:56 +00002789static PyObject *
2790object_repr(PyObject *self)
2791{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002792 PyTypeObject *type;
2793 PyObject *mod, *name, *rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002794
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002795 type = Py_TYPE(self);
2796 mod = type_module(type, NULL);
2797 if (mod == NULL)
2798 PyErr_Clear();
2799 else if (!PyUnicode_Check(mod)) {
2800 Py_DECREF(mod);
2801 mod = NULL;
2802 }
2803 name = type_name(type, NULL);
2804 if (name == NULL)
2805 return NULL;
2806 if (mod != NULL && PyUnicode_CompareWithASCIIString(mod, "builtins"))
2807 rtn = PyUnicode_FromFormat("<%U.%U object at %p>", mod, name, self);
2808 else
2809 rtn = PyUnicode_FromFormat("<%s object at %p>",
2810 type->tp_name, self);
2811 Py_XDECREF(mod);
2812 Py_DECREF(name);
2813 return rtn;
Guido van Rossum8e248182001-08-12 05:17:56 +00002814}
2815
Guido van Rossumb8f63662001-08-15 23:57:02 +00002816static PyObject *
2817object_str(PyObject *self)
2818{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002819 unaryfunc f;
Guido van Rossumb8f63662001-08-15 23:57:02 +00002820
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002821 f = Py_TYPE(self)->tp_repr;
2822 if (f == NULL)
2823 f = object_repr;
2824 return f(self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00002825}
2826
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002827static PyObject *
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002828object_richcompare(PyObject *self, PyObject *other, int op)
2829{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002830 PyObject *res;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002831
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002832 switch (op) {
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002833
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002834 case Py_EQ:
2835 /* Return NotImplemented instead of False, so if two
2836 objects are compared, both get a chance at the
2837 comparison. See issue #1393. */
2838 res = (self == other) ? Py_True : Py_NotImplemented;
2839 Py_INCREF(res);
2840 break;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002841
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002842 case Py_NE:
2843 /* By default, != returns the opposite of ==,
2844 unless the latter returns NotImplemented. */
2845 res = PyObject_RichCompare(self, other, Py_EQ);
2846 if (res != NULL && res != Py_NotImplemented) {
2847 int ok = PyObject_IsTrue(res);
2848 Py_DECREF(res);
2849 if (ok < 0)
2850 res = NULL;
2851 else {
2852 if (ok)
2853 res = Py_False;
2854 else
2855 res = Py_True;
2856 Py_INCREF(res);
2857 }
2858 }
2859 break;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002860
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002861 default:
2862 res = Py_NotImplemented;
2863 Py_INCREF(res);
2864 break;
2865 }
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002866
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002867 return res;
Guido van Rossum47b9ff62006-08-24 00:41:19 +00002868}
2869
2870static PyObject *
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002871object_get_class(PyObject *self, void *closure)
2872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002873 Py_INCREF(Py_TYPE(self));
2874 return (PyObject *)(Py_TYPE(self));
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002875}
2876
2877static int
2878equiv_structs(PyTypeObject *a, PyTypeObject *b)
2879{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002880 return a == b ||
2881 (a != NULL &&
2882 b != NULL &&
2883 a->tp_basicsize == b->tp_basicsize &&
2884 a->tp_itemsize == b->tp_itemsize &&
2885 a->tp_dictoffset == b->tp_dictoffset &&
2886 a->tp_weaklistoffset == b->tp_weaklistoffset &&
2887 ((a->tp_flags & Py_TPFLAGS_HAVE_GC) ==
2888 (b->tp_flags & Py_TPFLAGS_HAVE_GC)));
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002889}
2890
2891static int
2892same_slots_added(PyTypeObject *a, PyTypeObject *b)
2893{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002894 PyTypeObject *base = a->tp_base;
2895 Py_ssize_t size;
2896 PyObject *slots_a, *slots_b;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002897
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002898 if (base != b->tp_base)
2899 return 0;
2900 if (equiv_structs(a, base) && equiv_structs(b, base))
2901 return 1;
2902 size = base->tp_basicsize;
2903 if (a->tp_dictoffset == size && b->tp_dictoffset == size)
2904 size += sizeof(PyObject *);
2905 if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
2906 size += sizeof(PyObject *);
Guido van Rossumd8faa362007-04-27 19:54:29 +00002907
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002908 /* Check slots compliance */
2909 slots_a = ((PyHeapTypeObject *)a)->ht_slots;
2910 slots_b = ((PyHeapTypeObject *)b)->ht_slots;
2911 if (slots_a && slots_b) {
2912 if (PyObject_RichCompareBool(slots_a, slots_b, Py_EQ) != 1)
2913 return 0;
2914 size += sizeof(PyObject *) * PyTuple_GET_SIZE(slots_a);
2915 }
2916 return size == a->tp_basicsize && size == b->tp_basicsize;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002917}
2918
2919static int
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002920compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, char* attr)
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002921{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002922 PyTypeObject *newbase, *oldbase;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002924 if (newto->tp_dealloc != oldto->tp_dealloc ||
2925 newto->tp_free != oldto->tp_free)
2926 {
2927 PyErr_Format(PyExc_TypeError,
2928 "%s assignment: "
2929 "'%s' deallocator differs from '%s'",
2930 attr,
2931 newto->tp_name,
2932 oldto->tp_name);
2933 return 0;
2934 }
2935 newbase = newto;
2936 oldbase = oldto;
2937 while (equiv_structs(newbase, newbase->tp_base))
2938 newbase = newbase->tp_base;
2939 while (equiv_structs(oldbase, oldbase->tp_base))
2940 oldbase = oldbase->tp_base;
2941 if (newbase != oldbase &&
2942 (newbase->tp_base != oldbase->tp_base ||
2943 !same_slots_added(newbase, oldbase))) {
2944 PyErr_Format(PyExc_TypeError,
2945 "%s assignment: "
2946 "'%s' object layout differs from '%s'",
2947 attr,
2948 newto->tp_name,
2949 oldto->tp_name);
2950 return 0;
2951 }
Tim Petersea7f75d2002-12-07 21:39:16 +00002952
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002953 return 1;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00002954}
2955
2956static int
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002957object_set_class(PyObject *self, PyObject *value, void *closure)
2958{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002959 PyTypeObject *oldto = Py_TYPE(self);
2960 PyTypeObject *newto;
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002961
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002962 if (value == NULL) {
2963 PyErr_SetString(PyExc_TypeError,
2964 "can't delete __class__ attribute");
2965 return -1;
2966 }
2967 if (!PyType_Check(value)) {
2968 PyErr_Format(PyExc_TypeError,
2969 "__class__ must be set to new-style class, not '%s' object",
2970 Py_TYPE(value)->tp_name);
2971 return -1;
2972 }
2973 newto = (PyTypeObject *)value;
2974 if (!(newto->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
2975 !(oldto->tp_flags & Py_TPFLAGS_HEAPTYPE))
2976 {
2977 PyErr_Format(PyExc_TypeError,
2978 "__class__ assignment: only for heap types");
2979 return -1;
2980 }
2981 if (compatible_for_assignment(newto, oldto, "__class__")) {
2982 Py_INCREF(newto);
2983 Py_TYPE(self) = newto;
2984 Py_DECREF(oldto);
2985 return 0;
2986 }
2987 else {
2988 return -1;
2989 }
Guido van Rossum5c294fb2001-09-25 03:43:42 +00002990}
2991
2992static PyGetSetDef object_getsets[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002993 {"__class__", object_get_class, object_set_class,
2994 PyDoc_STR("the object's class")},
2995 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +00002996};
2997
Guido van Rossumc53f0092003-02-18 22:05:12 +00002998
Guido van Rossum036f9992003-02-21 22:02:54 +00002999/* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00003000 We fall back to helpers in copyreg for:
Guido van Rossum036f9992003-02-21 22:02:54 +00003001 - pickle protocols < 2
3002 - calculating the list of slot names (done only once per class)
3003 - the __newobj__ function (which is used as a token but never called)
3004*/
3005
3006static PyObject *
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +00003007import_copyreg(void)
Guido van Rossum036f9992003-02-21 22:02:54 +00003008{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003009 static PyObject *copyreg_str;
Guido van Rossum3926a632001-09-25 16:25:58 +00003010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003011 if (!copyreg_str) {
3012 copyreg_str = PyUnicode_InternFromString("copyreg");
3013 if (copyreg_str == NULL)
3014 return NULL;
3015 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003016
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003017 return PyImport_Import(copyreg_str);
Guido van Rossum036f9992003-02-21 22:02:54 +00003018}
3019
3020static PyObject *
3021slotnames(PyObject *cls)
3022{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003023 PyObject *clsdict;
3024 PyObject *copyreg;
3025 PyObject *slotnames;
Guido van Rossum036f9992003-02-21 22:02:54 +00003026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003027 if (!PyType_Check(cls)) {
3028 Py_INCREF(Py_None);
3029 return Py_None;
3030 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003031
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003032 clsdict = ((PyTypeObject *)cls)->tp_dict;
3033 slotnames = PyDict_GetItemString(clsdict, "__slotnames__");
3034 if (slotnames != NULL && PyList_Check(slotnames)) {
3035 Py_INCREF(slotnames);
3036 return slotnames;
3037 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003038
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003039 copyreg = import_copyreg();
3040 if (copyreg == NULL)
3041 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00003042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003043 slotnames = PyObject_CallMethod(copyreg, "_slotnames", "O", cls);
3044 Py_DECREF(copyreg);
3045 if (slotnames != NULL &&
3046 slotnames != Py_None &&
3047 !PyList_Check(slotnames))
3048 {
3049 PyErr_SetString(PyExc_TypeError,
3050 "copyreg._slotnames didn't return a list or None");
3051 Py_DECREF(slotnames);
3052 slotnames = NULL;
3053 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003054
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003055 return slotnames;
Guido van Rossum036f9992003-02-21 22:02:54 +00003056}
3057
3058static PyObject *
3059reduce_2(PyObject *obj)
3060{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003061 PyObject *cls, *getnewargs;
3062 PyObject *args = NULL, *args2 = NULL;
3063 PyObject *getstate = NULL, *state = NULL, *names = NULL;
3064 PyObject *slots = NULL, *listitems = NULL, *dictitems = NULL;
3065 PyObject *copyreg = NULL, *newobj = NULL, *res = NULL;
3066 Py_ssize_t i, n;
Guido van Rossum036f9992003-02-21 22:02:54 +00003067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003068 cls = PyObject_GetAttrString(obj, "__class__");
3069 if (cls == NULL)
3070 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00003071
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003072 getnewargs = PyObject_GetAttrString(obj, "__getnewargs__");
3073 if (getnewargs != NULL) {
3074 args = PyObject_CallObject(getnewargs, NULL);
3075 Py_DECREF(getnewargs);
3076 if (args != NULL && !PyTuple_Check(args)) {
3077 PyErr_Format(PyExc_TypeError,
3078 "__getnewargs__ should return a tuple, "
3079 "not '%.200s'", Py_TYPE(args)->tp_name);
3080 goto end;
3081 }
3082 }
3083 else {
3084 PyErr_Clear();
3085 args = PyTuple_New(0);
3086 }
3087 if (args == NULL)
3088 goto end;
Guido van Rossum036f9992003-02-21 22:02:54 +00003089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003090 getstate = PyObject_GetAttrString(obj, "__getstate__");
3091 if (getstate != NULL) {
3092 state = PyObject_CallObject(getstate, NULL);
3093 Py_DECREF(getstate);
3094 if (state == NULL)
3095 goto end;
3096 }
3097 else {
3098 PyErr_Clear();
3099 state = PyObject_GetAttrString(obj, "__dict__");
3100 if (state == NULL) {
3101 PyErr_Clear();
3102 state = Py_None;
3103 Py_INCREF(state);
3104 }
3105 names = slotnames(cls);
3106 if (names == NULL)
3107 goto end;
3108 if (names != Py_None) {
3109 assert(PyList_Check(names));
3110 slots = PyDict_New();
3111 if (slots == NULL)
3112 goto end;
3113 n = 0;
3114 /* Can't pre-compute the list size; the list
3115 is stored on the class so accessible to other
3116 threads, which may be run by DECREF */
3117 for (i = 0; i < PyList_GET_SIZE(names); i++) {
3118 PyObject *name, *value;
3119 name = PyList_GET_ITEM(names, i);
3120 value = PyObject_GetAttr(obj, name);
3121 if (value == NULL)
3122 PyErr_Clear();
3123 else {
3124 int err = PyDict_SetItem(slots, name,
3125 value);
3126 Py_DECREF(value);
3127 if (err)
3128 goto end;
3129 n++;
3130 }
3131 }
3132 if (n) {
3133 state = Py_BuildValue("(NO)", state, slots);
3134 if (state == NULL)
3135 goto end;
3136 }
3137 }
3138 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003139
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003140 if (!PyList_Check(obj)) {
3141 listitems = Py_None;
3142 Py_INCREF(listitems);
3143 }
3144 else {
3145 listitems = PyObject_GetIter(obj);
3146 if (listitems == NULL)
3147 goto end;
3148 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003149
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003150 if (!PyDict_Check(obj)) {
3151 dictitems = Py_None;
3152 Py_INCREF(dictitems);
3153 }
3154 else {
3155 PyObject *items = PyObject_CallMethod(obj, "items", "");
3156 if (items == NULL)
3157 goto end;
3158 dictitems = PyObject_GetIter(items);
3159 Py_DECREF(items);
3160 if (dictitems == NULL)
3161 goto end;
3162 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003164 copyreg = import_copyreg();
3165 if (copyreg == NULL)
3166 goto end;
3167 newobj = PyObject_GetAttrString(copyreg, "__newobj__");
3168 if (newobj == NULL)
3169 goto end;
Guido van Rossum036f9992003-02-21 22:02:54 +00003170
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003171 n = PyTuple_GET_SIZE(args);
3172 args2 = PyTuple_New(n+1);
3173 if (args2 == NULL)
3174 goto end;
3175 PyTuple_SET_ITEM(args2, 0, cls);
3176 cls = NULL;
3177 for (i = 0; i < n; i++) {
3178 PyObject *v = PyTuple_GET_ITEM(args, i);
3179 Py_INCREF(v);
3180 PyTuple_SET_ITEM(args2, i+1, v);
3181 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003182
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003183 res = PyTuple_Pack(5, newobj, args2, state, listitems, dictitems);
Guido van Rossum036f9992003-02-21 22:02:54 +00003184
3185 end:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003186 Py_XDECREF(cls);
3187 Py_XDECREF(args);
3188 Py_XDECREF(args2);
3189 Py_XDECREF(slots);
3190 Py_XDECREF(state);
3191 Py_XDECREF(names);
3192 Py_XDECREF(listitems);
3193 Py_XDECREF(dictitems);
3194 Py_XDECREF(copyreg);
3195 Py_XDECREF(newobj);
3196 return res;
Guido van Rossum036f9992003-02-21 22:02:54 +00003197}
3198
Guido van Rossumd8faa362007-04-27 19:54:29 +00003199/*
3200 * There were two problems when object.__reduce__ and object.__reduce_ex__
3201 * were implemented in the same function:
3202 * - trying to pickle an object with a custom __reduce__ method that
3203 * fell back to object.__reduce__ in certain circumstances led to
3204 * infinite recursion at Python level and eventual RuntimeError.
3205 * - Pickling objects that lied about their type by overwriting the
3206 * __class__ descriptor could lead to infinite recursion at C level
3207 * and eventual segfault.
3208 *
3209 * Because of backwards compatibility, the two methods still have to
3210 * behave in the same way, even if this is not required by the pickle
3211 * protocol. This common functionality was moved to the _common_reduce
3212 * function.
3213 */
3214static PyObject *
3215_common_reduce(PyObject *self, int proto)
3216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003217 PyObject *copyreg, *res;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003218
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003219 if (proto >= 2)
3220 return reduce_2(self);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003222 copyreg = import_copyreg();
3223 if (!copyreg)
3224 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003225
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003226 res = PyEval_CallMethod(copyreg, "_reduce_ex", "(Oi)", self, proto);
3227 Py_DECREF(copyreg);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003228
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003229 return res;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003230}
3231
3232static PyObject *
3233object_reduce(PyObject *self, PyObject *args)
3234{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003235 int proto = 0;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003236
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003237 if (!PyArg_ParseTuple(args, "|i:__reduce__", &proto))
3238 return NULL;
Guido van Rossumd8faa362007-04-27 19:54:29 +00003239
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003240 return _common_reduce(self, proto);
Guido van Rossumd8faa362007-04-27 19:54:29 +00003241}
3242
Guido van Rossum036f9992003-02-21 22:02:54 +00003243static PyObject *
3244object_reduce_ex(PyObject *self, PyObject *args)
3245{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003246 PyObject *reduce, *res;
3247 int proto = 0;
Guido van Rossum036f9992003-02-21 22:02:54 +00003248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003249 if (!PyArg_ParseTuple(args, "|i:__reduce_ex__", &proto))
3250 return NULL;
Guido van Rossum036f9992003-02-21 22:02:54 +00003251
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003252 reduce = PyObject_GetAttrString(self, "__reduce__");
3253 if (reduce == NULL)
3254 PyErr_Clear();
3255 else {
3256 PyObject *cls, *clsreduce, *objreduce;
3257 int override;
3258 cls = PyObject_GetAttrString(self, "__class__");
3259 if (cls == NULL) {
3260 Py_DECREF(reduce);
3261 return NULL;
3262 }
3263 clsreduce = PyObject_GetAttrString(cls, "__reduce__");
3264 Py_DECREF(cls);
3265 if (clsreduce == NULL) {
3266 Py_DECREF(reduce);
3267 return NULL;
3268 }
3269 objreduce = PyDict_GetItemString(PyBaseObject_Type.tp_dict,
3270 "__reduce__");
3271 override = (clsreduce != objreduce);
3272 Py_DECREF(clsreduce);
3273 if (override) {
3274 res = PyObject_CallObject(reduce, NULL);
3275 Py_DECREF(reduce);
3276 return res;
3277 }
3278 else
3279 Py_DECREF(reduce);
3280 }
Guido van Rossum036f9992003-02-21 22:02:54 +00003281
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003282 return _common_reduce(self, proto);
Guido van Rossum3926a632001-09-25 16:25:58 +00003283}
3284
Christian Heimes9e7f1d22008-02-28 12:27:11 +00003285static PyObject *
3286object_subclasshook(PyObject *cls, PyObject *args)
3287{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003288 Py_INCREF(Py_NotImplemented);
3289 return Py_NotImplemented;
Christian Heimes9e7f1d22008-02-28 12:27:11 +00003290}
3291
3292PyDoc_STRVAR(object_subclasshook_doc,
3293"Abstract classes can override this to customize issubclass().\n"
3294"\n"
3295"This is invoked early on by abc.ABCMeta.__subclasscheck__().\n"
3296"It should return True, False or NotImplemented. If it returns\n"
3297"NotImplemented, the normal algorithm is used. Otherwise, it\n"
3298"overrides the normal algorithm (and the outcome is cached).\n");
Eric Smith8c663262007-08-25 02:26:07 +00003299
3300/*
3301 from PEP 3101, this code implements:
3302
3303 class object:
3304 def __format__(self, format_spec):
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003305 return format(str(self), format_spec)
Eric Smith8c663262007-08-25 02:26:07 +00003306*/
3307static PyObject *
3308object_format(PyObject *self, PyObject *args)
3309{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003310 PyObject *format_spec;
3311 PyObject *self_as_str = NULL;
3312 PyObject *result = NULL;
Eric Smith8c663262007-08-25 02:26:07 +00003313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003314 if (!PyArg_ParseTuple(args, "U:__format__", &format_spec))
3315 return NULL;
Eric Smith8c663262007-08-25 02:26:07 +00003316
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003317 self_as_str = PyObject_Str(self);
Benjamin Petersonc03d7572010-06-05 01:03:24 +00003318 if (self_as_str != NULL)
3319 result = PyObject_Format(self_as_str, format_spec);
Eric Smith8c663262007-08-25 02:26:07 +00003320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003321 Py_XDECREF(self_as_str);
Eric Smith8c663262007-08-25 02:26:07 +00003322
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003323 return result;
Eric Smith8c663262007-08-25 02:26:07 +00003324}
3325
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003326static PyObject *
3327object_sizeof(PyObject *self, PyObject *args)
3328{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003329 Py_ssize_t res, isize;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003330
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003331 res = 0;
3332 isize = self->ob_type->tp_itemsize;
3333 if (isize > 0)
3334 res = Py_SIZE(self->ob_type) * isize;
3335 res += self->ob_type->tp_basicsize;
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003337 return PyLong_FromSsize_t(res);
Martin v. Löwis00709aa2008-06-04 14:18:43 +00003338}
3339
Guido van Rossum3926a632001-09-25 16:25:58 +00003340static PyMethodDef object_methods[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003341 {"__reduce_ex__", object_reduce_ex, METH_VARARGS,
3342 PyDoc_STR("helper for pickle")},
3343 {"__reduce__", object_reduce, METH_VARARGS,
3344 PyDoc_STR("helper for pickle")},
3345 {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
3346 object_subclasshook_doc},
3347 {"__format__", object_format, METH_VARARGS,
3348 PyDoc_STR("default object formatter")},
3349 {"__sizeof__", object_sizeof, METH_NOARGS,
3350 PyDoc_STR("__sizeof__() -> size of object in memory, in bytes")},
3351 {0}
Guido van Rossum3926a632001-09-25 16:25:58 +00003352};
3353
Guido van Rossum036f9992003-02-21 22:02:54 +00003354
Tim Peters6d6c1a32001-08-02 04:15:00 +00003355PyTypeObject PyBaseObject_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003356 PyVarObject_HEAD_INIT(&PyType_Type, 0)
3357 "object", /* tp_name */
3358 sizeof(PyObject), /* tp_basicsize */
3359 0, /* tp_itemsize */
3360 object_dealloc, /* tp_dealloc */
3361 0, /* tp_print */
3362 0, /* tp_getattr */
3363 0, /* tp_setattr */
3364 0, /* tp_reserved */
3365 object_repr, /* tp_repr */
3366 0, /* tp_as_number */
3367 0, /* tp_as_sequence */
3368 0, /* tp_as_mapping */
3369 (hashfunc)_Py_HashPointer, /* tp_hash */
3370 0, /* tp_call */
3371 object_str, /* tp_str */
3372 PyObject_GenericGetAttr, /* tp_getattro */
3373 PyObject_GenericSetAttr, /* tp_setattro */
3374 0, /* tp_as_buffer */
3375 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
3376 PyDoc_STR("The most base type"), /* tp_doc */
3377 0, /* tp_traverse */
3378 0, /* tp_clear */
3379 object_richcompare, /* tp_richcompare */
3380 0, /* tp_weaklistoffset */
3381 0, /* tp_iter */
3382 0, /* tp_iternext */
3383 object_methods, /* tp_methods */
3384 0, /* tp_members */
3385 object_getsets, /* tp_getset */
3386 0, /* tp_base */
3387 0, /* tp_dict */
3388 0, /* tp_descr_get */
3389 0, /* tp_descr_set */
3390 0, /* tp_dictoffset */
3391 object_init, /* tp_init */
3392 PyType_GenericAlloc, /* tp_alloc */
3393 object_new, /* tp_new */
3394 PyObject_Del, /* tp_free */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003395};
3396
3397
Guido van Rossum50e9fb92006-08-17 05:42:55 +00003398/* Add the methods from tp_methods to the __dict__ in a type object */
Tim Peters6d6c1a32001-08-02 04:15:00 +00003399
3400static int
3401add_methods(PyTypeObject *type, PyMethodDef *meth)
3402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003403 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003405 for (; meth->ml_name != NULL; meth++) {
3406 PyObject *descr;
3407 if (PyDict_GetItemString(dict, meth->ml_name) &&
3408 !(meth->ml_flags & METH_COEXIST))
3409 continue;
3410 if (meth->ml_flags & METH_CLASS) {
3411 if (meth->ml_flags & METH_STATIC) {
3412 PyErr_SetString(PyExc_ValueError,
3413 "method cannot be both class and static");
3414 return -1;
3415 }
3416 descr = PyDescr_NewClassMethod(type, meth);
3417 }
3418 else if (meth->ml_flags & METH_STATIC) {
3419 PyObject *cfunc = PyCFunction_New(meth, NULL);
3420 if (cfunc == NULL)
3421 return -1;
3422 descr = PyStaticMethod_New(cfunc);
3423 Py_DECREF(cfunc);
3424 }
3425 else {
3426 descr = PyDescr_NewMethod(type, meth);
3427 }
3428 if (descr == NULL)
3429 return -1;
3430 if (PyDict_SetItemString(dict, meth->ml_name, descr) < 0)
3431 return -1;
3432 Py_DECREF(descr);
3433 }
3434 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003435}
3436
3437static int
Guido van Rossum6f799372001-09-20 20:46:19 +00003438add_members(PyTypeObject *type, PyMemberDef *memb)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003439{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003440 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003441
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003442 for (; memb->name != NULL; memb++) {
3443 PyObject *descr;
3444 if (PyDict_GetItemString(dict, memb->name))
3445 continue;
3446 descr = PyDescr_NewMember(type, memb);
3447 if (descr == NULL)
3448 return -1;
3449 if (PyDict_SetItemString(dict, memb->name, descr) < 0)
3450 return -1;
3451 Py_DECREF(descr);
3452 }
3453 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003454}
3455
3456static int
Guido van Rossum32d34c82001-09-20 21:45:26 +00003457add_getset(PyTypeObject *type, PyGetSetDef *gsp)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003458{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003459 PyObject *dict = type->tp_dict;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003461 for (; gsp->name != NULL; gsp++) {
3462 PyObject *descr;
3463 if (PyDict_GetItemString(dict, gsp->name))
3464 continue;
3465 descr = PyDescr_NewGetSet(type, gsp);
Tim Peters6d6c1a32001-08-02 04:15:00 +00003466
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003467 if (descr == NULL)
3468 return -1;
3469 if (PyDict_SetItemString(dict, gsp->name, descr) < 0)
3470 return -1;
3471 Py_DECREF(descr);
3472 }
3473 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003474}
3475
Guido van Rossum13d52f02001-08-10 21:24:08 +00003476static void
3477inherit_special(PyTypeObject *type, PyTypeObject *base)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003478{
Tim Peters6d6c1a32001-08-02 04:15:00 +00003479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003480 /* Copying basicsize is connected to the GC flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003481 if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3482 (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3483 (!type->tp_traverse && !type->tp_clear)) {
3484 type->tp_flags |= Py_TPFLAGS_HAVE_GC;
3485 if (type->tp_traverse == NULL)
3486 type->tp_traverse = base->tp_traverse;
3487 if (type->tp_clear == NULL)
3488 type->tp_clear = base->tp_clear;
3489 }
3490 {
3491 /* The condition below could use some explanation.
3492 It appears that tp_new is not inherited for static types
3493 whose base class is 'object'; this seems to be a precaution
3494 so that old extension types don't suddenly become
3495 callable (object.__new__ wouldn't insure the invariants
3496 that the extension type's own factory function ensures).
3497 Heap types, of course, are under our control, so they do
3498 inherit tp_new; static extension types that specify some
3499 other built-in type as the default are considered
3500 new-style-aware so they also inherit object.__new__. */
3501 if (base != &PyBaseObject_Type ||
3502 (type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
3503 if (type->tp_new == NULL)
3504 type->tp_new = base->tp_new;
3505 }
3506 }
Benjamin Petersona7465e22010-07-05 15:01:22 +00003507 if (type->tp_basicsize == 0)
3508 type->tp_basicsize = base->tp_basicsize;
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00003509
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003510 /* Copy other non-function slots */
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00003511
3512#undef COPYVAL
3513#define COPYVAL(SLOT) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003514 if (type->SLOT == 0) type->SLOT = base->SLOT
Guido van Rossum4dd64ab2001-08-14 20:04:48 +00003515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003516 COPYVAL(tp_itemsize);
3517 COPYVAL(tp_weaklistoffset);
3518 COPYVAL(tp_dictoffset);
Thomas Wouters27d517b2007-02-25 20:39:11 +00003519
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003520 /* Setup fast subclass flags */
3521 if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException))
3522 type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
3523 else if (PyType_IsSubtype(base, &PyType_Type))
3524 type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
3525 else if (PyType_IsSubtype(base, &PyLong_Type))
3526 type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
3527 else if (PyType_IsSubtype(base, &PyBytes_Type))
3528 type->tp_flags |= Py_TPFLAGS_BYTES_SUBCLASS;
3529 else if (PyType_IsSubtype(base, &PyUnicode_Type))
3530 type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
3531 else if (PyType_IsSubtype(base, &PyTuple_Type))
3532 type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
3533 else if (PyType_IsSubtype(base, &PyList_Type))
3534 type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
3535 else if (PyType_IsSubtype(base, &PyDict_Type))
3536 type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003537}
3538
Guido van Rossumf5243f02008-01-01 04:06:48 +00003539static char *hash_name_op[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003540 "__eq__",
3541 "__hash__",
3542 NULL
Guido van Rossum38938152006-08-21 23:36:26 +00003543};
3544
3545static int
Guido van Rossumf5243f02008-01-01 04:06:48 +00003546overrides_hash(PyTypeObject *type)
Guido van Rossum38938152006-08-21 23:36:26 +00003547{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003548 char **p;
3549 PyObject *dict = type->tp_dict;
Guido van Rossum38938152006-08-21 23:36:26 +00003550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003551 assert(dict != NULL);
3552 for (p = hash_name_op; *p; p++) {
3553 if (PyDict_GetItemString(dict, *p) != NULL)
3554 return 1;
3555 }
3556 return 0;
Guido van Rossum38938152006-08-21 23:36:26 +00003557}
3558
Guido van Rossum13d52f02001-08-10 21:24:08 +00003559static void
3560inherit_slots(PyTypeObject *type, PyTypeObject *base)
3561{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003562 PyTypeObject *basebase;
Guido van Rossum13d52f02001-08-10 21:24:08 +00003563
3564#undef SLOTDEFINED
Tim Peters6d6c1a32001-08-02 04:15:00 +00003565#undef COPYSLOT
3566#undef COPYNUM
3567#undef COPYSEQ
3568#undef COPYMAP
Guido van Rossum5af588b2001-10-12 14:13:21 +00003569#undef COPYBUF
Guido van Rossum13d52f02001-08-10 21:24:08 +00003570
3571#define SLOTDEFINED(SLOT) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003572 (base->SLOT != 0 && \
3573 (basebase == NULL || base->SLOT != basebase->SLOT))
Guido van Rossum13d52f02001-08-10 21:24:08 +00003574
Tim Peters6d6c1a32001-08-02 04:15:00 +00003575#define COPYSLOT(SLOT) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003576 if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
Tim Peters6d6c1a32001-08-02 04:15:00 +00003577
3578#define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
3579#define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
3580#define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
Tim Petersfc57ccb2001-10-12 02:38:24 +00003581#define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003583 /* This won't inherit indirect slots (from tp_as_number etc.)
3584 if type doesn't provide the space. */
Guido van Rossum13d52f02001-08-10 21:24:08 +00003585
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003586 if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
3587 basebase = base->tp_base;
3588 if (basebase->tp_as_number == NULL)
3589 basebase = NULL;
3590 COPYNUM(nb_add);
3591 COPYNUM(nb_subtract);
3592 COPYNUM(nb_multiply);
3593 COPYNUM(nb_remainder);
3594 COPYNUM(nb_divmod);
3595 COPYNUM(nb_power);
3596 COPYNUM(nb_negative);
3597 COPYNUM(nb_positive);
3598 COPYNUM(nb_absolute);
3599 COPYNUM(nb_bool);
3600 COPYNUM(nb_invert);
3601 COPYNUM(nb_lshift);
3602 COPYNUM(nb_rshift);
3603 COPYNUM(nb_and);
3604 COPYNUM(nb_xor);
3605 COPYNUM(nb_or);
3606 COPYNUM(nb_int);
3607 COPYNUM(nb_float);
3608 COPYNUM(nb_inplace_add);
3609 COPYNUM(nb_inplace_subtract);
3610 COPYNUM(nb_inplace_multiply);
3611 COPYNUM(nb_inplace_remainder);
3612 COPYNUM(nb_inplace_power);
3613 COPYNUM(nb_inplace_lshift);
3614 COPYNUM(nb_inplace_rshift);
3615 COPYNUM(nb_inplace_and);
3616 COPYNUM(nb_inplace_xor);
3617 COPYNUM(nb_inplace_or);
3618 COPYNUM(nb_true_divide);
3619 COPYNUM(nb_floor_divide);
3620 COPYNUM(nb_inplace_true_divide);
3621 COPYNUM(nb_inplace_floor_divide);
3622 COPYNUM(nb_index);
3623 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003625 if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
3626 basebase = base->tp_base;
3627 if (basebase->tp_as_sequence == NULL)
3628 basebase = NULL;
3629 COPYSEQ(sq_length);
3630 COPYSEQ(sq_concat);
3631 COPYSEQ(sq_repeat);
3632 COPYSEQ(sq_item);
3633 COPYSEQ(sq_ass_item);
3634 COPYSEQ(sq_contains);
3635 COPYSEQ(sq_inplace_concat);
3636 COPYSEQ(sq_inplace_repeat);
3637 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003638
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003639 if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
3640 basebase = base->tp_base;
3641 if (basebase->tp_as_mapping == NULL)
3642 basebase = NULL;
3643 COPYMAP(mp_length);
3644 COPYMAP(mp_subscript);
3645 COPYMAP(mp_ass_subscript);
3646 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003647
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003648 if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
3649 basebase = base->tp_base;
3650 if (basebase->tp_as_buffer == NULL)
3651 basebase = NULL;
3652 COPYBUF(bf_getbuffer);
3653 COPYBUF(bf_releasebuffer);
3654 }
Tim Petersfc57ccb2001-10-12 02:38:24 +00003655
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003656 basebase = base->tp_base;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003657
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003658 COPYSLOT(tp_dealloc);
3659 if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
3660 type->tp_getattr = base->tp_getattr;
3661 type->tp_getattro = base->tp_getattro;
3662 }
3663 if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
3664 type->tp_setattr = base->tp_setattr;
3665 type->tp_setattro = base->tp_setattro;
3666 }
3667 /* tp_reserved is ignored */
3668 COPYSLOT(tp_repr);
3669 /* tp_hash see tp_richcompare */
3670 COPYSLOT(tp_call);
3671 COPYSLOT(tp_str);
3672 {
3673 /* Copy comparison-related slots only when
3674 not overriding them anywhere */
3675 if (type->tp_richcompare == NULL &&
3676 type->tp_hash == NULL &&
3677 !overrides_hash(type))
3678 {
3679 type->tp_richcompare = base->tp_richcompare;
3680 type->tp_hash = base->tp_hash;
3681 }
3682 }
3683 {
3684 COPYSLOT(tp_iter);
3685 COPYSLOT(tp_iternext);
3686 }
3687 {
3688 COPYSLOT(tp_descr_get);
3689 COPYSLOT(tp_descr_set);
3690 COPYSLOT(tp_dictoffset);
3691 COPYSLOT(tp_init);
3692 COPYSLOT(tp_alloc);
3693 COPYSLOT(tp_is_gc);
3694 if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
3695 (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
3696 /* They agree about gc. */
3697 COPYSLOT(tp_free);
3698 }
3699 else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
3700 type->tp_free == NULL &&
3701 base->tp_free == PyObject_Free) {
3702 /* A bit of magic to plug in the correct default
3703 * tp_free function when a derived class adds gc,
3704 * didn't define tp_free, and the base uses the
3705 * default non-gc tp_free.
3706 */
3707 type->tp_free = PyObject_GC_Del;
3708 }
3709 /* else they didn't agree about gc, and there isn't something
3710 * obvious to be done -- the type is on its own.
3711 */
3712 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003713}
3714
Jeremy Hylton938ace62002-07-17 16:30:39 +00003715static int add_operators(PyTypeObject *);
Guido van Rossum13d52f02001-08-10 21:24:08 +00003716
Tim Peters6d6c1a32001-08-02 04:15:00 +00003717int
Guido van Rossum528b7eb2001-08-07 17:24:28 +00003718PyType_Ready(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003719{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003720 PyObject *dict, *bases;
3721 PyTypeObject *base;
3722 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003723
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003724 if (type->tp_flags & Py_TPFLAGS_READY) {
3725 assert(type->tp_dict != NULL);
3726 return 0;
3727 }
3728 assert((type->tp_flags & Py_TPFLAGS_READYING) == 0);
Guido van Rossumd614f972001-08-10 17:39:49 +00003729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003730 type->tp_flags |= Py_TPFLAGS_READYING;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003731
Tim Peters36eb4df2003-03-23 03:33:13 +00003732#ifdef Py_TRACE_REFS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003733 /* PyType_Ready is the closest thing we have to a choke point
3734 * for type objects, so is the best place I can think of to try
3735 * to get type objects into the doubly-linked list of all objects.
3736 * Still, not all type objects go thru PyType_Ready.
3737 */
3738 _Py_AddToAllObjects((PyObject *)type, 0);
Tim Peters36eb4df2003-03-23 03:33:13 +00003739#endif
3740
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003741 /* Initialize tp_base (defaults to BaseObject unless that's us) */
3742 base = type->tp_base;
3743 if (base == NULL && type != &PyBaseObject_Type) {
3744 base = type->tp_base = &PyBaseObject_Type;
3745 Py_INCREF(base);
3746 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003747
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003748 /* Now the only way base can still be NULL is if type is
3749 * &PyBaseObject_Type.
3750 */
Guido van Rossum692cdbc2006-03-10 02:04:28 +00003751
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003752 /* Initialize the base class */
3753 if (base != NULL && base->tp_dict == NULL) {
3754 if (PyType_Ready(base) < 0)
3755 goto error;
3756 }
Guido van Rossum323a9cf2002-08-14 17:26:30 +00003757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003758 /* Initialize ob_type if NULL. This means extensions that want to be
3759 compilable separately on Windows can call PyType_Ready() instead of
3760 initializing the ob_type field of their type objects. */
3761 /* The test for base != NULL is really unnecessary, since base is only
3762 NULL when type is &PyBaseObject_Type, and we know its ob_type is
3763 not NULL (it's initialized to &PyType_Type). But coverity doesn't
3764 know that. */
3765 if (Py_TYPE(type) == NULL && base != NULL)
3766 Py_TYPE(type) = Py_TYPE(base);
Guido van Rossum0986d822002-04-08 01:38:42 +00003767
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003768 /* Initialize tp_bases */
3769 bases = type->tp_bases;
3770 if (bases == NULL) {
3771 if (base == NULL)
3772 bases = PyTuple_New(0);
3773 else
3774 bases = PyTuple_Pack(1, base);
3775 if (bases == NULL)
3776 goto error;
3777 type->tp_bases = bases;
3778 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003779
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003780 /* Initialize tp_dict */
3781 dict = type->tp_dict;
3782 if (dict == NULL) {
3783 dict = PyDict_New();
3784 if (dict == NULL)
3785 goto error;
3786 type->tp_dict = dict;
3787 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003789 /* Add type-specific descriptors to tp_dict */
3790 if (add_operators(type) < 0)
3791 goto error;
3792 if (type->tp_methods != NULL) {
3793 if (add_methods(type, type->tp_methods) < 0)
3794 goto error;
3795 }
3796 if (type->tp_members != NULL) {
3797 if (add_members(type, type->tp_members) < 0)
3798 goto error;
3799 }
3800 if (type->tp_getset != NULL) {
3801 if (add_getset(type, type->tp_getset) < 0)
3802 goto error;
3803 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003804
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003805 /* Calculate method resolution order */
3806 if (mro_internal(type) < 0) {
3807 goto error;
3808 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003809
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003810 /* Inherit special flags from dominant base */
3811 if (type->tp_base != NULL)
3812 inherit_special(type, type->tp_base);
Guido van Rossum13d52f02001-08-10 21:24:08 +00003813
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003814 /* Initialize tp_dict properly */
3815 bases = type->tp_mro;
3816 assert(bases != NULL);
3817 assert(PyTuple_Check(bases));
3818 n = PyTuple_GET_SIZE(bases);
3819 for (i = 1; i < n; i++) {
3820 PyObject *b = PyTuple_GET_ITEM(bases, i);
3821 if (PyType_Check(b))
3822 inherit_slots(type, (PyTypeObject *)b);
3823 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003825 /* Sanity check for tp_free. */
3826 if (PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
3827 (type->tp_free == NULL || type->tp_free == PyObject_Del)) {
3828 /* This base class needs to call tp_free, but doesn't have
3829 * one, or its tp_free is for non-gc'ed objects.
3830 */
3831 PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
3832 "gc and is a base type but has inappropriate "
3833 "tp_free slot",
3834 type->tp_name);
3835 goto error;
3836 }
Tim Peters3cfe7542003-05-21 21:29:48 +00003837
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003838 /* if the type dictionary doesn't contain a __doc__, set it from
3839 the tp_doc slot.
3840 */
3841 if (PyDict_GetItemString(type->tp_dict, "__doc__") == NULL) {
3842 if (type->tp_doc != NULL) {
3843 PyObject *doc = PyUnicode_FromString(type->tp_doc);
3844 if (doc == NULL)
3845 goto error;
3846 PyDict_SetItemString(type->tp_dict, "__doc__", doc);
3847 Py_DECREF(doc);
3848 } else {
3849 PyDict_SetItemString(type->tp_dict,
3850 "__doc__", Py_None);
3851 }
3852 }
Martin v. Löwisf9bd6b02002-02-18 17:46:48 +00003853
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003854 /* Hack for tp_hash and __hash__.
3855 If after all that, tp_hash is still NULL, and __hash__ is not in
3856 tp_dict, set tp_hash to PyObject_HashNotImplemented and
3857 tp_dict['__hash__'] equal to None.
3858 This signals that __hash__ is not inherited.
3859 */
3860 if (type->tp_hash == NULL) {
3861 if (PyDict_GetItemString(type->tp_dict, "__hash__") == NULL) {
3862 if (PyDict_SetItemString(type->tp_dict, "__hash__", Py_None) < 0)
3863 goto error;
3864 type->tp_hash = PyObject_HashNotImplemented;
3865 }
3866 }
Guido van Rossum38938152006-08-21 23:36:26 +00003867
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003868 /* Some more special stuff */
3869 base = type->tp_base;
3870 if (base != NULL) {
3871 if (type->tp_as_number == NULL)
3872 type->tp_as_number = base->tp_as_number;
3873 if (type->tp_as_sequence == NULL)
3874 type->tp_as_sequence = base->tp_as_sequence;
3875 if (type->tp_as_mapping == NULL)
3876 type->tp_as_mapping = base->tp_as_mapping;
3877 if (type->tp_as_buffer == NULL)
3878 type->tp_as_buffer = base->tp_as_buffer;
3879 }
Tim Peters6d6c1a32001-08-02 04:15:00 +00003880
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003881 /* Link into each base class's list of subclasses */
3882 bases = type->tp_bases;
3883 n = PyTuple_GET_SIZE(bases);
3884 for (i = 0; i < n; i++) {
3885 PyObject *b = PyTuple_GET_ITEM(bases, i);
3886 if (PyType_Check(b) &&
3887 add_subclass((PyTypeObject *)b, type) < 0)
3888 goto error;
3889 }
Guido van Rossum1c450732001-10-08 15:18:27 +00003890
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003891 /* Warn for a type that implements tp_compare (now known as
3892 tp_reserved) but not tp_richcompare. */
3893 if (type->tp_reserved && !type->tp_richcompare) {
3894 int error;
3895 char msg[240];
3896 PyOS_snprintf(msg, sizeof(msg),
3897 "Type %.100s defines tp_reserved (formerly "
3898 "tp_compare) but not tp_richcompare. "
3899 "Comparisons may not behave as intended.",
3900 type->tp_name);
3901 error = PyErr_WarnEx(PyExc_DeprecationWarning, msg, 1);
3902 if (error == -1)
3903 goto error;
3904 }
Mark Dickinson2a7d45b2009-02-08 11:02:10 +00003905
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003906 /* All done -- set the ready flag */
3907 assert(type->tp_dict != NULL);
3908 type->tp_flags =
3909 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
3910 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00003911
3912 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003913 type->tp_flags &= ~Py_TPFLAGS_READYING;
3914 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003915}
3916
Guido van Rossum1c450732001-10-08 15:18:27 +00003917static int
3918add_subclass(PyTypeObject *base, PyTypeObject *type)
3919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003920 Py_ssize_t i;
3921 int result;
3922 PyObject *list, *ref, *newobj;
Guido van Rossum1c450732001-10-08 15:18:27 +00003923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003924 list = base->tp_subclasses;
3925 if (list == NULL) {
3926 base->tp_subclasses = list = PyList_New(0);
3927 if (list == NULL)
3928 return -1;
3929 }
3930 assert(PyList_Check(list));
3931 newobj = PyWeakref_NewRef((PyObject *)type, NULL);
3932 i = PyList_GET_SIZE(list);
3933 while (--i >= 0) {
3934 ref = PyList_GET_ITEM(list, i);
3935 assert(PyWeakref_CheckRef(ref));
3936 if (PyWeakref_GET_OBJECT(ref) == Py_None)
3937 return PyList_SetItem(list, i, newobj);
3938 }
3939 result = PyList_Append(list, newobj);
3940 Py_DECREF(newobj);
3941 return result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003942}
3943
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003944static void
3945remove_subclass(PyTypeObject *base, PyTypeObject *type)
3946{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 Py_ssize_t i;
3948 PyObject *list, *ref;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003949
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003950 list = base->tp_subclasses;
3951 if (list == NULL) {
3952 return;
3953 }
3954 assert(PyList_Check(list));
3955 i = PyList_GET_SIZE(list);
3956 while (--i >= 0) {
3957 ref = PyList_GET_ITEM(list, i);
3958 assert(PyWeakref_CheckRef(ref));
3959 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
3960 /* this can't fail, right? */
3961 PySequence_DelItem(list, i);
3962 return;
3963 }
3964 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003965}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003966
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003967static int
3968check_num_args(PyObject *ob, int n)
3969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003970 if (!PyTuple_CheckExact(ob)) {
3971 PyErr_SetString(PyExc_SystemError,
3972 "PyArg_UnpackTuple() argument list is not a tuple");
3973 return 0;
3974 }
3975 if (n == PyTuple_GET_SIZE(ob))
3976 return 1;
3977 PyErr_Format(
3978 PyExc_TypeError,
3979 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
3980 return 0;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003981}
3982
Tim Peters6d6c1a32001-08-02 04:15:00 +00003983/* Generic wrappers for overloadable 'operators' such as __getitem__ */
3984
3985/* There's a wrapper *function* for each distinct function typedef used
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003986 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
Tim Peters6d6c1a32001-08-02 04:15:00 +00003987 wrapper *table* for each distinct operation (e.g. __len__, __add__).
3988 Most tables have only one entry; the tables for binary operators have two
3989 entries, one regular and one with reversed arguments. */
3990
3991static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003992wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003993{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 lenfunc func = (lenfunc)wrapped;
3995 Py_ssize_t res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003996
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003997 if (!check_num_args(args, 0))
3998 return NULL;
3999 res = (*func)(self);
4000 if (res == -1 && PyErr_Occurred())
4001 return NULL;
4002 return PyLong_FromLong((long)res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004003}
4004
Tim Peters6d6c1a32001-08-02 04:15:00 +00004005static PyObject *
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004006wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
4007{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 inquiry func = (inquiry)wrapped;
4009 int res;
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004010
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004011 if (!check_num_args(args, 0))
4012 return NULL;
4013 res = (*func)(self);
4014 if (res == -1 && PyErr_Occurred())
4015 return NULL;
4016 return PyBool_FromLong((long)res);
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004017}
4018
4019static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004020wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
4021{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 binaryfunc func = (binaryfunc)wrapped;
4023 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004024
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004025 if (!check_num_args(args, 1))
4026 return NULL;
4027 other = PyTuple_GET_ITEM(args, 0);
4028 return (*func)(self, other);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004029}
4030
4031static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004032wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
4033{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 binaryfunc func = (binaryfunc)wrapped;
4035 PyObject *other;
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004036
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004037 if (!check_num_args(args, 1))
4038 return NULL;
4039 other = PyTuple_GET_ITEM(args, 0);
4040 return (*func)(self, other);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004041}
4042
4043static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004044wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
4045{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 binaryfunc func = (binaryfunc)wrapped;
4047 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004049 if (!check_num_args(args, 1))
4050 return NULL;
4051 other = PyTuple_GET_ITEM(args, 0);
4052 if (!PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) {
4053 Py_INCREF(Py_NotImplemented);
4054 return Py_NotImplemented;
4055 }
4056 return (*func)(other, self);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004057}
4058
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004059static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004060wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
4061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004062 ternaryfunc func = (ternaryfunc)wrapped;
4063 PyObject *other;
4064 PyObject *third = Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004065
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004066 /* Note: This wrapper only works for __pow__() */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004068 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
4069 return NULL;
4070 return (*func)(self, other, third);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004071}
4072
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004073static PyObject *
4074wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
4075{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004076 ternaryfunc func = (ternaryfunc)wrapped;
4077 PyObject *other;
4078 PyObject *third = Py_None;
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004079
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004080 /* Note: This wrapper only works for __pow__() */
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004082 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
4083 return NULL;
4084 return (*func)(other, self, third);
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004085}
4086
Tim Peters6d6c1a32001-08-02 04:15:00 +00004087static PyObject *
4088wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
4089{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004090 unaryfunc func = (unaryfunc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004092 if (!check_num_args(args, 0))
4093 return NULL;
4094 return (*func)(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004095}
4096
Tim Peters6d6c1a32001-08-02 04:15:00 +00004097static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004098wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004100 ssizeargfunc func = (ssizeargfunc)wrapped;
4101 PyObject* o;
4102 Py_ssize_t i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004103
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004104 if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
4105 return NULL;
4106 i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
4107 if (i == -1 && PyErr_Occurred())
4108 return NULL;
4109 return (*func)(self, i);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004110}
4111
Martin v. Löwis18e16552006-02-15 17:27:45 +00004112static Py_ssize_t
Guido van Rossum5d815f32001-08-17 21:57:47 +00004113getindex(PyObject *self, PyObject *arg)
4114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004115 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004117 i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
4118 if (i == -1 && PyErr_Occurred())
4119 return -1;
4120 if (i < 0) {
4121 PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
4122 if (sq && sq->sq_length) {
4123 Py_ssize_t n = (*sq->sq_length)(self);
4124 if (n < 0)
4125 return -1;
4126 i += n;
4127 }
4128 }
4129 return i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004130}
4131
4132static PyObject *
4133wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
4134{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004135 ssizeargfunc func = (ssizeargfunc)wrapped;
4136 PyObject *arg;
4137 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004139 if (PyTuple_GET_SIZE(args) == 1) {
4140 arg = PyTuple_GET_ITEM(args, 0);
4141 i = getindex(self, arg);
4142 if (i == -1 && PyErr_Occurred())
4143 return NULL;
4144 return (*func)(self, i);
4145 }
4146 check_num_args(args, 1);
4147 assert(PyErr_Occurred());
4148 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004149}
4150
Tim Peters6d6c1a32001-08-02 04:15:00 +00004151static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00004152wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004153{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004154 ssizeobjargproc func = (ssizeobjargproc)wrapped;
4155 Py_ssize_t i;
4156 int res;
4157 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004158
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004159 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
4160 return NULL;
4161 i = getindex(self, arg);
4162 if (i == -1 && PyErr_Occurred())
4163 return NULL;
4164 res = (*func)(self, i, value);
4165 if (res == -1 && PyErr_Occurred())
4166 return NULL;
4167 Py_INCREF(Py_None);
4168 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004169}
4170
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004171static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00004172wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004173{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004174 ssizeobjargproc func = (ssizeobjargproc)wrapped;
4175 Py_ssize_t i;
4176 int res;
4177 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004178
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004179 if (!check_num_args(args, 1))
4180 return NULL;
4181 arg = PyTuple_GET_ITEM(args, 0);
4182 i = getindex(self, arg);
4183 if (i == -1 && PyErr_Occurred())
4184 return NULL;
4185 res = (*func)(self, i, NULL);
4186 if (res == -1 && PyErr_Occurred())
4187 return NULL;
4188 Py_INCREF(Py_None);
4189 return Py_None;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004190}
4191
Tim Peters6d6c1a32001-08-02 04:15:00 +00004192/* XXX objobjproc is a misnomer; should be objargpred */
4193static PyObject *
4194wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
4195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004196 objobjproc func = (objobjproc)wrapped;
4197 int res;
4198 PyObject *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004200 if (!check_num_args(args, 1))
4201 return NULL;
4202 value = PyTuple_GET_ITEM(args, 0);
4203 res = (*func)(self, value);
4204 if (res == -1 && PyErr_Occurred())
4205 return NULL;
4206 else
4207 return PyBool_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004208}
4209
Tim Peters6d6c1a32001-08-02 04:15:00 +00004210static PyObject *
4211wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
4212{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004213 objobjargproc func = (objobjargproc)wrapped;
4214 int res;
4215 PyObject *key, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004216
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004217 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
4218 return NULL;
4219 res = (*func)(self, key, value);
4220 if (res == -1 && PyErr_Occurred())
4221 return NULL;
4222 Py_INCREF(Py_None);
4223 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004224}
4225
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004226static PyObject *
4227wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
4228{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004229 objobjargproc func = (objobjargproc)wrapped;
4230 int res;
4231 PyObject *key;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004232
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004233 if (!check_num_args(args, 1))
4234 return NULL;
4235 key = PyTuple_GET_ITEM(args, 0);
4236 res = (*func)(self, key, NULL);
4237 if (res == -1 && PyErr_Occurred())
4238 return NULL;
4239 Py_INCREF(Py_None);
4240 return Py_None;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004241}
4242
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004243/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
Guido van Rossum52b27052003-04-15 20:05:10 +00004244 This is called the Carlo Verre hack after its discoverer. */
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004245static int
4246hackcheck(PyObject *self, setattrofunc func, char *what)
4247{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004248 PyTypeObject *type = Py_TYPE(self);
4249 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
4250 type = type->tp_base;
4251 /* If type is NULL now, this is a really weird type.
4252 In the spirit of backwards compatibility (?), just shut up. */
4253 if (type && type->tp_setattro != func) {
4254 PyErr_Format(PyExc_TypeError,
4255 "can't apply this %s to %s object",
4256 what,
4257 type->tp_name);
4258 return 0;
4259 }
4260 return 1;
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004261}
4262
Tim Peters6d6c1a32001-08-02 04:15:00 +00004263static PyObject *
4264wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
4265{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004266 setattrofunc func = (setattrofunc)wrapped;
4267 int res;
4268 PyObject *name, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004270 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
4271 return NULL;
4272 if (!hackcheck(self, func, "__setattr__"))
4273 return NULL;
4274 res = (*func)(self, name, value);
4275 if (res < 0)
4276 return NULL;
4277 Py_INCREF(Py_None);
4278 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004279}
4280
4281static PyObject *
4282wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
4283{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004284 setattrofunc func = (setattrofunc)wrapped;
4285 int res;
4286 PyObject *name;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004287
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004288 if (!check_num_args(args, 1))
4289 return NULL;
4290 name = PyTuple_GET_ITEM(args, 0);
4291 if (!hackcheck(self, func, "__delattr__"))
4292 return NULL;
4293 res = (*func)(self, name, NULL);
4294 if (res < 0)
4295 return NULL;
4296 Py_INCREF(Py_None);
4297 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004298}
4299
Tim Peters6d6c1a32001-08-02 04:15:00 +00004300static PyObject *
4301wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
4302{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 hashfunc func = (hashfunc)wrapped;
4304 long res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004305
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004306 if (!check_num_args(args, 0))
4307 return NULL;
4308 res = (*func)(self);
4309 if (res == -1 && PyErr_Occurred())
4310 return NULL;
4311 return PyLong_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004312}
4313
Tim Peters6d6c1a32001-08-02 04:15:00 +00004314static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004315wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004316{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004317 ternaryfunc func = (ternaryfunc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004318
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004319 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004320}
4321
Tim Peters6d6c1a32001-08-02 04:15:00 +00004322static PyObject *
4323wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
4324{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 richcmpfunc func = (richcmpfunc)wrapped;
4326 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004328 if (!check_num_args(args, 1))
4329 return NULL;
4330 other = PyTuple_GET_ITEM(args, 0);
4331 return (*func)(self, other, op);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004332}
4333
4334#undef RICHCMP_WRAPPER
4335#define RICHCMP_WRAPPER(NAME, OP) \
4336static PyObject * \
4337richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
4338{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004339 return wrap_richcmpfunc(self, args, wrapped, OP); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004340}
4341
Jack Jansen8e938b42001-08-08 15:29:49 +00004342RICHCMP_WRAPPER(lt, Py_LT)
4343RICHCMP_WRAPPER(le, Py_LE)
4344RICHCMP_WRAPPER(eq, Py_EQ)
4345RICHCMP_WRAPPER(ne, Py_NE)
4346RICHCMP_WRAPPER(gt, Py_GT)
4347RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004348
Tim Peters6d6c1a32001-08-02 04:15:00 +00004349static PyObject *
4350wrap_next(PyObject *self, PyObject *args, void *wrapped)
4351{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 unaryfunc func = (unaryfunc)wrapped;
4353 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004354
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004355 if (!check_num_args(args, 0))
4356 return NULL;
4357 res = (*func)(self);
4358 if (res == NULL && !PyErr_Occurred())
4359 PyErr_SetNone(PyExc_StopIteration);
4360 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004361}
4362
Tim Peters6d6c1a32001-08-02 04:15:00 +00004363static PyObject *
4364wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
4365{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004366 descrgetfunc func = (descrgetfunc)wrapped;
4367 PyObject *obj;
4368 PyObject *type = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004369
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004370 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
4371 return NULL;
4372 if (obj == Py_None)
4373 obj = NULL;
4374 if (type == Py_None)
4375 type = NULL;
4376 if (type == NULL &&obj == NULL) {
4377 PyErr_SetString(PyExc_TypeError,
4378 "__get__(None, None) is invalid");
4379 return NULL;
4380 }
4381 return (*func)(self, obj, type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004382}
4383
Tim Peters6d6c1a32001-08-02 04:15:00 +00004384static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004385wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004386{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004387 descrsetfunc func = (descrsetfunc)wrapped;
4388 PyObject *obj, *value;
4389 int ret;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004390
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004391 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
4392 return NULL;
4393 ret = (*func)(self, obj, value);
4394 if (ret < 0)
4395 return NULL;
4396 Py_INCREF(Py_None);
4397 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004398}
Guido van Rossum22b13872002-08-06 21:41:44 +00004399
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004400static PyObject *
4401wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
4402{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004403 descrsetfunc func = (descrsetfunc)wrapped;
4404 PyObject *obj;
4405 int ret;
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004406
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004407 if (!check_num_args(args, 1))
4408 return NULL;
4409 obj = PyTuple_GET_ITEM(args, 0);
4410 ret = (*func)(self, obj, NULL);
4411 if (ret < 0)
4412 return NULL;
4413 Py_INCREF(Py_None);
4414 return Py_None;
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004415}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004416
Tim Peters6d6c1a32001-08-02 04:15:00 +00004417static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004418wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004419{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004420 initproc func = (initproc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004421
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004422 if (func(self, args, kwds) < 0)
4423 return NULL;
4424 Py_INCREF(Py_None);
4425 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004426}
4427
Tim Peters6d6c1a32001-08-02 04:15:00 +00004428static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004429tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004430{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 PyTypeObject *type, *subtype, *staticbase;
4432 PyObject *arg0, *res;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004433
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004434 if (self == NULL || !PyType_Check(self))
4435 Py_FatalError("__new__() called with non-type 'self'");
4436 type = (PyTypeObject *)self;
4437 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
4438 PyErr_Format(PyExc_TypeError,
4439 "%s.__new__(): not enough arguments",
4440 type->tp_name);
4441 return NULL;
4442 }
4443 arg0 = PyTuple_GET_ITEM(args, 0);
4444 if (!PyType_Check(arg0)) {
4445 PyErr_Format(PyExc_TypeError,
4446 "%s.__new__(X): X is not a type object (%s)",
4447 type->tp_name,
4448 Py_TYPE(arg0)->tp_name);
4449 return NULL;
4450 }
4451 subtype = (PyTypeObject *)arg0;
4452 if (!PyType_IsSubtype(subtype, type)) {
4453 PyErr_Format(PyExc_TypeError,
4454 "%s.__new__(%s): %s is not a subtype of %s",
4455 type->tp_name,
4456 subtype->tp_name,
4457 subtype->tp_name,
4458 type->tp_name);
4459 return NULL;
4460 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004461
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004462 /* Check that the use doesn't do something silly and unsafe like
4463 object.__new__(dict). To do this, we check that the
4464 most derived base that's not a heap type is this type. */
4465 staticbase = subtype;
4466 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
4467 staticbase = staticbase->tp_base;
4468 /* If staticbase is NULL now, it is a really weird type.
4469 In the spirit of backwards compatibility (?), just shut up. */
4470 if (staticbase && staticbase->tp_new != type->tp_new) {
4471 PyErr_Format(PyExc_TypeError,
4472 "%s.__new__(%s) is not safe, use %s.__new__()",
4473 type->tp_name,
4474 subtype->tp_name,
4475 staticbase == NULL ? "?" : staticbase->tp_name);
4476 return NULL;
4477 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004478
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004479 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
4480 if (args == NULL)
4481 return NULL;
4482 res = type->tp_new(subtype, args, kwds);
4483 Py_DECREF(args);
4484 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004485}
4486
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004487static struct PyMethodDef tp_new_methoddef[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004488 {"__new__", (PyCFunction)tp_new_wrapper, METH_VARARGS|METH_KEYWORDS,
4489 PyDoc_STR("T.__new__(S, ...) -> "
4490 "a new object with type S, a subtype of T")},
4491 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004492};
4493
4494static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004495add_tp_new_wrapper(PyTypeObject *type)
4496{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004497 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004498
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004499 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
4500 return 0;
4501 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
4502 if (func == NULL)
4503 return -1;
4504 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
4505 Py_DECREF(func);
4506 return -1;
4507 }
4508 Py_DECREF(func);
4509 return 0;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004510}
4511
Guido van Rossumf040ede2001-08-07 16:40:56 +00004512/* Slot wrappers that call the corresponding __foo__ slot. See comments
4513 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004514
Guido van Rossumdc91b992001-08-08 22:26:22 +00004515#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004516static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004517FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004518{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004519 static PyObject *cache_str; \
4520 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004521}
4522
Guido van Rossumdc91b992001-08-08 22:26:22 +00004523#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004524static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004525FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004526{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004527 static PyObject *cache_str; \
4528 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004529}
4530
Guido van Rossumcd118802003-01-06 22:57:47 +00004531/* Boolean helper for SLOT1BINFULL().
4532 right.__class__ is a nontrivial subclass of left.__class__. */
4533static int
4534method_is_overloaded(PyObject *left, PyObject *right, char *name)
4535{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 PyObject *a, *b;
4537 int ok;
Guido van Rossumcd118802003-01-06 22:57:47 +00004538
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004539 b = PyObject_GetAttrString((PyObject *)(Py_TYPE(right)), name);
4540 if (b == NULL) {
4541 PyErr_Clear();
4542 /* If right doesn't have it, it's not overloaded */
4543 return 0;
4544 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004545
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004546 a = PyObject_GetAttrString((PyObject *)(Py_TYPE(left)), name);
4547 if (a == NULL) {
4548 PyErr_Clear();
4549 Py_DECREF(b);
4550 /* If right has it but left doesn't, it's overloaded */
4551 return 1;
4552 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004553
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004554 ok = PyObject_RichCompareBool(a, b, Py_NE);
4555 Py_DECREF(a);
4556 Py_DECREF(b);
4557 if (ok < 0) {
4558 PyErr_Clear();
4559 return 0;
4560 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004561
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004562 return ok;
Guido van Rossumcd118802003-01-06 22:57:47 +00004563}
4564
Guido van Rossumdc91b992001-08-08 22:26:22 +00004565
4566#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004567static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004568FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004569{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004570 static PyObject *cache_str, *rcache_str; \
4571 int do_other = Py_TYPE(self) != Py_TYPE(other) && \
4572 Py_TYPE(other)->tp_as_number != NULL && \
4573 Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
4574 if (Py_TYPE(self)->tp_as_number != NULL && \
4575 Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \
4576 PyObject *r; \
4577 if (do_other && \
4578 PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \
4579 method_is_overloaded(self, other, ROPSTR)) { \
4580 r = call_maybe( \
4581 other, ROPSTR, &rcache_str, "(O)", self); \
4582 if (r != Py_NotImplemented) \
4583 return r; \
4584 Py_DECREF(r); \
4585 do_other = 0; \
4586 } \
4587 r = call_maybe( \
4588 self, OPSTR, &cache_str, "(O)", other); \
4589 if (r != Py_NotImplemented || \
4590 Py_TYPE(other) == Py_TYPE(self)) \
4591 return r; \
4592 Py_DECREF(r); \
4593 } \
4594 if (do_other) { \
4595 return call_maybe( \
4596 other, ROPSTR, &rcache_str, "(O)", self); \
4597 } \
4598 Py_INCREF(Py_NotImplemented); \
4599 return Py_NotImplemented; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004600}
4601
4602#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004603 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
Guido van Rossumdc91b992001-08-08 22:26:22 +00004604
4605#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
4606static PyObject * \
4607FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
4608{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004609 static PyObject *cache_str; \
4610 return call_method(self, OPSTR, &cache_str, \
4611 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004612}
4613
Martin v. Löwis18e16552006-02-15 17:27:45 +00004614static Py_ssize_t
Tim Peters6d6c1a32001-08-02 04:15:00 +00004615slot_sq_length(PyObject *self)
4616{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004617 static PyObject *len_str;
4618 PyObject *res = call_method(self, "__len__", &len_str, "()");
4619 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004620
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004621 if (res == NULL)
4622 return -1;
4623 len = PyNumber_AsSsize_t(res, PyExc_OverflowError);
4624 Py_DECREF(res);
4625 if (len < 0) {
4626 if (!PyErr_Occurred())
4627 PyErr_SetString(PyExc_ValueError,
4628 "__len__() should return >= 0");
4629 return -1;
4630 }
4631 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004632}
4633
Guido van Rossumf4593e02001-10-03 12:09:30 +00004634/* Super-optimized version of slot_sq_item.
4635 Other slots could do the same... */
4636static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00004637slot_sq_item(PyObject *self, Py_ssize_t i)
Guido van Rossumf4593e02001-10-03 12:09:30 +00004638{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004639 static PyObject *getitem_str;
4640 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
4641 descrgetfunc f;
Guido van Rossumf4593e02001-10-03 12:09:30 +00004642
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004643 if (getitem_str == NULL) {
4644 getitem_str = PyUnicode_InternFromString("__getitem__");
4645 if (getitem_str == NULL)
4646 return NULL;
4647 }
4648 func = _PyType_Lookup(Py_TYPE(self), getitem_str);
4649 if (func != NULL) {
4650 if ((f = Py_TYPE(func)->tp_descr_get) == NULL)
4651 Py_INCREF(func);
4652 else {
4653 func = f(func, self, (PyObject *)(Py_TYPE(self)));
4654 if (func == NULL) {
4655 return NULL;
4656 }
4657 }
4658 ival = PyLong_FromSsize_t(i);
4659 if (ival != NULL) {
4660 args = PyTuple_New(1);
4661 if (args != NULL) {
4662 PyTuple_SET_ITEM(args, 0, ival);
4663 retval = PyObject_Call(func, args, NULL);
4664 Py_XDECREF(args);
4665 Py_XDECREF(func);
4666 return retval;
4667 }
4668 }
4669 }
4670 else {
4671 PyErr_SetObject(PyExc_AttributeError, getitem_str);
4672 }
4673 Py_XDECREF(args);
4674 Py_XDECREF(ival);
4675 Py_XDECREF(func);
4676 return NULL;
Guido van Rossumf4593e02001-10-03 12:09:30 +00004677}
4678
Tim Peters6d6c1a32001-08-02 04:15:00 +00004679static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004680slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004681{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 PyObject *res;
4683 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004684
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004685 if (value == NULL)
4686 res = call_method(self, "__delitem__", &delitem_str,
4687 "(n)", index);
4688 else
4689 res = call_method(self, "__setitem__", &setitem_str,
4690 "(nO)", index, value);
4691 if (res == NULL)
4692 return -1;
4693 Py_DECREF(res);
4694 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004695}
4696
4697static int
Tim Peters6d6c1a32001-08-02 04:15:00 +00004698slot_sq_contains(PyObject *self, PyObject *value)
4699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 PyObject *func, *res, *args;
4701 int result = -1;
Tim Petersbf9b2442003-03-23 05:35:36 +00004702
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004703 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004705 func = lookup_maybe(self, "__contains__", &contains_str);
4706 if (func != NULL) {
4707 args = PyTuple_Pack(1, value);
4708 if (args == NULL)
4709 res = NULL;
4710 else {
4711 res = PyObject_Call(func, args, NULL);
4712 Py_DECREF(args);
4713 }
4714 Py_DECREF(func);
4715 if (res != NULL) {
4716 result = PyObject_IsTrue(res);
4717 Py_DECREF(res);
4718 }
4719 }
4720 else if (! PyErr_Occurred()) {
4721 /* Possible results: -1 and 1 */
4722 result = (int)_PySequence_IterSearch(self, value,
4723 PY_ITERSEARCH_CONTAINS);
4724 }
4725 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004726}
4727
Tim Peters6d6c1a32001-08-02 04:15:00 +00004728#define slot_mp_length slot_sq_length
4729
Guido van Rossumdc91b992001-08-08 22:26:22 +00004730SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004731
4732static int
4733slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
4734{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 PyObject *res;
4736 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004737
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004738 if (value == NULL)
4739 res = call_method(self, "__delitem__", &delitem_str,
4740 "(O)", key);
4741 else
4742 res = call_method(self, "__setitem__", &setitem_str,
4743 "(OO)", key, value);
4744 if (res == NULL)
4745 return -1;
4746 Py_DECREF(res);
4747 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004748}
4749
Guido van Rossumdc91b992001-08-08 22:26:22 +00004750SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
4751SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
4752SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004753SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
4754SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
4755
Jeremy Hylton938ace62002-07-17 16:30:39 +00004756static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00004757
4758SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004759 nb_power, "__pow__", "__rpow__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004760
4761static PyObject *
4762slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
4763{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004764 static PyObject *pow_str;
Guido van Rossum2730b132001-08-28 18:22:14 +00004765
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004766 if (modulus == Py_None)
4767 return slot_nb_power_binary(self, other);
4768 /* Three-arg power doesn't use __rpow__. But ternary_op
4769 can call this when the second argument's type uses
4770 slot_nb_power, so check before calling self.__pow__. */
4771 if (Py_TYPE(self)->tp_as_number != NULL &&
4772 Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
4773 return call_method(self, "__pow__", &pow_str,
4774 "(OO)", other, modulus);
4775 }
4776 Py_INCREF(Py_NotImplemented);
4777 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00004778}
4779
4780SLOT0(slot_nb_negative, "__neg__")
4781SLOT0(slot_nb_positive, "__pos__")
4782SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004783
4784static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00004785slot_nb_bool(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004786{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004787 PyObject *func, *args;
4788 static PyObject *bool_str, *len_str;
4789 int result = -1;
4790 int using_len = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004791
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004792 func = lookup_maybe(self, "__bool__", &bool_str);
4793 if (func == NULL) {
4794 if (PyErr_Occurred())
4795 return -1;
4796 func = lookup_maybe(self, "__len__", &len_str);
4797 if (func == NULL)
4798 return PyErr_Occurred() ? -1 : 1;
4799 using_len = 1;
4800 }
4801 args = PyTuple_New(0);
4802 if (args != NULL) {
4803 PyObject *temp = PyObject_Call(func, args, NULL);
4804 Py_DECREF(args);
4805 if (temp != NULL) {
4806 if (using_len) {
4807 /* enforced by slot_nb_len */
4808 result = PyObject_IsTrue(temp);
4809 }
4810 else if (PyBool_Check(temp)) {
4811 result = PyObject_IsTrue(temp);
4812 }
4813 else {
4814 PyErr_Format(PyExc_TypeError,
4815 "__bool__ should return "
4816 "bool, returned %s",
4817 Py_TYPE(temp)->tp_name);
4818 result = -1;
4819 }
4820 Py_DECREF(temp);
4821 }
4822 }
4823 Py_DECREF(func);
4824 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004825}
4826
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004827
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004828static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004829slot_nb_index(PyObject *self)
4830{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004831 static PyObject *index_str;
4832 return call_method(self, "__index__", &index_str, "()");
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004833}
4834
4835
Guido van Rossumdc91b992001-08-08 22:26:22 +00004836SLOT0(slot_nb_invert, "__invert__")
4837SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
4838SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
4839SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
4840SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
4841SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004842
Guido van Rossumdc91b992001-08-08 22:26:22 +00004843SLOT0(slot_nb_int, "__int__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004844SLOT0(slot_nb_float, "__float__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004845SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
4846SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
4847SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004848SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
Thomas Wouterscf297e42007-02-23 15:07:44 +00004849/* Can't use SLOT1 here, because nb_inplace_power is ternary */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004850static PyObject *
4851slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
4852{
4853 static PyObject *cache_str;
4854 return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004855}
Guido van Rossumdc91b992001-08-08 22:26:22 +00004856SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
4857SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
4858SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
4859SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
4860SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
4861SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004862 "__floordiv__", "__rfloordiv__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004863SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
4864SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
4865SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004866
Guido van Rossumb8f63662001-08-15 23:57:02 +00004867static PyObject *
4868slot_tp_repr(PyObject *self)
4869{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 PyObject *func, *res;
4871 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004872
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004873 func = lookup_method(self, "__repr__", &repr_str);
4874 if (func != NULL) {
4875 res = PyEval_CallObject(func, NULL);
4876 Py_DECREF(func);
4877 return res;
4878 }
4879 PyErr_Clear();
4880 return PyUnicode_FromFormat("<%s object at %p>",
4881 Py_TYPE(self)->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004882}
4883
4884static PyObject *
4885slot_tp_str(PyObject *self)
4886{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 PyObject *func, *res;
4888 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004890 func = lookup_method(self, "__str__", &str_str);
4891 if (func != NULL) {
4892 res = PyEval_CallObject(func, NULL);
4893 Py_DECREF(func);
4894 return res;
4895 }
4896 else {
4897 PyObject *ress;
4898 PyErr_Clear();
4899 res = slot_tp_repr(self);
4900 if (!res)
4901 return NULL;
4902 ress = _PyUnicode_AsDefaultEncodedString(res, NULL);
4903 Py_DECREF(res);
4904 return ress;
4905 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004906}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004907
4908static long
4909slot_tp_hash(PyObject *self)
4910{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004911 PyObject *func, *res;
4912 static PyObject *hash_str;
4913 long h;
Mark Dickinsondc787d22010-05-23 13:33:13 +00004914 int overflow;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004915
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004916 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004917
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004918 if (func == Py_None) {
4919 Py_DECREF(func);
4920 func = NULL;
4921 }
Guido van Rossum50e9fb92006-08-17 05:42:55 +00004922
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004923 if (func == NULL) {
4924 return PyObject_HashNotImplemented(self);
4925 }
Guido van Rossum50e9fb92006-08-17 05:42:55 +00004926
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004927 res = PyEval_CallObject(func, NULL);
4928 Py_DECREF(func);
4929 if (res == NULL)
4930 return -1;
Mark Dickinsondc787d22010-05-23 13:33:13 +00004931
4932 if (!PyLong_Check(res)) {
4933 PyErr_SetString(PyExc_TypeError,
4934 "__hash__ method should return an integer");
4935 return -1;
4936 }
4937 /* Transform the PyLong `res` to a C long `h`. For an existing
4938 hashable Python object x, hash(x) will always lie within the range
4939 of a C long. Therefore our transformation must preserve values
4940 that already lie within this range, to ensure that if x.__hash__()
4941 returns hash(y) then hash(x) == hash(y). */
4942 h = PyLong_AsLongAndOverflow(res, &overflow);
4943 if (overflow)
4944 /* res was not within the range of a C long, so we're free to
4945 use any sufficiently bit-mixing transformation;
4946 long.__hash__ will do nicely. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004947 h = PyLong_Type.tp_hash(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004948 Py_DECREF(res);
Mark Dickinsondc787d22010-05-23 13:33:13 +00004949 if (h == -1 && !PyErr_Occurred())
4950 h = -2;
4951 return h;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004952}
4953
4954static PyObject *
4955slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
4956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004957 static PyObject *call_str;
4958 PyObject *meth = lookup_method(self, "__call__", &call_str);
4959 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 if (meth == NULL)
4962 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004963
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004964 res = PyObject_Call(meth, args, kwds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004965
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004966 Py_DECREF(meth);
4967 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004968}
4969
Guido van Rossum14a6f832001-10-17 13:59:09 +00004970/* There are two slot dispatch functions for tp_getattro.
4971
4972 - slot_tp_getattro() is used when __getattribute__ is overridden
4973 but no __getattr__ hook is present;
4974
4975 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
4976
Guido van Rossumc334df52002-04-04 23:44:47 +00004977 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
4978 detects the absence of __getattr__ and then installs the simpler slot if
4979 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00004980
Tim Peters6d6c1a32001-08-02 04:15:00 +00004981static PyObject *
4982slot_tp_getattro(PyObject *self, PyObject *name)
4983{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004984 static PyObject *getattribute_str = NULL;
4985 return call_method(self, "__getattribute__", &getattribute_str,
4986 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004987}
4988
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004989static PyObject *
Benjamin Peterson9262b842008-11-17 22:45:50 +00004990call_attribute(PyObject *self, PyObject *attr, PyObject *name)
4991{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 PyObject *res, *descr = NULL;
4993 descrgetfunc f = Py_TYPE(attr)->tp_descr_get;
Benjamin Peterson9262b842008-11-17 22:45:50 +00004994
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004995 if (f != NULL) {
4996 descr = f(attr, self, (PyObject *)(Py_TYPE(self)));
4997 if (descr == NULL)
4998 return NULL;
4999 else
5000 attr = descr;
5001 }
5002 res = PyObject_CallFunctionObjArgs(attr, name, NULL);
5003 Py_XDECREF(descr);
5004 return res;
Benjamin Peterson9262b842008-11-17 22:45:50 +00005005}
5006
5007static PyObject *
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005008slot_tp_getattr_hook(PyObject *self, PyObject *name)
5009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005010 PyTypeObject *tp = Py_TYPE(self);
5011 PyObject *getattr, *getattribute, *res;
5012 static PyObject *getattribute_str = NULL;
5013 static PyObject *getattr_str = NULL;
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005014
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005015 if (getattr_str == NULL) {
5016 getattr_str = PyUnicode_InternFromString("__getattr__");
5017 if (getattr_str == NULL)
5018 return NULL;
5019 }
5020 if (getattribute_str == NULL) {
5021 getattribute_str =
5022 PyUnicode_InternFromString("__getattribute__");
5023 if (getattribute_str == NULL)
5024 return NULL;
5025 }
5026 /* speed hack: we could use lookup_maybe, but that would resolve the
5027 method fully for each attribute lookup for classes with
5028 __getattr__, even when the attribute is present. So we use
5029 _PyType_Lookup and create the method only when needed, with
5030 call_attribute. */
5031 getattr = _PyType_Lookup(tp, getattr_str);
5032 if (getattr == NULL) {
5033 /* No __getattr__ hook: use a simpler dispatcher */
5034 tp->tp_getattro = slot_tp_getattro;
5035 return slot_tp_getattro(self, name);
5036 }
5037 Py_INCREF(getattr);
5038 /* speed hack: we could use lookup_maybe, but that would resolve the
5039 method fully for each attribute lookup for classes with
5040 __getattr__, even when self has the default __getattribute__
5041 method. So we use _PyType_Lookup and create the method only when
5042 needed, with call_attribute. */
5043 getattribute = _PyType_Lookup(tp, getattribute_str);
5044 if (getattribute == NULL ||
5045 (Py_TYPE(getattribute) == &PyWrapperDescr_Type &&
5046 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
5047 (void *)PyObject_GenericGetAttr))
5048 res = PyObject_GenericGetAttr(self, name);
5049 else {
5050 Py_INCREF(getattribute);
5051 res = call_attribute(self, getattribute, name);
5052 Py_DECREF(getattribute);
5053 }
5054 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
5055 PyErr_Clear();
5056 res = call_attribute(self, getattr, name);
5057 }
5058 Py_DECREF(getattr);
5059 return res;
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005060}
5061
Tim Peters6d6c1a32001-08-02 04:15:00 +00005062static int
5063slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
5064{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 PyObject *res;
5066 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005067
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005068 if (value == NULL)
5069 res = call_method(self, "__delattr__", &delattr_str,
5070 "(O)", name);
5071 else
5072 res = call_method(self, "__setattr__", &setattr_str,
5073 "(OO)", name, value);
5074 if (res == NULL)
5075 return -1;
5076 Py_DECREF(res);
5077 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005078}
5079
Guido van Rossumf5243f02008-01-01 04:06:48 +00005080static char *name_op[] = {
5081 "__lt__",
5082 "__le__",
5083 "__eq__",
5084 "__ne__",
5085 "__gt__",
5086 "__ge__",
5087};
5088
Tim Peters6d6c1a32001-08-02 04:15:00 +00005089static PyObject *
Mark Dickinson6f1d0492009-11-15 13:58:49 +00005090slot_tp_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005091{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 PyObject *func, *args, *res;
5093 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00005094
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005095 func = lookup_method(self, name_op[op], &op_str[op]);
5096 if (func == NULL) {
5097 PyErr_Clear();
5098 Py_INCREF(Py_NotImplemented);
5099 return Py_NotImplemented;
5100 }
5101 args = PyTuple_Pack(1, other);
5102 if (args == NULL)
5103 res = NULL;
5104 else {
5105 res = PyObject_Call(func, args, NULL);
5106 Py_DECREF(args);
5107 }
5108 Py_DECREF(func);
5109 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005110}
5111
Guido van Rossumb8f63662001-08-15 23:57:02 +00005112static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00005113slot_tp_iter(PyObject *self)
5114{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 PyObject *func, *res;
5116 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00005117
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005118 func = lookup_method(self, "__iter__", &iter_str);
5119 if (func != NULL) {
5120 PyObject *args;
5121 args = res = PyTuple_New(0);
5122 if (args != NULL) {
5123 res = PyObject_Call(func, args, NULL);
5124 Py_DECREF(args);
5125 }
5126 Py_DECREF(func);
5127 return res;
5128 }
5129 PyErr_Clear();
5130 func = lookup_method(self, "__getitem__", &getitem_str);
5131 if (func == NULL) {
5132 PyErr_Format(PyExc_TypeError,
5133 "'%.200s' object is not iterable",
5134 Py_TYPE(self)->tp_name);
5135 return NULL;
5136 }
5137 Py_DECREF(func);
5138 return PySeqIter_New(self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00005139}
Tim Peters6d6c1a32001-08-02 04:15:00 +00005140
5141static PyObject *
5142slot_tp_iternext(PyObject *self)
5143{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005144 static PyObject *next_str;
5145 return call_method(self, "__next__", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00005146}
5147
Guido van Rossum1a493502001-08-17 16:47:50 +00005148static PyObject *
5149slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
5150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005151 PyTypeObject *tp = Py_TYPE(self);
5152 PyObject *get;
5153 static PyObject *get_str = NULL;
Guido van Rossum1a493502001-08-17 16:47:50 +00005154
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005155 if (get_str == NULL) {
5156 get_str = PyUnicode_InternFromString("__get__");
5157 if (get_str == NULL)
5158 return NULL;
5159 }
5160 get = _PyType_Lookup(tp, get_str);
5161 if (get == NULL) {
5162 /* Avoid further slowdowns */
5163 if (tp->tp_descr_get == slot_tp_descr_get)
5164 tp->tp_descr_get = NULL;
5165 Py_INCREF(self);
5166 return self;
5167 }
5168 if (obj == NULL)
5169 obj = Py_None;
5170 if (type == NULL)
5171 type = Py_None;
5172 return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
Guido van Rossum1a493502001-08-17 16:47:50 +00005173}
Tim Peters6d6c1a32001-08-02 04:15:00 +00005174
5175static int
5176slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
5177{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 PyObject *res;
5179 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00005180
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005181 if (value == NULL)
5182 res = call_method(self, "__delete__", &del_str,
5183 "(O)", target);
5184 else
5185 res = call_method(self, "__set__", &set_str,
5186 "(OO)", target, value);
5187 if (res == NULL)
5188 return -1;
5189 Py_DECREF(res);
5190 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005191}
5192
5193static int
5194slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
5195{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005196 static PyObject *init_str;
5197 PyObject *meth = lookup_method(self, "__init__", &init_str);
5198 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005199
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005200 if (meth == NULL)
5201 return -1;
5202 res = PyObject_Call(meth, args, kwds);
5203 Py_DECREF(meth);
5204 if (res == NULL)
5205 return -1;
5206 if (res != Py_None) {
5207 PyErr_Format(PyExc_TypeError,
5208 "__init__() should return None, not '%.200s'",
5209 Py_TYPE(res)->tp_name);
5210 Py_DECREF(res);
5211 return -1;
5212 }
5213 Py_DECREF(res);
5214 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005215}
5216
5217static PyObject *
5218slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5219{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005220 static PyObject *new_str;
5221 PyObject *func;
5222 PyObject *newargs, *x;
5223 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005224
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005225 if (new_str == NULL) {
5226 new_str = PyUnicode_InternFromString("__new__");
5227 if (new_str == NULL)
5228 return NULL;
5229 }
5230 func = PyObject_GetAttr((PyObject *)type, new_str);
5231 if (func == NULL)
5232 return NULL;
5233 assert(PyTuple_Check(args));
5234 n = PyTuple_GET_SIZE(args);
5235 newargs = PyTuple_New(n+1);
5236 if (newargs == NULL)
5237 return NULL;
5238 Py_INCREF(type);
5239 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
5240 for (i = 0; i < n; i++) {
5241 x = PyTuple_GET_ITEM(args, i);
5242 Py_INCREF(x);
5243 PyTuple_SET_ITEM(newargs, i+1, x);
5244 }
5245 x = PyObject_Call(func, newargs, kwds);
5246 Py_DECREF(newargs);
5247 Py_DECREF(func);
5248 return x;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005249}
5250
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005251static void
5252slot_tp_del(PyObject *self)
5253{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005254 static PyObject *del_str = NULL;
5255 PyObject *del, *res;
5256 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005257
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005258 /* Temporarily resurrect the object. */
5259 assert(self->ob_refcnt == 0);
5260 self->ob_refcnt = 1;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 /* Save the current exception, if any. */
5263 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005264
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005265 /* Execute __del__ method, if any. */
5266 del = lookup_maybe(self, "__del__", &del_str);
5267 if (del != NULL) {
5268 res = PyEval_CallObject(del, NULL);
5269 if (res == NULL)
5270 PyErr_WriteUnraisable(del);
5271 else
5272 Py_DECREF(res);
5273 Py_DECREF(del);
5274 }
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 /* Restore the saved exception. */
5277 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005278
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005279 /* Undo the temporary resurrection; can't use DECREF here, it would
5280 * cause a recursive call.
5281 */
5282 assert(self->ob_refcnt > 0);
5283 if (--self->ob_refcnt == 0)
5284 return; /* this is the normal path out */
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005285
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005286 /* __del__ resurrected it! Make it look like the original Py_DECREF
5287 * never happened.
5288 */
5289 {
5290 Py_ssize_t refcnt = self->ob_refcnt;
5291 _Py_NewReference(self);
5292 self->ob_refcnt = refcnt;
5293 }
5294 assert(!PyType_IS_GC(Py_TYPE(self)) ||
5295 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
5296 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
5297 * we need to undo that. */
5298 _Py_DEC_REFTOTAL;
5299 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
5300 * chain, so no more to do there.
5301 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
5302 * _Py_NewReference bumped tp_allocs: both of those need to be
5303 * undone.
5304 */
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005305#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005306 --Py_TYPE(self)->tp_frees;
5307 --Py_TYPE(self)->tp_allocs;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005308#endif
5309}
5310
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005311
5312/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
Tim Petersbf9b2442003-03-23 05:35:36 +00005313 functions. The offsets here are relative to the 'PyHeapTypeObject'
Guido van Rossume5c691a2003-03-07 15:13:17 +00005314 structure, which incorporates the additional structures used for numbers,
5315 sequences and mappings.
5316 Note that multiple names may map to the same slot (e.g. __eq__,
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005317 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00005318 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
5319 terminated with an all-zero entry. (This table is further initialized and
5320 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005321
Guido van Rossum6d204072001-10-21 00:44:31 +00005322typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005323
5324#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00005325#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005326#undef ETSLOT
5327#undef SQSLOT
5328#undef MPSLOT
5329#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00005330#undef UNSLOT
5331#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005332#undef BINSLOT
5333#undef RBINSLOT
5334
Guido van Rossum6d204072001-10-21 00:44:31 +00005335#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5337 PyDoc_STR(DOC)}
Guido van Rossumc8e56452001-10-22 00:43:43 +00005338#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5340 PyDoc_STR(DOC), FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00005341#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5343 PyDoc_STR(DOC)}
Guido van Rossum6d204072001-10-21 00:44:31 +00005344#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005345 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005346#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005347 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005348#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005349 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005350#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5352 "x." NAME "() <==> " DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005353#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5355 "x." NAME "(y) <==> x" DOC "y")
Guido van Rossum6d204072001-10-21 00:44:31 +00005356#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5358 "x." NAME "(y) <==> x" DOC "y")
Guido van Rossum6d204072001-10-21 00:44:31 +00005359#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5361 "x." NAME "(y) <==> y" DOC "x")
Anthony Baxter56616992005-06-03 14:12:21 +00005362#define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5364 "x." NAME "(y) <==> " DOC)
Anthony Baxter56616992005-06-03 14:12:21 +00005365#define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005366 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5367 "x." NAME "(y) <==> " DOC)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005368
5369static slotdef slotdefs[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005370 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
5371 "x.__len__() <==> len(x)"),
5372 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
5373 The logic in abstract.c always falls back to nb_add/nb_multiply in
5374 this case. Defining both the nb_* and the sq_* slots to call the
5375 user-defined methods has unexpected side-effects, as shown by
5376 test_descr.notimplemented() */
5377 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
5378 "x.__add__(y) <==> x+y"),
5379 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
5380 "x.__mul__(n) <==> x*n"),
5381 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
5382 "x.__rmul__(n) <==> n*x"),
5383 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
5384 "x.__getitem__(y) <==> x[y]"),
5385 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
5386 "x.__setitem__(i, y) <==> x[i]=y"),
5387 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
5388 "x.__delitem__(y) <==> del x[y]"),
5389 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
5390 "x.__contains__(y) <==> y in x"),
5391 SQSLOT("__iadd__", sq_inplace_concat, NULL,
5392 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
5393 SQSLOT("__imul__", sq_inplace_repeat, NULL,
5394 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005396 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
5397 "x.__len__() <==> len(x)"),
5398 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
5399 wrap_binaryfunc,
5400 "x.__getitem__(y) <==> x[y]"),
5401 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
5402 wrap_objobjargproc,
5403 "x.__setitem__(i, y) <==> x[i]=y"),
5404 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
5405 wrap_delitem,
5406 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005407
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005408 BINSLOT("__add__", nb_add, slot_nb_add,
5409 "+"),
5410 RBINSLOT("__radd__", nb_add, slot_nb_add,
5411 "+"),
5412 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
5413 "-"),
5414 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
5415 "-"),
5416 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
5417 "*"),
5418 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
5419 "*"),
5420 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
5421 "%"),
5422 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
5423 "%"),
5424 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
5425 "divmod(x, y)"),
5426 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
5427 "divmod(y, x)"),
5428 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
5429 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
5430 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
5431 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
5432 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
5433 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
5434 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
5435 "abs(x)"),
5436 UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
5437 "x != 0"),
5438 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
5439 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
5440 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
5441 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
5442 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
5443 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
5444 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
5445 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
5446 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
5447 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
5448 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
5449 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
5450 "int(x)"),
5451 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
5452 "float(x)"),
5453 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
5454 "x[y:z] <==> x[y.__index__():z.__index__()]"),
5455 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
5456 wrap_binaryfunc, "+"),
5457 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
5458 wrap_binaryfunc, "-"),
5459 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
5460 wrap_binaryfunc, "*"),
5461 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
5462 wrap_binaryfunc, "%"),
5463 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
5464 wrap_binaryfunc, "**"),
5465 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
5466 wrap_binaryfunc, "<<"),
5467 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
5468 wrap_binaryfunc, ">>"),
5469 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
5470 wrap_binaryfunc, "&"),
5471 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
5472 wrap_binaryfunc, "^"),
5473 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
5474 wrap_binaryfunc, "|"),
5475 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5476 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5477 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
5478 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
5479 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
5480 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
5481 IBSLOT("__itruediv__", nb_inplace_true_divide,
5482 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005484 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
5485 "x.__str__() <==> str(x)"),
5486 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
5487 "x.__repr__() <==> repr(x)"),
5488 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
5489 "x.__hash__() <==> hash(x)"),
5490 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
5491 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
5492 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
5493 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
5494 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
5495 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
5496 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
5497 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
5498 "x.__setattr__('name', value) <==> x.name = value"),
5499 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
5500 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
5501 "x.__delattr__('name') <==> del x.name"),
5502 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
5503 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
5504 "x.__lt__(y) <==> x<y"),
5505 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
5506 "x.__le__(y) <==> x<=y"),
5507 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
5508 "x.__eq__(y) <==> x==y"),
5509 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
5510 "x.__ne__(y) <==> x!=y"),
5511 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
5512 "x.__gt__(y) <==> x>y"),
5513 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
5514 "x.__ge__(y) <==> x>=y"),
5515 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
5516 "x.__iter__() <==> iter(x)"),
5517 TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
5518 "x.__next__() <==> next(x)"),
5519 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
5520 "descr.__get__(obj[, type]) -> value"),
5521 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
5522 "descr.__set__(obj, value)"),
5523 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
5524 wrap_descr_delete, "descr.__delete__(obj)"),
5525 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
5526 "x.__init__(...) initializes x; "
5527 "see x.__class__.__doc__ for signature",
5528 PyWrapperFlag_KEYWORDS),
5529 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
5530 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
5531 {NULL}
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005532};
5533
Guido van Rossumc334df52002-04-04 23:44:47 +00005534/* Given a type pointer and an offset gotten from a slotdef entry, return a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005535 pointer to the actual slot. This is not quite the same as simply adding
Guido van Rossumc334df52002-04-04 23:44:47 +00005536 the offset to the type pointer, since it takes care to indirect through the
5537 proper indirection pointer (as_buffer, etc.); it returns NULL if the
5538 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005539static void **
Martin v. Löwis18e16552006-02-15 17:27:45 +00005540slotptr(PyTypeObject *type, int ioffset)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005541{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 char *ptr;
5543 long offset = ioffset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005544
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005545 /* Note: this depends on the order of the members of PyHeapTypeObject! */
5546 assert(offset >= 0);
5547 assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
5548 if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
5549 ptr = (char *)type->tp_as_sequence;
5550 offset -= offsetof(PyHeapTypeObject, as_sequence);
5551 }
5552 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
5553 ptr = (char *)type->tp_as_mapping;
5554 offset -= offsetof(PyHeapTypeObject, as_mapping);
5555 }
5556 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
5557 ptr = (char *)type->tp_as_number;
5558 offset -= offsetof(PyHeapTypeObject, as_number);
5559 }
5560 else {
5561 ptr = (char *)type;
5562 }
5563 if (ptr != NULL)
5564 ptr += offset;
5565 return (void **)ptr;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005566}
Guido van Rossumf040ede2001-08-07 16:40:56 +00005567
Guido van Rossumc334df52002-04-04 23:44:47 +00005568/* Length of array of slotdef pointers used to store slots with the
5569 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
5570 the same __name__, for any __name__. Since that's a static property, it is
5571 appropriate to declare fixed-size arrays for this. */
5572#define MAX_EQUIV 10
5573
5574/* Return a slot pointer for a given name, but ONLY if the attribute has
5575 exactly one slot function. The name must be an interned string. */
5576static void **
5577resolve_slotdups(PyTypeObject *type, PyObject *name)
5578{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005579 /* XXX Maybe this could be optimized more -- but is it worth it? */
Guido van Rossumc334df52002-04-04 23:44:47 +00005580
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005581 /* pname and ptrs act as a little cache */
5582 static PyObject *pname;
5583 static slotdef *ptrs[MAX_EQUIV];
5584 slotdef *p, **pp;
5585 void **res, **ptr;
Guido van Rossumc334df52002-04-04 23:44:47 +00005586
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005587 if (pname != name) {
5588 /* Collect all slotdefs that match name into ptrs. */
5589 pname = name;
5590 pp = ptrs;
5591 for (p = slotdefs; p->name_strobj; p++) {
5592 if (p->name_strobj == name)
5593 *pp++ = p;
5594 }
5595 *pp = NULL;
5596 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005597
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005598 /* Look in all matching slots of the type; if exactly one of these has
5599 a filled-in slot, return its value. Otherwise return NULL. */
5600 res = NULL;
5601 for (pp = ptrs; *pp; pp++) {
5602 ptr = slotptr(type, (*pp)->offset);
5603 if (ptr == NULL || *ptr == NULL)
5604 continue;
5605 if (res != NULL)
5606 return NULL;
5607 res = ptr;
5608 }
5609 return res;
Guido van Rossumc334df52002-04-04 23:44:47 +00005610}
5611
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005612/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This
Guido van Rossumc334df52002-04-04 23:44:47 +00005613 does some incredibly complex thinking and then sticks something into the
5614 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
5615 interests, and then stores a generic wrapper or a specific function into
5616 the slot.) Return a pointer to the next slotdef with a different offset,
5617 because that's convenient for fixup_slot_dispatchers(). */
5618static slotdef *
5619update_one_slot(PyTypeObject *type, slotdef *p)
5620{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005621 PyObject *descr;
5622 PyWrapperDescrObject *d;
5623 void *generic = NULL, *specific = NULL;
5624 int use_generic = 0;
5625 int offset = p->offset;
5626 void **ptr = slotptr(type, offset);
Guido van Rossumc334df52002-04-04 23:44:47 +00005627
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005628 if (ptr == NULL) {
5629 do {
5630 ++p;
5631 } while (p->offset == offset);
5632 return p;
5633 }
5634 do {
5635 descr = _PyType_Lookup(type, p->name_strobj);
5636 if (descr == NULL) {
5637 if (ptr == (void**)&type->tp_iternext) {
5638 specific = _PyObject_NextNotImplemented;
5639 }
5640 continue;
5641 }
5642 if (Py_TYPE(descr) == &PyWrapperDescr_Type) {
5643 void **tptr = resolve_slotdups(type, p->name_strobj);
5644 if (tptr == NULL || tptr == ptr)
5645 generic = p->function;
5646 d = (PyWrapperDescrObject *)descr;
5647 if (d->d_base->wrapper == p->wrapper &&
5648 PyType_IsSubtype(type, PyDescr_TYPE(d)))
5649 {
5650 if (specific == NULL ||
5651 specific == d->d_wrapped)
5652 specific = d->d_wrapped;
5653 else
5654 use_generic = 1;
5655 }
5656 }
5657 else if (Py_TYPE(descr) == &PyCFunction_Type &&
5658 PyCFunction_GET_FUNCTION(descr) ==
5659 (PyCFunction)tp_new_wrapper &&
5660 ptr == (void**)&type->tp_new)
5661 {
5662 /* The __new__ wrapper is not a wrapper descriptor,
5663 so must be special-cased differently.
5664 If we don't do this, creating an instance will
5665 always use slot_tp_new which will look up
5666 __new__ in the MRO which will call tp_new_wrapper
5667 which will look through the base classes looking
5668 for a static base and call its tp_new (usually
5669 PyType_GenericNew), after performing various
5670 sanity checks and constructing a new argument
5671 list. Cut all that nonsense short -- this speeds
5672 up instance creation tremendously. */
5673 specific = (void *)type->tp_new;
5674 /* XXX I'm not 100% sure that there isn't a hole
5675 in this reasoning that requires additional
5676 sanity checks. I'll buy the first person to
5677 point out a bug in this reasoning a beer. */
5678 }
5679 else if (descr == Py_None &&
5680 ptr == (void**)&type->tp_hash) {
5681 /* We specifically allow __hash__ to be set to None
5682 to prevent inheritance of the default
5683 implementation from object.__hash__ */
5684 specific = PyObject_HashNotImplemented;
5685 }
5686 else {
5687 use_generic = 1;
5688 generic = p->function;
5689 }
5690 } while ((++p)->offset == offset);
5691 if (specific && !use_generic)
5692 *ptr = specific;
5693 else
5694 *ptr = generic;
5695 return p;
Guido van Rossumc334df52002-04-04 23:44:47 +00005696}
5697
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005698/* In the type, update the slots whose slotdefs are gathered in the pp array.
5699 This is a callback for update_subclasses(). */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005700static int
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005701update_slots_callback(PyTypeObject *type, void *data)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005702{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005703 slotdef **pp = (slotdef **)data;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005704
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005705 for (; *pp; pp++)
5706 update_one_slot(type, *pp);
5707 return 0;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005708}
5709
Guido van Rossumc334df52002-04-04 23:44:47 +00005710/* Comparison function for qsort() to compare slotdefs by their offset, and
5711 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005712static int
5713slotdef_cmp(const void *aa, const void *bb)
5714{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005715 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
5716 int c = a->offset - b->offset;
5717 if (c != 0)
5718 return c;
5719 else
5720 /* Cannot use a-b, as this gives off_t,
5721 which may lose precision when converted to int. */
5722 return (a > b) ? 1 : (a < b) ? -1 : 0;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005723}
5724
Guido van Rossumc334df52002-04-04 23:44:47 +00005725/* Initialize the slotdefs table by adding interned string objects for the
5726 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005727static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005728init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005729{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 slotdef *p;
5731 static int initialized = 0;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005732
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005733 if (initialized)
5734 return;
5735 for (p = slotdefs; p->name; p++) {
5736 p->name_strobj = PyUnicode_InternFromString(p->name);
5737 if (!p->name_strobj)
5738 Py_FatalError("Out of memory interning slotdef names");
5739 }
5740 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
5741 slotdef_cmp);
5742 initialized = 1;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005743}
5744
Guido van Rossumc334df52002-04-04 23:44:47 +00005745/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005746static int
5747update_slot(PyTypeObject *type, PyObject *name)
5748{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005749 slotdef *ptrs[MAX_EQUIV];
5750 slotdef *p;
5751 slotdef **pp;
5752 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005753
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005754 /* Clear the VALID_VERSION flag of 'type' and all its
5755 subclasses. This could possibly be unified with the
5756 update_subclasses() recursion below, but carefully:
5757 they each have their own conditions on which to stop
5758 recursing into subclasses. */
5759 PyType_Modified(type);
Christian Heimesa62da1d2008-01-12 19:39:10 +00005760
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005761 init_slotdefs();
5762 pp = ptrs;
5763 for (p = slotdefs; p->name; p++) {
5764 /* XXX assume name is interned! */
5765 if (p->name_strobj == name)
5766 *pp++ = p;
5767 }
5768 *pp = NULL;
5769 for (pp = ptrs; *pp; pp++) {
5770 p = *pp;
5771 offset = p->offset;
5772 while (p > slotdefs && (p-1)->offset == offset)
5773 --p;
5774 *pp = p;
5775 }
5776 if (ptrs[0] == NULL)
5777 return 0; /* Not an attribute that affects any slots */
5778 return update_subclasses(type, name,
5779 update_slots_callback, (void *)ptrs);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005780}
5781
Guido van Rossumc334df52002-04-04 23:44:47 +00005782/* Store the proper functions in the slot dispatches at class (type)
5783 definition time, based upon which operations the class overrides in its
5784 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00005785static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005786fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005787{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005788 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005789
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005790 init_slotdefs();
5791 for (p = slotdefs; p->name; )
5792 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00005793}
Guido van Rossum705f0f52001-08-24 16:47:00 +00005794
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005795static void
5796update_all_slots(PyTypeObject* type)
5797{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005798 slotdef *p;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005799
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005800 init_slotdefs();
5801 for (p = slotdefs; p->name; p++) {
5802 /* update_slot returns int but can't actually fail */
5803 update_slot(type, p->name_strobj);
5804 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005805}
5806
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005807/* recurse_down_subclasses() and update_subclasses() are mutually
5808 recursive functions to call a callback for all subclasses,
5809 but refraining from recursing into subclasses that define 'name'. */
5810
5811static int
5812update_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005813 update_callback callback, void *data)
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005814{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005815 if (callback(type, data) < 0)
5816 return -1;
5817 return recurse_down_subclasses(type, name, callback, data);
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005818}
5819
5820static int
5821recurse_down_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005822 update_callback callback, void *data)
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005823{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005824 PyTypeObject *subclass;
5825 PyObject *ref, *subclasses, *dict;
5826 Py_ssize_t i, n;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005827
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005828 subclasses = type->tp_subclasses;
5829 if (subclasses == NULL)
5830 return 0;
5831 assert(PyList_Check(subclasses));
5832 n = PyList_GET_SIZE(subclasses);
5833 for (i = 0; i < n; i++) {
5834 ref = PyList_GET_ITEM(subclasses, i);
5835 assert(PyWeakref_CheckRef(ref));
5836 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
5837 assert(subclass != NULL);
5838 if ((PyObject *)subclass == Py_None)
5839 continue;
5840 assert(PyType_Check(subclass));
5841 /* Avoid recursing down into unaffected classes */
5842 dict = subclass->tp_dict;
5843 if (dict != NULL && PyDict_Check(dict) &&
5844 PyDict_GetItem(dict, name) != NULL)
5845 continue;
5846 if (update_subclasses(subclass, name, callback, data) < 0)
5847 return -1;
5848 }
5849 return 0;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005850}
5851
Guido van Rossum6d204072001-10-21 00:44:31 +00005852/* This function is called by PyType_Ready() to populate the type's
5853 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00005854 function slot (like tp_repr) that's defined in the type, one or more
5855 corresponding descriptors are added in the type's tp_dict dictionary
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005856 under the appropriate name (like __repr__). Some function slots
Guido van Rossum09638c12002-06-13 19:17:46 +00005857 cause more than one descriptor to be added (for example, the nb_add
5858 slot adds both __add__ and __radd__ descriptors) and some function
5859 slots compete for the same descriptor (for example both sq_item and
5860 mp_subscript generate a __getitem__ descriptor).
5861
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005862 In the latter case, the first slotdef entry encoutered wins. Since
Tim Petersbf9b2442003-03-23 05:35:36 +00005863 slotdef entries are sorted by the offset of the slot in the
Guido van Rossume5c691a2003-03-07 15:13:17 +00005864 PyHeapTypeObject, this gives us some control over disambiguating
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005865 between competing slots: the members of PyHeapTypeObject are listed
5866 from most general to least general, so the most general slot is
5867 preferred. In particular, because as_mapping comes before as_sequence,
5868 for a type that defines both mp_subscript and sq_item, mp_subscript
5869 wins.
Guido van Rossum09638c12002-06-13 19:17:46 +00005870
5871 This only adds new descriptors and doesn't overwrite entries in
5872 tp_dict that were previously defined. The descriptors contain a
5873 reference to the C function they must call, so that it's safe if they
5874 are copied into a subtype's __dict__ and the subtype has a different
5875 C function in its slot -- calling the method defined by the
5876 descriptor will call the C function that was used to create it,
5877 rather than the C function present in the slot when it is called.
5878 (This is important because a subtype may have a C function in the
5879 slot that calls the method from the dictionary, and we want to avoid
5880 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00005881
5882static int
5883add_operators(PyTypeObject *type)
5884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005885 PyObject *dict = type->tp_dict;
5886 slotdef *p;
5887 PyObject *descr;
5888 void **ptr;
Guido van Rossum6d204072001-10-21 00:44:31 +00005889
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005890 init_slotdefs();
5891 for (p = slotdefs; p->name; p++) {
5892 if (p->wrapper == NULL)
5893 continue;
5894 ptr = slotptr(type, p->offset);
5895 if (!ptr || !*ptr)
5896 continue;
5897 if (PyDict_GetItem(dict, p->name_strobj))
5898 continue;
5899 if (*ptr == PyObject_HashNotImplemented) {
5900 /* Classes may prevent the inheritance of the tp_hash
5901 slot by storing PyObject_HashNotImplemented in it. Make it
5902 visible as a None value for the __hash__ attribute. */
5903 if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0)
5904 return -1;
5905 }
5906 else {
5907 descr = PyDescr_NewWrapper(type, p, *ptr);
5908 if (descr == NULL)
5909 return -1;
5910 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
5911 return -1;
5912 Py_DECREF(descr);
5913 }
5914 }
5915 if (type->tp_new != NULL) {
5916 if (add_tp_new_wrapper(type) < 0)
5917 return -1;
5918 }
5919 return 0;
Guido van Rossum6d204072001-10-21 00:44:31 +00005920}
5921
Guido van Rossum705f0f52001-08-24 16:47:00 +00005922
5923/* Cooperative 'super' */
5924
5925typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005926 PyObject_HEAD
5927 PyTypeObject *type;
5928 PyObject *obj;
5929 PyTypeObject *obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005930} superobject;
5931
Guido van Rossum6f799372001-09-20 20:46:19 +00005932static PyMemberDef super_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005933 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
5934 "the class invoking super()"},
5935 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
5936 "the instance invoking super(); may be None"},
5937 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
5938 "the type of the instance invoking super(); may be None"},
5939 {0}
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005940};
5941
Guido van Rossum705f0f52001-08-24 16:47:00 +00005942static void
5943super_dealloc(PyObject *self)
5944{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005945 superobject *su = (superobject *)self;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005947 _PyObject_GC_UNTRACK(self);
5948 Py_XDECREF(su->obj);
5949 Py_XDECREF(su->type);
5950 Py_XDECREF(su->obj_type);
5951 Py_TYPE(self)->tp_free(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005952}
5953
5954static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005955super_repr(PyObject *self)
5956{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005957 superobject *su = (superobject *)self;
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005958
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005959 if (su->obj_type)
5960 return PyUnicode_FromFormat(
5961 "<super: <class '%s'>, <%s object>>",
5962 su->type ? su->type->tp_name : "NULL",
5963 su->obj_type->tp_name);
5964 else
5965 return PyUnicode_FromFormat(
5966 "<super: <class '%s'>, NULL>",
5967 su->type ? su->type->tp_name : "NULL");
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005968}
5969
5970static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00005971super_getattro(PyObject *self, PyObject *name)
5972{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 superobject *su = (superobject *)self;
5974 int skip = su->obj_type == NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005975
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005976 if (!skip) {
5977 /* We want __class__ to return the class of the super object
5978 (i.e. super, or a subclass), not the class of su->obj. */
5979 skip = (PyUnicode_Check(name) &&
5980 PyUnicode_GET_SIZE(name) == 9 &&
5981 PyUnicode_CompareWithASCIIString(name, "__class__") == 0);
5982 }
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005983
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005984 if (!skip) {
5985 PyObject *mro, *res, *tmp, *dict;
5986 PyTypeObject *starttype;
5987 descrgetfunc f;
5988 Py_ssize_t i, n;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 starttype = su->obj_type;
5991 mro = starttype->tp_mro;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005992
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005993 if (mro == NULL)
5994 n = 0;
5995 else {
5996 assert(PyTuple_Check(mro));
5997 n = PyTuple_GET_SIZE(mro);
5998 }
5999 for (i = 0; i < n; i++) {
6000 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
6001 break;
6002 }
6003 i++;
6004 res = NULL;
6005 for (; i < n; i++) {
6006 tmp = PyTuple_GET_ITEM(mro, i);
6007 if (PyType_Check(tmp))
6008 dict = ((PyTypeObject *)tmp)->tp_dict;
6009 else
6010 continue;
6011 res = PyDict_GetItem(dict, name);
6012 if (res != NULL) {
6013 Py_INCREF(res);
6014 f = Py_TYPE(res)->tp_descr_get;
6015 if (f != NULL) {
6016 tmp = f(res,
6017 /* Only pass 'obj' param if
6018 this is instance-mode super
6019 (See SF ID #743627)
6020 */
6021 (su->obj == (PyObject *)
6022 su->obj_type
6023 ? (PyObject *)NULL
6024 : su->obj),
6025 (PyObject *)starttype);
6026 Py_DECREF(res);
6027 res = tmp;
6028 }
6029 return res;
6030 }
6031 }
6032 }
6033 return PyObject_GenericGetAttr(self, name);
Guido van Rossum705f0f52001-08-24 16:47:00 +00006034}
6035
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006036static PyTypeObject *
Guido van Rossum5b443c62001-12-03 15:38:28 +00006037supercheck(PyTypeObject *type, PyObject *obj)
6038{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006039 /* Check that a super() call makes sense. Return a type object.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006040
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006041 obj can be a new-style class, or an instance of one:
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 - If it is a class, it must be a subclass of 'type'. This case is
6044 used for class methods; the return value is obj.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 - If it is an instance, it must be an instance of 'type'. This is
6047 the normal case; the return value is obj.__class__.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006048
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006049 But... when obj is an instance, we want to allow for the case where
6050 Py_TYPE(obj) is not a subclass of type, but obj.__class__ is!
6051 This will allow using super() with a proxy for obj.
6052 */
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006054 /* Check for first bullet above (special case) */
6055 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
6056 Py_INCREF(obj);
6057 return (PyTypeObject *)obj;
6058 }
Guido van Rossum8e80a722003-02-18 19:22:22 +00006059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006060 /* Normal case */
6061 if (PyType_IsSubtype(Py_TYPE(obj), type)) {
6062 Py_INCREF(Py_TYPE(obj));
6063 return Py_TYPE(obj);
6064 }
6065 else {
6066 /* Try the slow way */
6067 static PyObject *class_str = NULL;
6068 PyObject *class_attr;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006070 if (class_str == NULL) {
6071 class_str = PyUnicode_FromString("__class__");
6072 if (class_str == NULL)
6073 return NULL;
6074 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006075
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006076 class_attr = PyObject_GetAttr(obj, class_str);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006077
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006078 if (class_attr != NULL &&
6079 PyType_Check(class_attr) &&
6080 (PyTypeObject *)class_attr != Py_TYPE(obj))
6081 {
6082 int ok = PyType_IsSubtype(
6083 (PyTypeObject *)class_attr, type);
6084 if (ok)
6085 return (PyTypeObject *)class_attr;
6086 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006087
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006088 if (class_attr == NULL)
6089 PyErr_Clear();
6090 else
6091 Py_DECREF(class_attr);
6092 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006093
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006094 PyErr_SetString(PyExc_TypeError,
6095 "super(type, obj): "
6096 "obj must be an instance or subtype of type");
6097 return NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00006098}
6099
Guido van Rossum705f0f52001-08-24 16:47:00 +00006100static PyObject *
6101super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
6102{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 superobject *su = (superobject *)self;
6104 superobject *newobj;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006105
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006106 if (obj == NULL || obj == Py_None || su->obj != NULL) {
6107 /* Not binding to an object, or already bound */
6108 Py_INCREF(self);
6109 return self;
6110 }
6111 if (Py_TYPE(su) != &PySuper_Type)
6112 /* If su is an instance of a (strict) subclass of super,
6113 call its type */
6114 return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su),
6115 su->type, obj, NULL);
6116 else {
6117 /* Inline the common case */
6118 PyTypeObject *obj_type = supercheck(su->type, obj);
6119 if (obj_type == NULL)
6120 return NULL;
6121 newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
6122 NULL, NULL);
6123 if (newobj == NULL)
6124 return NULL;
6125 Py_INCREF(su->type);
6126 Py_INCREF(obj);
6127 newobj->type = su->type;
6128 newobj->obj = obj;
6129 newobj->obj_type = obj_type;
6130 return (PyObject *)newobj;
6131 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00006132}
6133
6134static int
6135super_init(PyObject *self, PyObject *args, PyObject *kwds)
6136{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006137 superobject *su = (superobject *)self;
6138 PyTypeObject *type = NULL;
6139 PyObject *obj = NULL;
6140 PyTypeObject *obj_type = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006141
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006142 if (!_PyArg_NoKeywords("super", kwds))
6143 return -1;
6144 if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj))
6145 return -1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006146
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006147 if (type == NULL) {
6148 /* Call super(), without args -- fill in from __class__
6149 and first local variable on the stack. */
6150 PyFrameObject *f = PyThreadState_GET()->frame;
6151 PyCodeObject *co = f->f_code;
6152 int i, n;
6153 if (co == NULL) {
6154 PyErr_SetString(PyExc_SystemError,
6155 "super(): no code object");
6156 return -1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006157 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006158 if (co->co_argcount == 0) {
6159 PyErr_SetString(PyExc_SystemError,
6160 "super(): no arguments");
6161 return -1;
6162 }
6163 obj = f->f_localsplus[0];
6164 if (obj == NULL) {
6165 PyErr_SetString(PyExc_SystemError,
6166 "super(): arg[0] deleted");
6167 return -1;
6168 }
6169 if (co->co_freevars == NULL)
6170 n = 0;
6171 else {
6172 assert(PyTuple_Check(co->co_freevars));
6173 n = PyTuple_GET_SIZE(co->co_freevars);
6174 }
6175 for (i = 0; i < n; i++) {
6176 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
6177 assert(PyUnicode_Check(name));
6178 if (!PyUnicode_CompareWithASCIIString(name,
6179 "__class__")) {
6180 Py_ssize_t index = co->co_nlocals +
6181 PyTuple_GET_SIZE(co->co_cellvars) + i;
6182 PyObject *cell = f->f_localsplus[index];
6183 if (cell == NULL || !PyCell_Check(cell)) {
6184 PyErr_SetString(PyExc_SystemError,
6185 "super(): bad __class__ cell");
6186 return -1;
6187 }
6188 type = (PyTypeObject *) PyCell_GET(cell);
6189 if (type == NULL) {
6190 PyErr_SetString(PyExc_SystemError,
6191 "super(): empty __class__ cell");
6192 return -1;
6193 }
6194 if (!PyType_Check(type)) {
6195 PyErr_Format(PyExc_SystemError,
6196 "super(): __class__ is not a type (%s)",
6197 Py_TYPE(type)->tp_name);
6198 return -1;
6199 }
6200 break;
6201 }
6202 }
6203 if (type == NULL) {
6204 PyErr_SetString(PyExc_SystemError,
6205 "super(): __class__ cell not found");
6206 return -1;
6207 }
6208 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006210 if (obj == Py_None)
6211 obj = NULL;
6212 if (obj != NULL) {
6213 obj_type = supercheck(type, obj);
6214 if (obj_type == NULL)
6215 return -1;
6216 Py_INCREF(obj);
6217 }
6218 Py_INCREF(type);
6219 su->type = type;
6220 su->obj = obj;
6221 su->obj_type = obj_type;
6222 return 0;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006223}
6224
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006225PyDoc_STRVAR(super_doc,
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006226"super() -> same as super(__class__, <first argument>)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00006227"super(type) -> unbound super object\n"
6228"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00006229"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00006230"Typical use to call a cooperative superclass method:\n"
6231"class C(B):\n"
6232" def meth(self, arg):\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006233" super().meth(arg)\n"
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006234"This works for class methods too:\n"
6235"class C(B):\n"
6236" @classmethod\n"
6237" def cmeth(cls, arg):\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006238" super().cmeth(arg)\n");
Guido van Rossum705f0f52001-08-24 16:47:00 +00006239
Guido van Rossum048eb752001-10-02 21:24:57 +00006240static int
6241super_traverse(PyObject *self, visitproc visit, void *arg)
6242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006243 superobject *su = (superobject *)self;
Guido van Rossum048eb752001-10-02 21:24:57 +00006244
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006245 Py_VISIT(su->obj);
6246 Py_VISIT(su->type);
6247 Py_VISIT(su->obj_type);
Guido van Rossum048eb752001-10-02 21:24:57 +00006248
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006249 return 0;
Guido van Rossum048eb752001-10-02 21:24:57 +00006250}
6251
Guido van Rossum705f0f52001-08-24 16:47:00 +00006252PyTypeObject PySuper_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006253 PyVarObject_HEAD_INIT(&PyType_Type, 0)
6254 "super", /* tp_name */
6255 sizeof(superobject), /* tp_basicsize */
6256 0, /* tp_itemsize */
6257 /* methods */
6258 super_dealloc, /* tp_dealloc */
6259 0, /* tp_print */
6260 0, /* tp_getattr */
6261 0, /* tp_setattr */
6262 0, /* tp_reserved */
6263 super_repr, /* tp_repr */
6264 0, /* tp_as_number */
6265 0, /* tp_as_sequence */
6266 0, /* tp_as_mapping */
6267 0, /* tp_hash */
6268 0, /* tp_call */
6269 0, /* tp_str */
6270 super_getattro, /* tp_getattro */
6271 0, /* tp_setattro */
6272 0, /* tp_as_buffer */
6273 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
6274 Py_TPFLAGS_BASETYPE, /* tp_flags */
6275 super_doc, /* tp_doc */
6276 super_traverse, /* tp_traverse */
6277 0, /* tp_clear */
6278 0, /* tp_richcompare */
6279 0, /* tp_weaklistoffset */
6280 0, /* tp_iter */
6281 0, /* tp_iternext */
6282 0, /* tp_methods */
6283 super_members, /* tp_members */
6284 0, /* tp_getset */
6285 0, /* tp_base */
6286 0, /* tp_dict */
6287 super_descr_get, /* tp_descr_get */
6288 0, /* tp_descr_set */
6289 0, /* tp_dictoffset */
6290 super_init, /* tp_init */
6291 PyType_GenericAlloc, /* tp_alloc */
6292 PyType_GenericNew, /* tp_new */
6293 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00006294};