blob: 1babcb605c3bd7b35440c7b2399b143b09127d4c [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,
Alexander Belopolsky977a6842010-08-16 20:17:07 +00002518 PyDoc_STR("__subclasscheck__() -> check if a class is a subclass")},
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00002519 {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;
Victor Stinner4a2b7a12010-08-13 14:03:48 +00003895 error = PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
3896 "Type %.100s defines tp_reserved (formerly tp_compare) "
3897 "but not tp_richcompare. Comparisons may not behave as intended.",
3898 type->tp_name);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003899 if (error == -1)
3900 goto error;
3901 }
Mark Dickinson2a7d45b2009-02-08 11:02:10 +00003902
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003903 /* All done -- set the ready flag */
3904 assert(type->tp_dict != NULL);
3905 type->tp_flags =
3906 (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
3907 return 0;
Guido van Rossumd614f972001-08-10 17:39:49 +00003908
3909 error:
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003910 type->tp_flags &= ~Py_TPFLAGS_READYING;
3911 return -1;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003912}
3913
Guido van Rossum1c450732001-10-08 15:18:27 +00003914static int
3915add_subclass(PyTypeObject *base, PyTypeObject *type)
3916{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003917 Py_ssize_t i;
3918 int result;
3919 PyObject *list, *ref, *newobj;
Guido van Rossum1c450732001-10-08 15:18:27 +00003920
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003921 list = base->tp_subclasses;
3922 if (list == NULL) {
3923 base->tp_subclasses = list = PyList_New(0);
3924 if (list == NULL)
3925 return -1;
3926 }
3927 assert(PyList_Check(list));
3928 newobj = PyWeakref_NewRef((PyObject *)type, NULL);
3929 i = PyList_GET_SIZE(list);
3930 while (--i >= 0) {
3931 ref = PyList_GET_ITEM(list, i);
3932 assert(PyWeakref_CheckRef(ref));
3933 if (PyWeakref_GET_OBJECT(ref) == Py_None)
3934 return PyList_SetItem(list, i, newobj);
3935 }
3936 result = PyList_Append(list, newobj);
3937 Py_DECREF(newobj);
3938 return result;
Guido van Rossum1c450732001-10-08 15:18:27 +00003939}
3940
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003941static void
3942remove_subclass(PyTypeObject *base, PyTypeObject *type)
3943{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003944 Py_ssize_t i;
3945 PyObject *list, *ref;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003946
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003947 list = base->tp_subclasses;
3948 if (list == NULL) {
3949 return;
3950 }
3951 assert(PyList_Check(list));
3952 i = PyList_GET_SIZE(list);
3953 while (--i >= 0) {
3954 ref = PyList_GET_ITEM(list, i);
3955 assert(PyWeakref_CheckRef(ref));
3956 if (PyWeakref_GET_OBJECT(ref) == (PyObject*)type) {
3957 /* this can't fail, right? */
3958 PySequence_DelItem(list, i);
3959 return;
3960 }
3961 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +00003962}
Tim Peters6d6c1a32001-08-02 04:15:00 +00003963
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003964static int
3965check_num_args(PyObject *ob, int n)
3966{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003967 if (!PyTuple_CheckExact(ob)) {
3968 PyErr_SetString(PyExc_SystemError,
3969 "PyArg_UnpackTuple() argument list is not a tuple");
3970 return 0;
3971 }
3972 if (n == PyTuple_GET_SIZE(ob))
3973 return 1;
3974 PyErr_Format(
3975 PyExc_TypeError,
3976 "expected %d arguments, got %zd", n, PyTuple_GET_SIZE(ob));
3977 return 0;
Raymond Hettinger6a8bbdb2003-12-13 15:21:55 +00003978}
3979
Tim Peters6d6c1a32001-08-02 04:15:00 +00003980/* Generic wrappers for overloadable 'operators' such as __getitem__ */
3981
3982/* There's a wrapper *function* for each distinct function typedef used
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003983 for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
Tim Peters6d6c1a32001-08-02 04:15:00 +00003984 wrapper *table* for each distinct operation (e.g. __len__, __add__).
3985 Most tables have only one entry; the tables for binary operators have two
3986 entries, one regular and one with reversed arguments. */
3987
3988static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00003989wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00003990{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003991 lenfunc func = (lenfunc)wrapped;
3992 Py_ssize_t res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00003993
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00003994 if (!check_num_args(args, 0))
3995 return NULL;
3996 res = (*func)(self);
3997 if (res == -1 && PyErr_Occurred())
3998 return NULL;
3999 return PyLong_FromLong((long)res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004000}
4001
Tim Peters6d6c1a32001-08-02 04:15:00 +00004002static PyObject *
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004003wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
4004{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004005 inquiry func = (inquiry)wrapped;
4006 int res;
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004007
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004008 if (!check_num_args(args, 0))
4009 return NULL;
4010 res = (*func)(self);
4011 if (res == -1 && PyErr_Occurred())
4012 return NULL;
4013 return PyBool_FromLong((long)res);
Raymond Hettingerf34f2642003-10-11 17:29:04 +00004014}
4015
4016static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004017wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
4018{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004019 binaryfunc func = (binaryfunc)wrapped;
4020 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004021
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004022 if (!check_num_args(args, 1))
4023 return NULL;
4024 other = PyTuple_GET_ITEM(args, 0);
4025 return (*func)(self, other);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004026}
4027
4028static PyObject *
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004029wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
4030{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004031 binaryfunc func = (binaryfunc)wrapped;
4032 PyObject *other;
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004033
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004034 if (!check_num_args(args, 1))
4035 return NULL;
4036 other = PyTuple_GET_ITEM(args, 0);
4037 return (*func)(self, other);
Guido van Rossum0eb2a6e2001-10-09 11:07:24 +00004038}
4039
4040static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004041wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
4042{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004043 binaryfunc func = (binaryfunc)wrapped;
4044 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004046 if (!check_num_args(args, 1))
4047 return NULL;
4048 other = PyTuple_GET_ITEM(args, 0);
4049 if (!PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) {
4050 Py_INCREF(Py_NotImplemented);
4051 return Py_NotImplemented;
4052 }
4053 return (*func)(other, self);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004054}
4055
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004056static PyObject *
Tim Peters6d6c1a32001-08-02 04:15:00 +00004057wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
4058{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004059 ternaryfunc func = (ternaryfunc)wrapped;
4060 PyObject *other;
4061 PyObject *third = Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004063 /* Note: This wrapper only works for __pow__() */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004065 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
4066 return NULL;
4067 return (*func)(self, other, third);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004068}
4069
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004070static PyObject *
4071wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
4072{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004073 ternaryfunc func = (ternaryfunc)wrapped;
4074 PyObject *other;
4075 PyObject *third = Py_None;
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004076
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004077 /* Note: This wrapper only works for __pow__() */
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004079 if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
4080 return NULL;
4081 return (*func)(other, self, third);
Guido van Rossum9bea3ab2001-09-28 22:58:52 +00004082}
4083
Tim Peters6d6c1a32001-08-02 04:15:00 +00004084static PyObject *
4085wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
4086{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004087 unaryfunc func = (unaryfunc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004088
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004089 if (!check_num_args(args, 0))
4090 return NULL;
4091 return (*func)(self);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004092}
4093
Tim Peters6d6c1a32001-08-02 04:15:00 +00004094static PyObject *
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00004095wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004096{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004097 ssizeargfunc func = (ssizeargfunc)wrapped;
4098 PyObject* o;
4099 Py_ssize_t i;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004100
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004101 if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
4102 return NULL;
4103 i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
4104 if (i == -1 && PyErr_Occurred())
4105 return NULL;
4106 return (*func)(self, i);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004107}
4108
Martin v. Löwis18e16552006-02-15 17:27:45 +00004109static Py_ssize_t
Guido van Rossum5d815f32001-08-17 21:57:47 +00004110getindex(PyObject *self, PyObject *arg)
4111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004112 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004114 i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
4115 if (i == -1 && PyErr_Occurred())
4116 return -1;
4117 if (i < 0) {
4118 PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
4119 if (sq && sq->sq_length) {
4120 Py_ssize_t n = (*sq->sq_length)(self);
4121 if (n < 0)
4122 return -1;
4123 i += n;
4124 }
4125 }
4126 return i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004127}
4128
4129static PyObject *
4130wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
4131{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004132 ssizeargfunc func = (ssizeargfunc)wrapped;
4133 PyObject *arg;
4134 Py_ssize_t i;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004135
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004136 if (PyTuple_GET_SIZE(args) == 1) {
4137 arg = PyTuple_GET_ITEM(args, 0);
4138 i = getindex(self, arg);
4139 if (i == -1 && PyErr_Occurred())
4140 return NULL;
4141 return (*func)(self, i);
4142 }
4143 check_num_args(args, 1);
4144 assert(PyErr_Occurred());
4145 return NULL;
Guido van Rossum5d815f32001-08-17 21:57:47 +00004146}
4147
Tim Peters6d6c1a32001-08-02 04:15:00 +00004148static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00004149wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004150{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004151 ssizeobjargproc func = (ssizeobjargproc)wrapped;
4152 Py_ssize_t i;
4153 int res;
4154 PyObject *arg, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004155
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004156 if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
4157 return NULL;
4158 i = getindex(self, arg);
4159 if (i == -1 && PyErr_Occurred())
4160 return NULL;
4161 res = (*func)(self, i, value);
4162 if (res == -1 && PyErr_Occurred())
4163 return NULL;
4164 Py_INCREF(Py_None);
4165 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004166}
4167
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004168static PyObject *
Guido van Rossum5d815f32001-08-17 21:57:47 +00004169wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004170{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004171 ssizeobjargproc func = (ssizeobjargproc)wrapped;
4172 Py_ssize_t i;
4173 int res;
4174 PyObject *arg;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004175
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004176 if (!check_num_args(args, 1))
4177 return NULL;
4178 arg = PyTuple_GET_ITEM(args, 0);
4179 i = getindex(self, arg);
4180 if (i == -1 && PyErr_Occurred())
4181 return NULL;
4182 res = (*func)(self, i, NULL);
4183 if (res == -1 && PyErr_Occurred())
4184 return NULL;
4185 Py_INCREF(Py_None);
4186 return Py_None;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004187}
4188
Tim Peters6d6c1a32001-08-02 04:15:00 +00004189/* XXX objobjproc is a misnomer; should be objargpred */
4190static PyObject *
4191wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
4192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004193 objobjproc func = (objobjproc)wrapped;
4194 int res;
4195 PyObject *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004197 if (!check_num_args(args, 1))
4198 return NULL;
4199 value = PyTuple_GET_ITEM(args, 0);
4200 res = (*func)(self, value);
4201 if (res == -1 && PyErr_Occurred())
4202 return NULL;
4203 else
4204 return PyBool_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004205}
4206
Tim Peters6d6c1a32001-08-02 04:15:00 +00004207static PyObject *
4208wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
4209{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004210 objobjargproc func = (objobjargproc)wrapped;
4211 int res;
4212 PyObject *key, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004213
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004214 if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
4215 return NULL;
4216 res = (*func)(self, key, value);
4217 if (res == -1 && PyErr_Occurred())
4218 return NULL;
4219 Py_INCREF(Py_None);
4220 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004221}
4222
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004223static PyObject *
4224wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
4225{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004226 objobjargproc func = (objobjargproc)wrapped;
4227 int res;
4228 PyObject *key;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004229
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004230 if (!check_num_args(args, 1))
4231 return NULL;
4232 key = PyTuple_GET_ITEM(args, 0);
4233 res = (*func)(self, key, NULL);
4234 if (res == -1 && PyErr_Occurred())
4235 return NULL;
4236 Py_INCREF(Py_None);
4237 return Py_None;
Guido van Rossum2b8d7bd2001-08-02 15:31:58 +00004238}
4239
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004240/* Helper to check for object.__setattr__ or __delattr__ applied to a type.
Guido van Rossum52b27052003-04-15 20:05:10 +00004241 This is called the Carlo Verre hack after its discoverer. */
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004242static int
4243hackcheck(PyObject *self, setattrofunc func, char *what)
4244{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004245 PyTypeObject *type = Py_TYPE(self);
4246 while (type && type->tp_flags & Py_TPFLAGS_HEAPTYPE)
4247 type = type->tp_base;
4248 /* If type is NULL now, this is a really weird type.
4249 In the spirit of backwards compatibility (?), just shut up. */
4250 if (type && type->tp_setattro != func) {
4251 PyErr_Format(PyExc_TypeError,
4252 "can't apply this %s to %s object",
4253 what,
4254 type->tp_name);
4255 return 0;
4256 }
4257 return 1;
Guido van Rossum4dcdb782003-04-14 21:46:03 +00004258}
4259
Tim Peters6d6c1a32001-08-02 04:15:00 +00004260static PyObject *
4261wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
4262{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004263 setattrofunc func = (setattrofunc)wrapped;
4264 int res;
4265 PyObject *name, *value;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004266
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004267 if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
4268 return NULL;
4269 if (!hackcheck(self, func, "__setattr__"))
4270 return NULL;
4271 res = (*func)(self, name, value);
4272 if (res < 0)
4273 return NULL;
4274 Py_INCREF(Py_None);
4275 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004276}
4277
4278static PyObject *
4279wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
4280{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004281 setattrofunc func = (setattrofunc)wrapped;
4282 int res;
4283 PyObject *name;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004284
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004285 if (!check_num_args(args, 1))
4286 return NULL;
4287 name = PyTuple_GET_ITEM(args, 0);
4288 if (!hackcheck(self, func, "__delattr__"))
4289 return NULL;
4290 res = (*func)(self, name, NULL);
4291 if (res < 0)
4292 return NULL;
4293 Py_INCREF(Py_None);
4294 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004295}
4296
Tim Peters6d6c1a32001-08-02 04:15:00 +00004297static PyObject *
4298wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
4299{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004300 hashfunc func = (hashfunc)wrapped;
4301 long res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004302
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004303 if (!check_num_args(args, 0))
4304 return NULL;
4305 res = (*func)(self);
4306 if (res == -1 && PyErr_Occurred())
4307 return NULL;
4308 return PyLong_FromLong(res);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004309}
4310
Tim Peters6d6c1a32001-08-02 04:15:00 +00004311static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004312wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004313{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004314 ternaryfunc func = (ternaryfunc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004315
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004316 return (*func)(self, args, kwds);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004317}
4318
Tim Peters6d6c1a32001-08-02 04:15:00 +00004319static PyObject *
4320wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
4321{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004322 richcmpfunc func = (richcmpfunc)wrapped;
4323 PyObject *other;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004324
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004325 if (!check_num_args(args, 1))
4326 return NULL;
4327 other = PyTuple_GET_ITEM(args, 0);
4328 return (*func)(self, other, op);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004329}
4330
4331#undef RICHCMP_WRAPPER
4332#define RICHCMP_WRAPPER(NAME, OP) \
4333static PyObject * \
4334richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
4335{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004336 return wrap_richcmpfunc(self, args, wrapped, OP); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004337}
4338
Jack Jansen8e938b42001-08-08 15:29:49 +00004339RICHCMP_WRAPPER(lt, Py_LT)
4340RICHCMP_WRAPPER(le, Py_LE)
4341RICHCMP_WRAPPER(eq, Py_EQ)
4342RICHCMP_WRAPPER(ne, Py_NE)
4343RICHCMP_WRAPPER(gt, Py_GT)
4344RICHCMP_WRAPPER(ge, Py_GE)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004345
Tim Peters6d6c1a32001-08-02 04:15:00 +00004346static PyObject *
4347wrap_next(PyObject *self, PyObject *args, void *wrapped)
4348{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004349 unaryfunc func = (unaryfunc)wrapped;
4350 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004351
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004352 if (!check_num_args(args, 0))
4353 return NULL;
4354 res = (*func)(self);
4355 if (res == NULL && !PyErr_Occurred())
4356 PyErr_SetNone(PyExc_StopIteration);
4357 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004358}
4359
Tim Peters6d6c1a32001-08-02 04:15:00 +00004360static PyObject *
4361wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
4362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004363 descrgetfunc func = (descrgetfunc)wrapped;
4364 PyObject *obj;
4365 PyObject *type = NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004366
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004367 if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
4368 return NULL;
4369 if (obj == Py_None)
4370 obj = NULL;
4371 if (type == Py_None)
4372 type = NULL;
4373 if (type == NULL &&obj == NULL) {
4374 PyErr_SetString(PyExc_TypeError,
4375 "__get__(None, None) is invalid");
4376 return NULL;
4377 }
4378 return (*func)(self, obj, type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004379}
4380
Tim Peters6d6c1a32001-08-02 04:15:00 +00004381static PyObject *
Guido van Rossum7b9144b2001-10-09 19:39:46 +00004382wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004384 descrsetfunc func = (descrsetfunc)wrapped;
4385 PyObject *obj, *value;
4386 int ret;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004387
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004388 if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
4389 return NULL;
4390 ret = (*func)(self, obj, value);
4391 if (ret < 0)
4392 return NULL;
4393 Py_INCREF(Py_None);
4394 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004395}
Guido van Rossum22b13872002-08-06 21:41:44 +00004396
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004397static PyObject *
4398wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
4399{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004400 descrsetfunc func = (descrsetfunc)wrapped;
4401 PyObject *obj;
4402 int ret;
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004403
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004404 if (!check_num_args(args, 1))
4405 return NULL;
4406 obj = PyTuple_GET_ITEM(args, 0);
4407 ret = (*func)(self, obj, NULL);
4408 if (ret < 0)
4409 return NULL;
4410 Py_INCREF(Py_None);
4411 return Py_None;
Guido van Rossum0dbab4c52002-08-01 14:39:25 +00004412}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004413
Tim Peters6d6c1a32001-08-02 04:15:00 +00004414static PyObject *
Guido van Rossumc8e56452001-10-22 00:43:43 +00004415wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004416{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004417 initproc func = (initproc)wrapped;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004418
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004419 if (func(self, args, kwds) < 0)
4420 return NULL;
4421 Py_INCREF(Py_None);
4422 return Py_None;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004423}
4424
Tim Peters6d6c1a32001-08-02 04:15:00 +00004425static PyObject *
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004426tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004427{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004428 PyTypeObject *type, *subtype, *staticbase;
4429 PyObject *arg0, *res;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004431 if (self == NULL || !PyType_Check(self))
4432 Py_FatalError("__new__() called with non-type 'self'");
4433 type = (PyTypeObject *)self;
4434 if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
4435 PyErr_Format(PyExc_TypeError,
4436 "%s.__new__(): not enough arguments",
4437 type->tp_name);
4438 return NULL;
4439 }
4440 arg0 = PyTuple_GET_ITEM(args, 0);
4441 if (!PyType_Check(arg0)) {
4442 PyErr_Format(PyExc_TypeError,
4443 "%s.__new__(X): X is not a type object (%s)",
4444 type->tp_name,
4445 Py_TYPE(arg0)->tp_name);
4446 return NULL;
4447 }
4448 subtype = (PyTypeObject *)arg0;
4449 if (!PyType_IsSubtype(subtype, type)) {
4450 PyErr_Format(PyExc_TypeError,
4451 "%s.__new__(%s): %s is not a subtype of %s",
4452 type->tp_name,
4453 subtype->tp_name,
4454 subtype->tp_name,
4455 type->tp_name);
4456 return NULL;
4457 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004458
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004459 /* Check that the use doesn't do something silly and unsafe like
4460 object.__new__(dict). To do this, we check that the
4461 most derived base that's not a heap type is this type. */
4462 staticbase = subtype;
4463 while (staticbase && (staticbase->tp_flags & Py_TPFLAGS_HEAPTYPE))
4464 staticbase = staticbase->tp_base;
4465 /* If staticbase is NULL now, it is a really weird type.
4466 In the spirit of backwards compatibility (?), just shut up. */
4467 if (staticbase && staticbase->tp_new != type->tp_new) {
4468 PyErr_Format(PyExc_TypeError,
4469 "%s.__new__(%s) is not safe, use %s.__new__()",
4470 type->tp_name,
4471 subtype->tp_name,
4472 staticbase == NULL ? "?" : staticbase->tp_name);
4473 return NULL;
4474 }
Barry Warsaw60f01882001-08-22 19:24:42 +00004475
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004476 args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
4477 if (args == NULL)
4478 return NULL;
4479 res = type->tp_new(subtype, args, kwds);
4480 Py_DECREF(args);
4481 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004482}
4483
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004484static struct PyMethodDef tp_new_methoddef[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004485 {"__new__", (PyCFunction)tp_new_wrapper, METH_VARARGS|METH_KEYWORDS,
4486 PyDoc_STR("T.__new__(S, ...) -> "
4487 "a new object with type S, a subtype of T")},
4488 {0}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004489};
4490
4491static int
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004492add_tp_new_wrapper(PyTypeObject *type)
4493{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004494 PyObject *func;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004496 if (PyDict_GetItemString(type->tp_dict, "__new__") != NULL)
4497 return 0;
4498 func = PyCFunction_New(tp_new_methoddef, (PyObject *)type);
4499 if (func == NULL)
4500 return -1;
4501 if (PyDict_SetItemString(type->tp_dict, "__new__", func)) {
4502 Py_DECREF(func);
4503 return -1;
4504 }
4505 Py_DECREF(func);
4506 return 0;
Guido van Rossum0d231ed2001-08-06 16:50:37 +00004507}
4508
Guido van Rossumf040ede2001-08-07 16:40:56 +00004509/* Slot wrappers that call the corresponding __foo__ slot. See comments
4510 below at override_slots() for more explanation. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00004511
Guido van Rossumdc91b992001-08-08 22:26:22 +00004512#define SLOT0(FUNCNAME, OPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004513static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004514FUNCNAME(PyObject *self) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004515{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004516 static PyObject *cache_str; \
4517 return call_method(self, OPSTR, &cache_str, "()"); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004518}
4519
Guido van Rossumdc91b992001-08-08 22:26:22 +00004520#define SLOT1(FUNCNAME, OPSTR, ARG1TYPE, ARGCODES) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004521static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004522FUNCNAME(PyObject *self, ARG1TYPE arg1) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004523{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004524 static PyObject *cache_str; \
4525 return call_method(self, OPSTR, &cache_str, "(" ARGCODES ")", arg1); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004526}
4527
Guido van Rossumcd118802003-01-06 22:57:47 +00004528/* Boolean helper for SLOT1BINFULL().
4529 right.__class__ is a nontrivial subclass of left.__class__. */
4530static int
4531method_is_overloaded(PyObject *left, PyObject *right, char *name)
4532{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004533 PyObject *a, *b;
4534 int ok;
Guido van Rossumcd118802003-01-06 22:57:47 +00004535
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004536 b = PyObject_GetAttrString((PyObject *)(Py_TYPE(right)), name);
4537 if (b == NULL) {
4538 PyErr_Clear();
4539 /* If right doesn't have it, it's not overloaded */
4540 return 0;
4541 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004543 a = PyObject_GetAttrString((PyObject *)(Py_TYPE(left)), name);
4544 if (a == NULL) {
4545 PyErr_Clear();
4546 Py_DECREF(b);
4547 /* If right has it but left doesn't, it's overloaded */
4548 return 1;
4549 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004550
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004551 ok = PyObject_RichCompareBool(a, b, Py_NE);
4552 Py_DECREF(a);
4553 Py_DECREF(b);
4554 if (ok < 0) {
4555 PyErr_Clear();
4556 return 0;
4557 }
Guido van Rossumcd118802003-01-06 22:57:47 +00004558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004559 return ok;
Guido van Rossumcd118802003-01-06 22:57:47 +00004560}
4561
Guido van Rossumdc91b992001-08-08 22:26:22 +00004562
4563#define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, OPSTR, ROPSTR) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004564static PyObject * \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004565FUNCNAME(PyObject *self, PyObject *other) \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004566{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004567 static PyObject *cache_str, *rcache_str; \
4568 int do_other = Py_TYPE(self) != Py_TYPE(other) && \
4569 Py_TYPE(other)->tp_as_number != NULL && \
4570 Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
4571 if (Py_TYPE(self)->tp_as_number != NULL && \
4572 Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \
4573 PyObject *r; \
4574 if (do_other && \
4575 PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self)) && \
4576 method_is_overloaded(self, other, ROPSTR)) { \
4577 r = call_maybe( \
4578 other, ROPSTR, &rcache_str, "(O)", self); \
4579 if (r != Py_NotImplemented) \
4580 return r; \
4581 Py_DECREF(r); \
4582 do_other = 0; \
4583 } \
4584 r = call_maybe( \
4585 self, OPSTR, &cache_str, "(O)", other); \
4586 if (r != Py_NotImplemented || \
4587 Py_TYPE(other) == Py_TYPE(self)) \
4588 return r; \
4589 Py_DECREF(r); \
4590 } \
4591 if (do_other) { \
4592 return call_maybe( \
4593 other, ROPSTR, &rcache_str, "(O)", self); \
4594 } \
4595 Py_INCREF(Py_NotImplemented); \
4596 return Py_NotImplemented; \
Guido van Rossumdc91b992001-08-08 22:26:22 +00004597}
4598
4599#define SLOT1BIN(FUNCNAME, SLOTNAME, OPSTR, ROPSTR) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004600 SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, OPSTR, ROPSTR)
Guido van Rossumdc91b992001-08-08 22:26:22 +00004601
4602#define SLOT2(FUNCNAME, OPSTR, ARG1TYPE, ARG2TYPE, ARGCODES) \
4603static PyObject * \
4604FUNCNAME(PyObject *self, ARG1TYPE arg1, ARG2TYPE arg2) \
4605{ \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004606 static PyObject *cache_str; \
4607 return call_method(self, OPSTR, &cache_str, \
4608 "(" ARGCODES ")", arg1, arg2); \
Tim Peters6d6c1a32001-08-02 04:15:00 +00004609}
4610
Martin v. Löwis18e16552006-02-15 17:27:45 +00004611static Py_ssize_t
Tim Peters6d6c1a32001-08-02 04:15:00 +00004612slot_sq_length(PyObject *self)
4613{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004614 static PyObject *len_str;
4615 PyObject *res = call_method(self, "__len__", &len_str, "()");
4616 Py_ssize_t len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004617
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004618 if (res == NULL)
4619 return -1;
4620 len = PyNumber_AsSsize_t(res, PyExc_OverflowError);
4621 Py_DECREF(res);
4622 if (len < 0) {
4623 if (!PyErr_Occurred())
4624 PyErr_SetString(PyExc_ValueError,
4625 "__len__() should return >= 0");
4626 return -1;
4627 }
4628 return len;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004629}
4630
Guido van Rossumf4593e02001-10-03 12:09:30 +00004631/* Super-optimized version of slot_sq_item.
4632 Other slots could do the same... */
4633static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +00004634slot_sq_item(PyObject *self, Py_ssize_t i)
Guido van Rossumf4593e02001-10-03 12:09:30 +00004635{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004636 static PyObject *getitem_str;
4637 PyObject *func, *args = NULL, *ival = NULL, *retval = NULL;
4638 descrgetfunc f;
Guido van Rossumf4593e02001-10-03 12:09:30 +00004639
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004640 if (getitem_str == NULL) {
4641 getitem_str = PyUnicode_InternFromString("__getitem__");
4642 if (getitem_str == NULL)
4643 return NULL;
4644 }
4645 func = _PyType_Lookup(Py_TYPE(self), getitem_str);
4646 if (func != NULL) {
4647 if ((f = Py_TYPE(func)->tp_descr_get) == NULL)
4648 Py_INCREF(func);
4649 else {
4650 func = f(func, self, (PyObject *)(Py_TYPE(self)));
4651 if (func == NULL) {
4652 return NULL;
4653 }
4654 }
4655 ival = PyLong_FromSsize_t(i);
4656 if (ival != NULL) {
4657 args = PyTuple_New(1);
4658 if (args != NULL) {
4659 PyTuple_SET_ITEM(args, 0, ival);
4660 retval = PyObject_Call(func, args, NULL);
4661 Py_XDECREF(args);
4662 Py_XDECREF(func);
4663 return retval;
4664 }
4665 }
4666 }
4667 else {
4668 PyErr_SetObject(PyExc_AttributeError, getitem_str);
4669 }
4670 Py_XDECREF(args);
4671 Py_XDECREF(ival);
4672 Py_XDECREF(func);
4673 return NULL;
Guido van Rossumf4593e02001-10-03 12:09:30 +00004674}
4675
Tim Peters6d6c1a32001-08-02 04:15:00 +00004676static int
Martin v. Löwis18e16552006-02-15 17:27:45 +00004677slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004678{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004679 PyObject *res;
4680 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004682 if (value == NULL)
4683 res = call_method(self, "__delitem__", &delitem_str,
4684 "(n)", index);
4685 else
4686 res = call_method(self, "__setitem__", &setitem_str,
4687 "(nO)", index, value);
4688 if (res == NULL)
4689 return -1;
4690 Py_DECREF(res);
4691 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004692}
4693
4694static int
Tim Peters6d6c1a32001-08-02 04:15:00 +00004695slot_sq_contains(PyObject *self, PyObject *value)
4696{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004697 PyObject *func, *res, *args;
4698 int result = -1;
Tim Petersbf9b2442003-03-23 05:35:36 +00004699
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004700 static PyObject *contains_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004702 func = lookup_maybe(self, "__contains__", &contains_str);
4703 if (func != NULL) {
4704 args = PyTuple_Pack(1, value);
4705 if (args == NULL)
4706 res = NULL;
4707 else {
4708 res = PyObject_Call(func, args, NULL);
4709 Py_DECREF(args);
4710 }
4711 Py_DECREF(func);
4712 if (res != NULL) {
4713 result = PyObject_IsTrue(res);
4714 Py_DECREF(res);
4715 }
4716 }
4717 else if (! PyErr_Occurred()) {
4718 /* Possible results: -1 and 1 */
4719 result = (int)_PySequence_IterSearch(self, value,
4720 PY_ITERSEARCH_CONTAINS);
4721 }
4722 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004723}
4724
Tim Peters6d6c1a32001-08-02 04:15:00 +00004725#define slot_mp_length slot_sq_length
4726
Guido van Rossumdc91b992001-08-08 22:26:22 +00004727SLOT1(slot_mp_subscript, "__getitem__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004728
4729static int
4730slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
4731{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004732 PyObject *res;
4733 static PyObject *delitem_str, *setitem_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004734
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004735 if (value == NULL)
4736 res = call_method(self, "__delitem__", &delitem_str,
4737 "(O)", key);
4738 else
4739 res = call_method(self, "__setitem__", &setitem_str,
4740 "(OO)", key, value);
4741 if (res == NULL)
4742 return -1;
4743 Py_DECREF(res);
4744 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004745}
4746
Guido van Rossumdc91b992001-08-08 22:26:22 +00004747SLOT1BIN(slot_nb_add, nb_add, "__add__", "__radd__")
4748SLOT1BIN(slot_nb_subtract, nb_subtract, "__sub__", "__rsub__")
4749SLOT1BIN(slot_nb_multiply, nb_multiply, "__mul__", "__rmul__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004750SLOT1BIN(slot_nb_remainder, nb_remainder, "__mod__", "__rmod__")
4751SLOT1BIN(slot_nb_divmod, nb_divmod, "__divmod__", "__rdivmod__")
4752
Jeremy Hylton938ace62002-07-17 16:30:39 +00004753static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
Guido van Rossumdc91b992001-08-08 22:26:22 +00004754
4755SLOT1BINFULL(slot_nb_power_binary, slot_nb_power,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004756 nb_power, "__pow__", "__rpow__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004757
4758static PyObject *
4759slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
4760{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004761 static PyObject *pow_str;
Guido van Rossum2730b132001-08-28 18:22:14 +00004762
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004763 if (modulus == Py_None)
4764 return slot_nb_power_binary(self, other);
4765 /* Three-arg power doesn't use __rpow__. But ternary_op
4766 can call this when the second argument's type uses
4767 slot_nb_power, so check before calling self.__pow__. */
4768 if (Py_TYPE(self)->tp_as_number != NULL &&
4769 Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
4770 return call_method(self, "__pow__", &pow_str,
4771 "(OO)", other, modulus);
4772 }
4773 Py_INCREF(Py_NotImplemented);
4774 return Py_NotImplemented;
Guido van Rossumdc91b992001-08-08 22:26:22 +00004775}
4776
4777SLOT0(slot_nb_negative, "__neg__")
4778SLOT0(slot_nb_positive, "__pos__")
4779SLOT0(slot_nb_absolute, "__abs__")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004780
4781static int
Jack Diederich4dafcc42006-11-28 19:15:13 +00004782slot_nb_bool(PyObject *self)
Tim Peters6d6c1a32001-08-02 04:15:00 +00004783{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004784 PyObject *func, *args;
4785 static PyObject *bool_str, *len_str;
4786 int result = -1;
4787 int using_len = 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004788
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004789 func = lookup_maybe(self, "__bool__", &bool_str);
4790 if (func == NULL) {
4791 if (PyErr_Occurred())
4792 return -1;
4793 func = lookup_maybe(self, "__len__", &len_str);
4794 if (func == NULL)
4795 return PyErr_Occurred() ? -1 : 1;
4796 using_len = 1;
4797 }
4798 args = PyTuple_New(0);
4799 if (args != NULL) {
4800 PyObject *temp = PyObject_Call(func, args, NULL);
4801 Py_DECREF(args);
4802 if (temp != NULL) {
4803 if (using_len) {
4804 /* enforced by slot_nb_len */
4805 result = PyObject_IsTrue(temp);
4806 }
4807 else if (PyBool_Check(temp)) {
4808 result = PyObject_IsTrue(temp);
4809 }
4810 else {
4811 PyErr_Format(PyExc_TypeError,
4812 "__bool__ should return "
4813 "bool, returned %s",
4814 Py_TYPE(temp)->tp_name);
4815 result = -1;
4816 }
4817 Py_DECREF(temp);
4818 }
4819 }
4820 Py_DECREF(func);
4821 return result;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004822}
4823
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004824
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00004825static PyObject *
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004826slot_nb_index(PyObject *self)
4827{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004828 static PyObject *index_str;
4829 return call_method(self, "__index__", &index_str, "()");
Guido van Rossum38fff8c2006-03-07 18:50:55 +00004830}
4831
4832
Guido van Rossumdc91b992001-08-08 22:26:22 +00004833SLOT0(slot_nb_invert, "__invert__")
4834SLOT1BIN(slot_nb_lshift, nb_lshift, "__lshift__", "__rlshift__")
4835SLOT1BIN(slot_nb_rshift, nb_rshift, "__rshift__", "__rrshift__")
4836SLOT1BIN(slot_nb_and, nb_and, "__and__", "__rand__")
4837SLOT1BIN(slot_nb_xor, nb_xor, "__xor__", "__rxor__")
4838SLOT1BIN(slot_nb_or, nb_or, "__or__", "__ror__")
Guido van Rossum2ed6bf82001-09-27 20:30:07 +00004839
Guido van Rossumdc91b992001-08-08 22:26:22 +00004840SLOT0(slot_nb_int, "__int__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004841SLOT0(slot_nb_float, "__float__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004842SLOT1(slot_nb_inplace_add, "__iadd__", PyObject *, "O")
4843SLOT1(slot_nb_inplace_subtract, "__isub__", PyObject *, "O")
4844SLOT1(slot_nb_inplace_multiply, "__imul__", PyObject *, "O")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004845SLOT1(slot_nb_inplace_remainder, "__imod__", PyObject *, "O")
Thomas Wouterscf297e42007-02-23 15:07:44 +00004846/* Can't use SLOT1 here, because nb_inplace_power is ternary */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004847static PyObject *
4848slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
4849{
4850 static PyObject *cache_str;
4851 return call_method(self, "__ipow__", &cache_str, "(" "O" ")", arg1);
Thomas Wouterscf297e42007-02-23 15:07:44 +00004852}
Guido van Rossumdc91b992001-08-08 22:26:22 +00004853SLOT1(slot_nb_inplace_lshift, "__ilshift__", PyObject *, "O")
4854SLOT1(slot_nb_inplace_rshift, "__irshift__", PyObject *, "O")
4855SLOT1(slot_nb_inplace_and, "__iand__", PyObject *, "O")
4856SLOT1(slot_nb_inplace_xor, "__ixor__", PyObject *, "O")
4857SLOT1(slot_nb_inplace_or, "__ior__", PyObject *, "O")
4858SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004859 "__floordiv__", "__rfloordiv__")
Guido van Rossumdc91b992001-08-08 22:26:22 +00004860SLOT1BIN(slot_nb_true_divide, nb_true_divide, "__truediv__", "__rtruediv__")
4861SLOT1(slot_nb_inplace_floor_divide, "__ifloordiv__", PyObject *, "O")
4862SLOT1(slot_nb_inplace_true_divide, "__itruediv__", PyObject *, "O")
Tim Peters6d6c1a32001-08-02 04:15:00 +00004863
Guido van Rossumb8f63662001-08-15 23:57:02 +00004864static PyObject *
4865slot_tp_repr(PyObject *self)
4866{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004867 PyObject *func, *res;
4868 static PyObject *repr_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004869
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004870 func = lookup_method(self, "__repr__", &repr_str);
4871 if (func != NULL) {
4872 res = PyEval_CallObject(func, NULL);
4873 Py_DECREF(func);
4874 return res;
4875 }
4876 PyErr_Clear();
4877 return PyUnicode_FromFormat("<%s object at %p>",
4878 Py_TYPE(self)->tp_name, self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004879}
4880
4881static PyObject *
4882slot_tp_str(PyObject *self)
4883{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004884 PyObject *func, *res;
4885 static PyObject *str_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00004886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004887 func = lookup_method(self, "__str__", &str_str);
4888 if (func != NULL) {
4889 res = PyEval_CallObject(func, NULL);
4890 Py_DECREF(func);
4891 return res;
4892 }
4893 else {
4894 PyObject *ress;
4895 PyErr_Clear();
4896 res = slot_tp_repr(self);
4897 if (!res)
4898 return NULL;
4899 ress = _PyUnicode_AsDefaultEncodedString(res, NULL);
4900 Py_DECREF(res);
4901 return ress;
4902 }
Guido van Rossumb8f63662001-08-15 23:57:02 +00004903}
Tim Peters6d6c1a32001-08-02 04:15:00 +00004904
4905static long
4906slot_tp_hash(PyObject *self)
4907{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004908 PyObject *func, *res;
4909 static PyObject *hash_str;
4910 long h;
Mark Dickinsondc787d22010-05-23 13:33:13 +00004911 int overflow;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004912
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004913 func = lookup_method(self, "__hash__", &hash_str);
Guido van Rossumb8f63662001-08-15 23:57:02 +00004914
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004915 if (func == Py_None) {
4916 Py_DECREF(func);
4917 func = NULL;
4918 }
Guido van Rossum50e9fb92006-08-17 05:42:55 +00004919
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004920 if (func == NULL) {
4921 return PyObject_HashNotImplemented(self);
4922 }
Guido van Rossum50e9fb92006-08-17 05:42:55 +00004923
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004924 res = PyEval_CallObject(func, NULL);
4925 Py_DECREF(func);
4926 if (res == NULL)
4927 return -1;
Mark Dickinsondc787d22010-05-23 13:33:13 +00004928
4929 if (!PyLong_Check(res)) {
4930 PyErr_SetString(PyExc_TypeError,
4931 "__hash__ method should return an integer");
4932 return -1;
4933 }
4934 /* Transform the PyLong `res` to a C long `h`. For an existing
4935 hashable Python object x, hash(x) will always lie within the range
4936 of a C long. Therefore our transformation must preserve values
4937 that already lie within this range, to ensure that if x.__hash__()
4938 returns hash(y) then hash(x) == hash(y). */
4939 h = PyLong_AsLongAndOverflow(res, &overflow);
4940 if (overflow)
4941 /* res was not within the range of a C long, so we're free to
4942 use any sufficiently bit-mixing transformation;
4943 long.__hash__ will do nicely. */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004944 h = PyLong_Type.tp_hash(res);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004945 Py_DECREF(res);
Mark Dickinsondc787d22010-05-23 13:33:13 +00004946 if (h == -1 && !PyErr_Occurred())
4947 h = -2;
4948 return h;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004949}
4950
4951static PyObject *
4952slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
4953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004954 static PyObject *call_str;
4955 PyObject *meth = lookup_method(self, "__call__", &call_str);
4956 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004957
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004958 if (meth == NULL)
4959 return NULL;
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004960
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004961 res = PyObject_Call(meth, args, kwds);
Thomas Wouters0e3f5912006-08-11 14:57:12 +00004962
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004963 Py_DECREF(meth);
4964 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00004965}
4966
Guido van Rossum14a6f832001-10-17 13:59:09 +00004967/* There are two slot dispatch functions for tp_getattro.
4968
4969 - slot_tp_getattro() is used when __getattribute__ is overridden
4970 but no __getattr__ hook is present;
4971
4972 - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
4973
Guido van Rossumc334df52002-04-04 23:44:47 +00004974 The code in update_one_slot() always installs slot_tp_getattr_hook(); this
4975 detects the absence of __getattr__ and then installs the simpler slot if
4976 necessary. */
Guido van Rossum14a6f832001-10-17 13:59:09 +00004977
Tim Peters6d6c1a32001-08-02 04:15:00 +00004978static PyObject *
4979slot_tp_getattro(PyObject *self, PyObject *name)
4980{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004981 static PyObject *getattribute_str = NULL;
4982 return call_method(self, "__getattribute__", &getattribute_str,
4983 "(O)", name);
Tim Peters6d6c1a32001-08-02 04:15:00 +00004984}
4985
Guido van Rossum19c1cd52001-09-21 21:24:49 +00004986static PyObject *
Benjamin Peterson9262b842008-11-17 22:45:50 +00004987call_attribute(PyObject *self, PyObject *attr, PyObject *name)
4988{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004989 PyObject *res, *descr = NULL;
4990 descrgetfunc f = Py_TYPE(attr)->tp_descr_get;
Benjamin Peterson9262b842008-11-17 22:45:50 +00004991
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00004992 if (f != NULL) {
4993 descr = f(attr, self, (PyObject *)(Py_TYPE(self)));
4994 if (descr == NULL)
4995 return NULL;
4996 else
4997 attr = descr;
4998 }
4999 res = PyObject_CallFunctionObjArgs(attr, name, NULL);
5000 Py_XDECREF(descr);
5001 return res;
Benjamin Peterson9262b842008-11-17 22:45:50 +00005002}
5003
5004static PyObject *
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005005slot_tp_getattr_hook(PyObject *self, PyObject *name)
5006{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005007 PyTypeObject *tp = Py_TYPE(self);
5008 PyObject *getattr, *getattribute, *res;
5009 static PyObject *getattribute_str = NULL;
5010 static PyObject *getattr_str = NULL;
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005011
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005012 if (getattr_str == NULL) {
5013 getattr_str = PyUnicode_InternFromString("__getattr__");
5014 if (getattr_str == NULL)
5015 return NULL;
5016 }
5017 if (getattribute_str == NULL) {
5018 getattribute_str =
5019 PyUnicode_InternFromString("__getattribute__");
5020 if (getattribute_str == NULL)
5021 return NULL;
5022 }
5023 /* speed hack: we could use lookup_maybe, but that would resolve the
5024 method fully for each attribute lookup for classes with
5025 __getattr__, even when the attribute is present. So we use
5026 _PyType_Lookup and create the method only when needed, with
5027 call_attribute. */
5028 getattr = _PyType_Lookup(tp, getattr_str);
5029 if (getattr == NULL) {
5030 /* No __getattr__ hook: use a simpler dispatcher */
5031 tp->tp_getattro = slot_tp_getattro;
5032 return slot_tp_getattro(self, name);
5033 }
5034 Py_INCREF(getattr);
5035 /* speed hack: we could use lookup_maybe, but that would resolve the
5036 method fully for each attribute lookup for classes with
5037 __getattr__, even when self has the default __getattribute__
5038 method. So we use _PyType_Lookup and create the method only when
5039 needed, with call_attribute. */
5040 getattribute = _PyType_Lookup(tp, getattribute_str);
5041 if (getattribute == NULL ||
5042 (Py_TYPE(getattribute) == &PyWrapperDescr_Type &&
5043 ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
5044 (void *)PyObject_GenericGetAttr))
5045 res = PyObject_GenericGetAttr(self, name);
5046 else {
5047 Py_INCREF(getattribute);
5048 res = call_attribute(self, getattribute, name);
5049 Py_DECREF(getattribute);
5050 }
5051 if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
5052 PyErr_Clear();
5053 res = call_attribute(self, getattr, name);
5054 }
5055 Py_DECREF(getattr);
5056 return res;
Guido van Rossum19c1cd52001-09-21 21:24:49 +00005057}
5058
Tim Peters6d6c1a32001-08-02 04:15:00 +00005059static int
5060slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
5061{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005062 PyObject *res;
5063 static PyObject *delattr_str, *setattr_str;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005064
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005065 if (value == NULL)
5066 res = call_method(self, "__delattr__", &delattr_str,
5067 "(O)", name);
5068 else
5069 res = call_method(self, "__setattr__", &setattr_str,
5070 "(OO)", name, value);
5071 if (res == NULL)
5072 return -1;
5073 Py_DECREF(res);
5074 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005075}
5076
Guido van Rossumf5243f02008-01-01 04:06:48 +00005077static char *name_op[] = {
5078 "__lt__",
5079 "__le__",
5080 "__eq__",
5081 "__ne__",
5082 "__gt__",
5083 "__ge__",
5084};
5085
Tim Peters6d6c1a32001-08-02 04:15:00 +00005086static PyObject *
Mark Dickinson6f1d0492009-11-15 13:58:49 +00005087slot_tp_richcompare(PyObject *self, PyObject *other, int op)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005088{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005089 PyObject *func, *args, *res;
5090 static PyObject *op_str[6];
Tim Peters6d6c1a32001-08-02 04:15:00 +00005091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005092 func = lookup_method(self, name_op[op], &op_str[op]);
5093 if (func == NULL) {
5094 PyErr_Clear();
5095 Py_INCREF(Py_NotImplemented);
5096 return Py_NotImplemented;
5097 }
5098 args = PyTuple_Pack(1, other);
5099 if (args == NULL)
5100 res = NULL;
5101 else {
5102 res = PyObject_Call(func, args, NULL);
5103 Py_DECREF(args);
5104 }
5105 Py_DECREF(func);
5106 return res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005107}
5108
Guido van Rossumb8f63662001-08-15 23:57:02 +00005109static PyObject *
Guido van Rossumb8f63662001-08-15 23:57:02 +00005110slot_tp_iter(PyObject *self)
5111{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005112 PyObject *func, *res;
5113 static PyObject *iter_str, *getitem_str;
Guido van Rossumb8f63662001-08-15 23:57:02 +00005114
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005115 func = lookup_method(self, "__iter__", &iter_str);
5116 if (func != NULL) {
5117 PyObject *args;
5118 args = res = PyTuple_New(0);
5119 if (args != NULL) {
5120 res = PyObject_Call(func, args, NULL);
5121 Py_DECREF(args);
5122 }
5123 Py_DECREF(func);
5124 return res;
5125 }
5126 PyErr_Clear();
5127 func = lookup_method(self, "__getitem__", &getitem_str);
5128 if (func == NULL) {
5129 PyErr_Format(PyExc_TypeError,
5130 "'%.200s' object is not iterable",
5131 Py_TYPE(self)->tp_name);
5132 return NULL;
5133 }
5134 Py_DECREF(func);
5135 return PySeqIter_New(self);
Guido van Rossumb8f63662001-08-15 23:57:02 +00005136}
Tim Peters6d6c1a32001-08-02 04:15:00 +00005137
5138static PyObject *
5139slot_tp_iternext(PyObject *self)
5140{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005141 static PyObject *next_str;
5142 return call_method(self, "__next__", &next_str, "()");
Tim Peters6d6c1a32001-08-02 04:15:00 +00005143}
5144
Guido van Rossum1a493502001-08-17 16:47:50 +00005145static PyObject *
5146slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
5147{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005148 PyTypeObject *tp = Py_TYPE(self);
5149 PyObject *get;
5150 static PyObject *get_str = NULL;
Guido van Rossum1a493502001-08-17 16:47:50 +00005151
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005152 if (get_str == NULL) {
5153 get_str = PyUnicode_InternFromString("__get__");
5154 if (get_str == NULL)
5155 return NULL;
5156 }
5157 get = _PyType_Lookup(tp, get_str);
5158 if (get == NULL) {
5159 /* Avoid further slowdowns */
5160 if (tp->tp_descr_get == slot_tp_descr_get)
5161 tp->tp_descr_get = NULL;
5162 Py_INCREF(self);
5163 return self;
5164 }
5165 if (obj == NULL)
5166 obj = Py_None;
5167 if (type == NULL)
5168 type = Py_None;
5169 return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
Guido van Rossum1a493502001-08-17 16:47:50 +00005170}
Tim Peters6d6c1a32001-08-02 04:15:00 +00005171
5172static int
5173slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
5174{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005175 PyObject *res;
5176 static PyObject *del_str, *set_str;
Guido van Rossum2c252392001-08-24 10:13:31 +00005177
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005178 if (value == NULL)
5179 res = call_method(self, "__delete__", &del_str,
5180 "(O)", target);
5181 else
5182 res = call_method(self, "__set__", &set_str,
5183 "(OO)", target, value);
5184 if (res == NULL)
5185 return -1;
5186 Py_DECREF(res);
5187 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005188}
5189
5190static int
5191slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
5192{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005193 static PyObject *init_str;
5194 PyObject *meth = lookup_method(self, "__init__", &init_str);
5195 PyObject *res;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005196
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005197 if (meth == NULL)
5198 return -1;
5199 res = PyObject_Call(meth, args, kwds);
5200 Py_DECREF(meth);
5201 if (res == NULL)
5202 return -1;
5203 if (res != Py_None) {
5204 PyErr_Format(PyExc_TypeError,
5205 "__init__() should return None, not '%.200s'",
5206 Py_TYPE(res)->tp_name);
5207 Py_DECREF(res);
5208 return -1;
5209 }
5210 Py_DECREF(res);
5211 return 0;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005212}
5213
5214static PyObject *
5215slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
5216{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005217 static PyObject *new_str;
5218 PyObject *func;
5219 PyObject *newargs, *x;
5220 Py_ssize_t i, n;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005221
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005222 if (new_str == NULL) {
5223 new_str = PyUnicode_InternFromString("__new__");
5224 if (new_str == NULL)
5225 return NULL;
5226 }
5227 func = PyObject_GetAttr((PyObject *)type, new_str);
5228 if (func == NULL)
5229 return NULL;
5230 assert(PyTuple_Check(args));
5231 n = PyTuple_GET_SIZE(args);
5232 newargs = PyTuple_New(n+1);
5233 if (newargs == NULL)
5234 return NULL;
5235 Py_INCREF(type);
5236 PyTuple_SET_ITEM(newargs, 0, (PyObject *)type);
5237 for (i = 0; i < n; i++) {
5238 x = PyTuple_GET_ITEM(args, i);
5239 Py_INCREF(x);
5240 PyTuple_SET_ITEM(newargs, i+1, x);
5241 }
5242 x = PyObject_Call(func, newargs, kwds);
5243 Py_DECREF(newargs);
5244 Py_DECREF(func);
5245 return x;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005246}
5247
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005248static void
5249slot_tp_del(PyObject *self)
5250{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005251 static PyObject *del_str = NULL;
5252 PyObject *del, *res;
5253 PyObject *error_type, *error_value, *error_traceback;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005254
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005255 /* Temporarily resurrect the object. */
5256 assert(self->ob_refcnt == 0);
5257 self->ob_refcnt = 1;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005258
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005259 /* Save the current exception, if any. */
5260 PyErr_Fetch(&error_type, &error_value, &error_traceback);
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005261
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005262 /* Execute __del__ method, if any. */
5263 del = lookup_maybe(self, "__del__", &del_str);
5264 if (del != NULL) {
5265 res = PyEval_CallObject(del, NULL);
5266 if (res == NULL)
5267 PyErr_WriteUnraisable(del);
5268 else
5269 Py_DECREF(res);
5270 Py_DECREF(del);
5271 }
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005273 /* Restore the saved exception. */
5274 PyErr_Restore(error_type, error_value, error_traceback);
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005275
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005276 /* Undo the temporary resurrection; can't use DECREF here, it would
5277 * cause a recursive call.
5278 */
5279 assert(self->ob_refcnt > 0);
5280 if (--self->ob_refcnt == 0)
5281 return; /* this is the normal path out */
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005282
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005283 /* __del__ resurrected it! Make it look like the original Py_DECREF
5284 * never happened.
5285 */
5286 {
5287 Py_ssize_t refcnt = self->ob_refcnt;
5288 _Py_NewReference(self);
5289 self->ob_refcnt = refcnt;
5290 }
5291 assert(!PyType_IS_GC(Py_TYPE(self)) ||
5292 _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
5293 /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so
5294 * we need to undo that. */
5295 _Py_DEC_REFTOTAL;
5296 /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object
5297 * chain, so no more to do there.
5298 * If COUNT_ALLOCS, the original decref bumped tp_frees, and
5299 * _Py_NewReference bumped tp_allocs: both of those need to be
5300 * undone.
5301 */
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005302#ifdef COUNT_ALLOCS
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005303 --Py_TYPE(self)->tp_frees;
5304 --Py_TYPE(self)->tp_allocs;
Guido van Rossumfebd61d2002-08-08 20:55:20 +00005305#endif
5306}
5307
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005308
5309/* Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper
Tim Petersbf9b2442003-03-23 05:35:36 +00005310 functions. The offsets here are relative to the 'PyHeapTypeObject'
Guido van Rossume5c691a2003-03-07 15:13:17 +00005311 structure, which incorporates the additional structures used for numbers,
5312 sequences and mappings.
5313 Note that multiple names may map to the same slot (e.g. __eq__,
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005314 __ne__ etc. all map to tp_richcompare) and one name may map to multiple
Guido van Rossumc334df52002-04-04 23:44:47 +00005315 slots (e.g. __str__ affects tp_str as well as tp_repr). The table is
5316 terminated with an all-zero entry. (This table is further initialized and
5317 sorted in init_slotdefs() below.) */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005318
Guido van Rossum6d204072001-10-21 00:44:31 +00005319typedef struct wrapperbase slotdef;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005320
5321#undef TPSLOT
Guido van Rossumc8e56452001-10-22 00:43:43 +00005322#undef FLSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005323#undef ETSLOT
5324#undef SQSLOT
5325#undef MPSLOT
5326#undef NBSLOT
Guido van Rossum6d204072001-10-21 00:44:31 +00005327#undef UNSLOT
5328#undef IBSLOT
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005329#undef BINSLOT
5330#undef RBINSLOT
5331
Guido van Rossum6d204072001-10-21 00:44:31 +00005332#define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005333 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5334 PyDoc_STR(DOC)}
Guido van Rossumc8e56452001-10-22 00:43:43 +00005335#define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005336 {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5337 PyDoc_STR(DOC), FLAGS}
Guido van Rossum6d204072001-10-21 00:44:31 +00005338#define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005339 {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
5340 PyDoc_STR(DOC)}
Guido van Rossum6d204072001-10-21 00:44:31 +00005341#define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005342 ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005343#define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005344 ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005345#define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005346 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005347#define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005348 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5349 "x." NAME "() <==> " DOC)
Guido van Rossum6d204072001-10-21 00:44:31 +00005350#define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005351 ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
5352 "x." NAME "(y) <==> x" DOC "y")
Guido van Rossum6d204072001-10-21 00:44:31 +00005353#define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005354 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5355 "x." NAME "(y) <==> x" DOC "y")
Guido van Rossum6d204072001-10-21 00:44:31 +00005356#define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005357 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5358 "x." NAME "(y) <==> y" DOC "x")
Anthony Baxter56616992005-06-03 14:12:21 +00005359#define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005360 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
5361 "x." NAME "(y) <==> " DOC)
Anthony Baxter56616992005-06-03 14:12:21 +00005362#define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005363 ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
5364 "x." NAME "(y) <==> " DOC)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005365
5366static slotdef slotdefs[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005367 SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
5368 "x.__len__() <==> len(x)"),
5369 /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
5370 The logic in abstract.c always falls back to nb_add/nb_multiply in
5371 this case. Defining both the nb_* and the sq_* slots to call the
5372 user-defined methods has unexpected side-effects, as shown by
5373 test_descr.notimplemented() */
5374 SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
5375 "x.__add__(y) <==> x+y"),
5376 SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
5377 "x.__mul__(n) <==> x*n"),
5378 SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
5379 "x.__rmul__(n) <==> n*x"),
5380 SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
5381 "x.__getitem__(y) <==> x[y]"),
5382 SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
5383 "x.__setitem__(i, y) <==> x[i]=y"),
5384 SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
5385 "x.__delitem__(y) <==> del x[y]"),
5386 SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
5387 "x.__contains__(y) <==> y in x"),
5388 SQSLOT("__iadd__", sq_inplace_concat, NULL,
5389 wrap_binaryfunc, "x.__iadd__(y) <==> x+=y"),
5390 SQSLOT("__imul__", sq_inplace_repeat, NULL,
5391 wrap_indexargfunc, "x.__imul__(y) <==> x*=y"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005392
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005393 MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
5394 "x.__len__() <==> len(x)"),
5395 MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
5396 wrap_binaryfunc,
5397 "x.__getitem__(y) <==> x[y]"),
5398 MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
5399 wrap_objobjargproc,
5400 "x.__setitem__(i, y) <==> x[i]=y"),
5401 MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
5402 wrap_delitem,
5403 "x.__delitem__(y) <==> del x[y]"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005404
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005405 BINSLOT("__add__", nb_add, slot_nb_add,
5406 "+"),
5407 RBINSLOT("__radd__", nb_add, slot_nb_add,
5408 "+"),
5409 BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
5410 "-"),
5411 RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
5412 "-"),
5413 BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
5414 "*"),
5415 RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
5416 "*"),
5417 BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
5418 "%"),
5419 RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
5420 "%"),
5421 BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
5422 "divmod(x, y)"),
5423 RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
5424 "divmod(y, x)"),
5425 NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
5426 "x.__pow__(y[, z]) <==> pow(x, y[, z])"),
5427 NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
5428 "y.__rpow__(x[, z]) <==> pow(x, y[, z])"),
5429 UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-x"),
5430 UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+x"),
5431 UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
5432 "abs(x)"),
5433 UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
5434 "x != 0"),
5435 UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~x"),
5436 BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
5437 RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
5438 BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
5439 RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
5440 BINSLOT("__and__", nb_and, slot_nb_and, "&"),
5441 RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
5442 BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
5443 RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
5444 BINSLOT("__or__", nb_or, slot_nb_or, "|"),
5445 RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
5446 UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
5447 "int(x)"),
5448 UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
5449 "float(x)"),
5450 NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
5451 "x[y:z] <==> x[y.__index__():z.__index__()]"),
5452 IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
5453 wrap_binaryfunc, "+"),
5454 IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
5455 wrap_binaryfunc, "-"),
5456 IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
5457 wrap_binaryfunc, "*"),
5458 IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
5459 wrap_binaryfunc, "%"),
5460 IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
5461 wrap_binaryfunc, "**"),
5462 IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
5463 wrap_binaryfunc, "<<"),
5464 IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
5465 wrap_binaryfunc, ">>"),
5466 IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
5467 wrap_binaryfunc, "&"),
5468 IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
5469 wrap_binaryfunc, "^"),
5470 IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
5471 wrap_binaryfunc, "|"),
5472 BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5473 RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
5474 BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
5475 RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
5476 IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
5477 slot_nb_inplace_floor_divide, wrap_binaryfunc, "//"),
5478 IBSLOT("__itruediv__", nb_inplace_true_divide,
5479 slot_nb_inplace_true_divide, wrap_binaryfunc, "/"),
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005480
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005481 TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
5482 "x.__str__() <==> str(x)"),
5483 TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
5484 "x.__repr__() <==> repr(x)"),
5485 TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
5486 "x.__hash__() <==> hash(x)"),
5487 FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)wrap_call,
5488 "x.__call__(...) <==> x(...)", PyWrapperFlag_KEYWORDS),
5489 TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
5490 wrap_binaryfunc, "x.__getattribute__('name') <==> x.name"),
5491 TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
5492 TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
5493 TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
5494 TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
5495 "x.__setattr__('name', value) <==> x.name = value"),
5496 TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
5497 TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
5498 "x.__delattr__('name') <==> del x.name"),
5499 TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
5500 TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
5501 "x.__lt__(y) <==> x<y"),
5502 TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
5503 "x.__le__(y) <==> x<=y"),
5504 TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
5505 "x.__eq__(y) <==> x==y"),
5506 TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
5507 "x.__ne__(y) <==> x!=y"),
5508 TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
5509 "x.__gt__(y) <==> x>y"),
5510 TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
5511 "x.__ge__(y) <==> x>=y"),
5512 TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
5513 "x.__iter__() <==> iter(x)"),
5514 TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
5515 "x.__next__() <==> next(x)"),
5516 TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
5517 "descr.__get__(obj[, type]) -> value"),
5518 TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
5519 "descr.__set__(obj, value)"),
5520 TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
5521 wrap_descr_delete, "descr.__delete__(obj)"),
5522 FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)wrap_init,
5523 "x.__init__(...) initializes x; "
Alexander Belopolsky977a6842010-08-16 20:17:07 +00005524 "see help(type(x)) for signature",
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005525 PyWrapperFlag_KEYWORDS),
5526 TPSLOT("__new__", tp_new, slot_tp_new, NULL, ""),
5527 TPSLOT("__del__", tp_del, slot_tp_del, NULL, ""),
5528 {NULL}
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005529};
5530
Guido van Rossumc334df52002-04-04 23:44:47 +00005531/* Given a type pointer and an offset gotten from a slotdef entry, return a
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005532 pointer to the actual slot. This is not quite the same as simply adding
Guido van Rossumc334df52002-04-04 23:44:47 +00005533 the offset to the type pointer, since it takes care to indirect through the
5534 proper indirection pointer (as_buffer, etc.); it returns NULL if the
5535 indirection pointer is NULL. */
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005536static void **
Martin v. Löwis18e16552006-02-15 17:27:45 +00005537slotptr(PyTypeObject *type, int ioffset)
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005538{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005539 char *ptr;
5540 long offset = ioffset;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005541
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005542 /* Note: this depends on the order of the members of PyHeapTypeObject! */
5543 assert(offset >= 0);
5544 assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
5545 if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
5546 ptr = (char *)type->tp_as_sequence;
5547 offset -= offsetof(PyHeapTypeObject, as_sequence);
5548 }
5549 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
5550 ptr = (char *)type->tp_as_mapping;
5551 offset -= offsetof(PyHeapTypeObject, as_mapping);
5552 }
5553 else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
5554 ptr = (char *)type->tp_as_number;
5555 offset -= offsetof(PyHeapTypeObject, as_number);
5556 }
5557 else {
5558 ptr = (char *)type;
5559 }
5560 if (ptr != NULL)
5561 ptr += offset;
5562 return (void **)ptr;
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005563}
Guido van Rossumf040ede2001-08-07 16:40:56 +00005564
Guido van Rossumc334df52002-04-04 23:44:47 +00005565/* Length of array of slotdef pointers used to store slots with the
5566 same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
5567 the same __name__, for any __name__. Since that's a static property, it is
5568 appropriate to declare fixed-size arrays for this. */
5569#define MAX_EQUIV 10
5570
5571/* Return a slot pointer for a given name, but ONLY if the attribute has
5572 exactly one slot function. The name must be an interned string. */
5573static void **
5574resolve_slotdups(PyTypeObject *type, PyObject *name)
5575{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005576 /* XXX Maybe this could be optimized more -- but is it worth it? */
Guido van Rossumc334df52002-04-04 23:44:47 +00005577
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005578 /* pname and ptrs act as a little cache */
5579 static PyObject *pname;
5580 static slotdef *ptrs[MAX_EQUIV];
5581 slotdef *p, **pp;
5582 void **res, **ptr;
Guido van Rossumc334df52002-04-04 23:44:47 +00005583
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005584 if (pname != name) {
5585 /* Collect all slotdefs that match name into ptrs. */
5586 pname = name;
5587 pp = ptrs;
5588 for (p = slotdefs; p->name_strobj; p++) {
5589 if (p->name_strobj == name)
5590 *pp++ = p;
5591 }
5592 *pp = NULL;
5593 }
Guido van Rossumc334df52002-04-04 23:44:47 +00005594
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005595 /* Look in all matching slots of the type; if exactly one of these has
5596 a filled-in slot, return its value. Otherwise return NULL. */
5597 res = NULL;
5598 for (pp = ptrs; *pp; pp++) {
5599 ptr = slotptr(type, (*pp)->offset);
5600 if (ptr == NULL || *ptr == NULL)
5601 continue;
5602 if (res != NULL)
5603 return NULL;
5604 res = ptr;
5605 }
5606 return res;
Guido van Rossumc334df52002-04-04 23:44:47 +00005607}
5608
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005609/* Common code for update_slots_callback() and fixup_slot_dispatchers(). This
Guido van Rossumc334df52002-04-04 23:44:47 +00005610 does some incredibly complex thinking and then sticks something into the
5611 slot. (It sees if the adjacent slotdefs for the same slot have conflicting
5612 interests, and then stores a generic wrapper or a specific function into
5613 the slot.) Return a pointer to the next slotdef with a different offset,
5614 because that's convenient for fixup_slot_dispatchers(). */
5615static slotdef *
5616update_one_slot(PyTypeObject *type, slotdef *p)
5617{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005618 PyObject *descr;
5619 PyWrapperDescrObject *d;
5620 void *generic = NULL, *specific = NULL;
5621 int use_generic = 0;
5622 int offset = p->offset;
5623 void **ptr = slotptr(type, offset);
Guido van Rossumc334df52002-04-04 23:44:47 +00005624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005625 if (ptr == NULL) {
5626 do {
5627 ++p;
5628 } while (p->offset == offset);
5629 return p;
5630 }
5631 do {
5632 descr = _PyType_Lookup(type, p->name_strobj);
5633 if (descr == NULL) {
5634 if (ptr == (void**)&type->tp_iternext) {
5635 specific = _PyObject_NextNotImplemented;
5636 }
5637 continue;
5638 }
5639 if (Py_TYPE(descr) == &PyWrapperDescr_Type) {
5640 void **tptr = resolve_slotdups(type, p->name_strobj);
5641 if (tptr == NULL || tptr == ptr)
5642 generic = p->function;
5643 d = (PyWrapperDescrObject *)descr;
5644 if (d->d_base->wrapper == p->wrapper &&
5645 PyType_IsSubtype(type, PyDescr_TYPE(d)))
5646 {
5647 if (specific == NULL ||
5648 specific == d->d_wrapped)
5649 specific = d->d_wrapped;
5650 else
5651 use_generic = 1;
5652 }
5653 }
5654 else if (Py_TYPE(descr) == &PyCFunction_Type &&
5655 PyCFunction_GET_FUNCTION(descr) ==
5656 (PyCFunction)tp_new_wrapper &&
5657 ptr == (void**)&type->tp_new)
5658 {
5659 /* The __new__ wrapper is not a wrapper descriptor,
5660 so must be special-cased differently.
5661 If we don't do this, creating an instance will
5662 always use slot_tp_new which will look up
5663 __new__ in the MRO which will call tp_new_wrapper
5664 which will look through the base classes looking
5665 for a static base and call its tp_new (usually
5666 PyType_GenericNew), after performing various
5667 sanity checks and constructing a new argument
5668 list. Cut all that nonsense short -- this speeds
5669 up instance creation tremendously. */
5670 specific = (void *)type->tp_new;
5671 /* XXX I'm not 100% sure that there isn't a hole
5672 in this reasoning that requires additional
5673 sanity checks. I'll buy the first person to
5674 point out a bug in this reasoning a beer. */
5675 }
5676 else if (descr == Py_None &&
5677 ptr == (void**)&type->tp_hash) {
5678 /* We specifically allow __hash__ to be set to None
5679 to prevent inheritance of the default
5680 implementation from object.__hash__ */
5681 specific = PyObject_HashNotImplemented;
5682 }
5683 else {
5684 use_generic = 1;
5685 generic = p->function;
5686 }
5687 } while ((++p)->offset == offset);
5688 if (specific && !use_generic)
5689 *ptr = specific;
5690 else
5691 *ptr = generic;
5692 return p;
Guido van Rossumc334df52002-04-04 23:44:47 +00005693}
5694
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005695/* In the type, update the slots whose slotdefs are gathered in the pp array.
5696 This is a callback for update_subclasses(). */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005697static int
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005698update_slots_callback(PyTypeObject *type, void *data)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005699{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005700 slotdef **pp = (slotdef **)data;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005701
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005702 for (; *pp; pp++)
5703 update_one_slot(type, *pp);
5704 return 0;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005705}
5706
Guido van Rossumc334df52002-04-04 23:44:47 +00005707/* Comparison function for qsort() to compare slotdefs by their offset, and
5708 for equal offset by their address (to force a stable sort). */
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005709static int
5710slotdef_cmp(const void *aa, const void *bb)
5711{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005712 const slotdef *a = (const slotdef *)aa, *b = (const slotdef *)bb;
5713 int c = a->offset - b->offset;
5714 if (c != 0)
5715 return c;
5716 else
5717 /* Cannot use a-b, as this gives off_t,
5718 which may lose precision when converted to int. */
5719 return (a > b) ? 1 : (a < b) ? -1 : 0;
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005720}
5721
Guido van Rossumc334df52002-04-04 23:44:47 +00005722/* Initialize the slotdefs table by adding interned string objects for the
5723 names and sorting the entries. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005724static void
Guido van Rossumd396b9c2001-10-13 20:02:41 +00005725init_slotdefs(void)
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005726{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005727 slotdef *p;
5728 static int initialized = 0;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005729
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005730 if (initialized)
5731 return;
5732 for (p = slotdefs; p->name; p++) {
5733 p->name_strobj = PyUnicode_InternFromString(p->name);
5734 if (!p->name_strobj)
5735 Py_FatalError("Out of memory interning slotdef names");
5736 }
5737 qsort((void *)slotdefs, (size_t)(p-slotdefs), sizeof(slotdef),
5738 slotdef_cmp);
5739 initialized = 1;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005740}
5741
Guido van Rossumc334df52002-04-04 23:44:47 +00005742/* Update the slots after assignment to a class (type) attribute. */
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005743static int
5744update_slot(PyTypeObject *type, PyObject *name)
5745{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005746 slotdef *ptrs[MAX_EQUIV];
5747 slotdef *p;
5748 slotdef **pp;
5749 int offset;
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005750
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005751 /* Clear the VALID_VERSION flag of 'type' and all its
5752 subclasses. This could possibly be unified with the
5753 update_subclasses() recursion below, but carefully:
5754 they each have their own conditions on which to stop
5755 recursing into subclasses. */
5756 PyType_Modified(type);
Christian Heimesa62da1d2008-01-12 19:39:10 +00005757
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005758 init_slotdefs();
5759 pp = ptrs;
5760 for (p = slotdefs; p->name; p++) {
5761 /* XXX assume name is interned! */
5762 if (p->name_strobj == name)
5763 *pp++ = p;
5764 }
5765 *pp = NULL;
5766 for (pp = ptrs; *pp; pp++) {
5767 p = *pp;
5768 offset = p->offset;
5769 while (p > slotdefs && (p-1)->offset == offset)
5770 --p;
5771 *pp = p;
5772 }
5773 if (ptrs[0] == NULL)
5774 return 0; /* Not an attribute that affects any slots */
5775 return update_subclasses(type, name,
5776 update_slots_callback, (void *)ptrs);
Guido van Rossum875eeaa2001-10-11 18:33:53 +00005777}
5778
Guido van Rossumc334df52002-04-04 23:44:47 +00005779/* Store the proper functions in the slot dispatches at class (type)
5780 definition time, based upon which operations the class overrides in its
5781 dict. */
Tim Peters6d6c1a32001-08-02 04:15:00 +00005782static void
Guido van Rossum7b9144b2001-10-09 19:39:46 +00005783fixup_slot_dispatchers(PyTypeObject *type)
Tim Peters6d6c1a32001-08-02 04:15:00 +00005784{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005785 slotdef *p;
Tim Peters6d6c1a32001-08-02 04:15:00 +00005786
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005787 init_slotdefs();
5788 for (p = slotdefs; p->name; )
5789 p = update_one_slot(type, p);
Tim Peters6d6c1a32001-08-02 04:15:00 +00005790}
Guido van Rossum705f0f52001-08-24 16:47:00 +00005791
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005792static void
5793update_all_slots(PyTypeObject* type)
5794{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005795 slotdef *p;
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005796
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005797 init_slotdefs();
5798 for (p = slotdefs; p->name; p++) {
5799 /* update_slot returns int but can't actually fail */
5800 update_slot(type, p->name_strobj);
5801 }
Michael W. Hudson98bbc492002-11-26 14:47:27 +00005802}
5803
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005804/* recurse_down_subclasses() and update_subclasses() are mutually
5805 recursive functions to call a callback for all subclasses,
5806 but refraining from recursing into subclasses that define 'name'. */
5807
5808static int
5809update_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005810 update_callback callback, void *data)
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005811{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005812 if (callback(type, data) < 0)
5813 return -1;
5814 return recurse_down_subclasses(type, name, callback, data);
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005815}
5816
5817static int
5818recurse_down_subclasses(PyTypeObject *type, PyObject *name,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005819 update_callback callback, void *data)
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005820{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005821 PyTypeObject *subclass;
5822 PyObject *ref, *subclasses, *dict;
5823 Py_ssize_t i, n;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005824
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005825 subclasses = type->tp_subclasses;
5826 if (subclasses == NULL)
5827 return 0;
5828 assert(PyList_Check(subclasses));
5829 n = PyList_GET_SIZE(subclasses);
5830 for (i = 0; i < n; i++) {
5831 ref = PyList_GET_ITEM(subclasses, i);
5832 assert(PyWeakref_CheckRef(ref));
5833 subclass = (PyTypeObject *)PyWeakref_GET_OBJECT(ref);
5834 assert(subclass != NULL);
5835 if ((PyObject *)subclass == Py_None)
5836 continue;
5837 assert(PyType_Check(subclass));
5838 /* Avoid recursing down into unaffected classes */
5839 dict = subclass->tp_dict;
5840 if (dict != NULL && PyDict_Check(dict) &&
5841 PyDict_GetItem(dict, name) != NULL)
5842 continue;
5843 if (update_subclasses(subclass, name, callback, data) < 0)
5844 return -1;
5845 }
5846 return 0;
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005847}
5848
Guido van Rossum6d204072001-10-21 00:44:31 +00005849/* This function is called by PyType_Ready() to populate the type's
5850 dictionary with method descriptors for function slots. For each
Guido van Rossum09638c12002-06-13 19:17:46 +00005851 function slot (like tp_repr) that's defined in the type, one or more
5852 corresponding descriptors are added in the type's tp_dict dictionary
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005853 under the appropriate name (like __repr__). Some function slots
Guido van Rossum09638c12002-06-13 19:17:46 +00005854 cause more than one descriptor to be added (for example, the nb_add
5855 slot adds both __add__ and __radd__ descriptors) and some function
5856 slots compete for the same descriptor (for example both sq_item and
5857 mp_subscript generate a __getitem__ descriptor).
5858
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005859 In the latter case, the first slotdef entry encoutered wins. Since
Tim Petersbf9b2442003-03-23 05:35:36 +00005860 slotdef entries are sorted by the offset of the slot in the
Guido van Rossume5c691a2003-03-07 15:13:17 +00005861 PyHeapTypeObject, this gives us some control over disambiguating
Guido van Rossum8d24ee92003-03-24 23:49:49 +00005862 between competing slots: the members of PyHeapTypeObject are listed
5863 from most general to least general, so the most general slot is
5864 preferred. In particular, because as_mapping comes before as_sequence,
5865 for a type that defines both mp_subscript and sq_item, mp_subscript
5866 wins.
Guido van Rossum09638c12002-06-13 19:17:46 +00005867
5868 This only adds new descriptors and doesn't overwrite entries in
5869 tp_dict that were previously defined. The descriptors contain a
5870 reference to the C function they must call, so that it's safe if they
5871 are copied into a subtype's __dict__ and the subtype has a different
5872 C function in its slot -- calling the method defined by the
5873 descriptor will call the C function that was used to create it,
5874 rather than the C function present in the slot when it is called.
5875 (This is important because a subtype may have a C function in the
5876 slot that calls the method from the dictionary, and we want to avoid
5877 infinite recursion here.) */
Guido van Rossum6d204072001-10-21 00:44:31 +00005878
5879static int
5880add_operators(PyTypeObject *type)
5881{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005882 PyObject *dict = type->tp_dict;
5883 slotdef *p;
5884 PyObject *descr;
5885 void **ptr;
Guido van Rossum6d204072001-10-21 00:44:31 +00005886
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005887 init_slotdefs();
5888 for (p = slotdefs; p->name; p++) {
5889 if (p->wrapper == NULL)
5890 continue;
5891 ptr = slotptr(type, p->offset);
5892 if (!ptr || !*ptr)
5893 continue;
5894 if (PyDict_GetItem(dict, p->name_strobj))
5895 continue;
5896 if (*ptr == PyObject_HashNotImplemented) {
5897 /* Classes may prevent the inheritance of the tp_hash
5898 slot by storing PyObject_HashNotImplemented in it. Make it
5899 visible as a None value for the __hash__ attribute. */
5900 if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0)
5901 return -1;
5902 }
5903 else {
5904 descr = PyDescr_NewWrapper(type, p, *ptr);
5905 if (descr == NULL)
5906 return -1;
5907 if (PyDict_SetItem(dict, p->name_strobj, descr) < 0)
5908 return -1;
5909 Py_DECREF(descr);
5910 }
5911 }
5912 if (type->tp_new != NULL) {
5913 if (add_tp_new_wrapper(type) < 0)
5914 return -1;
5915 }
5916 return 0;
Guido van Rossum6d204072001-10-21 00:44:31 +00005917}
5918
Guido van Rossum705f0f52001-08-24 16:47:00 +00005919
5920/* Cooperative 'super' */
5921
5922typedef struct {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005923 PyObject_HEAD
5924 PyTypeObject *type;
5925 PyObject *obj;
5926 PyTypeObject *obj_type;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005927} superobject;
5928
Guido van Rossum6f799372001-09-20 20:46:19 +00005929static PyMemberDef super_members[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005930 {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
5931 "the class invoking super()"},
5932 {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
5933 "the instance invoking super(); may be None"},
5934 {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
5935 "the type of the instance invoking super(); may be None"},
5936 {0}
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005937};
5938
Guido van Rossum705f0f52001-08-24 16:47:00 +00005939static void
5940super_dealloc(PyObject *self)
5941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005942 superobject *su = (superobject *)self;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005943
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005944 _PyObject_GC_UNTRACK(self);
5945 Py_XDECREF(su->obj);
5946 Py_XDECREF(su->type);
5947 Py_XDECREF(su->obj_type);
5948 Py_TYPE(self)->tp_free(self);
Guido van Rossum705f0f52001-08-24 16:47:00 +00005949}
5950
5951static PyObject *
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005952super_repr(PyObject *self)
5953{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005954 superobject *su = (superobject *)self;
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005955
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005956 if (su->obj_type)
5957 return PyUnicode_FromFormat(
5958 "<super: <class '%s'>, <%s object>>",
5959 su->type ? su->type->tp_name : "NULL",
5960 su->obj_type->tp_name);
5961 else
5962 return PyUnicode_FromFormat(
5963 "<super: <class '%s'>, NULL>",
5964 su->type ? su->type->tp_name : "NULL");
Guido van Rossum41eb14d2001-08-30 23:13:11 +00005965}
5966
5967static PyObject *
Guido van Rossum705f0f52001-08-24 16:47:00 +00005968super_getattro(PyObject *self, PyObject *name)
5969{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005970 superobject *su = (superobject *)self;
5971 int skip = su->obj_type == NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005972
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005973 if (!skip) {
5974 /* We want __class__ to return the class of the super object
5975 (i.e. super, or a subclass), not the class of su->obj. */
5976 skip = (PyUnicode_Check(name) &&
5977 PyUnicode_GET_SIZE(name) == 9 &&
5978 PyUnicode_CompareWithASCIIString(name, "__class__") == 0);
5979 }
Guido van Rossum76ba09f2003-04-16 19:40:58 +00005980
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005981 if (!skip) {
5982 PyObject *mro, *res, *tmp, *dict;
5983 PyTypeObject *starttype;
5984 descrgetfunc f;
5985 Py_ssize_t i, n;
Guido van Rossum705f0f52001-08-24 16:47:00 +00005986
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005987 starttype = su->obj_type;
5988 mro = starttype->tp_mro;
Guido van Rossum155db9a2002-04-02 17:53:47 +00005989
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00005990 if (mro == NULL)
5991 n = 0;
5992 else {
5993 assert(PyTuple_Check(mro));
5994 n = PyTuple_GET_SIZE(mro);
5995 }
5996 for (i = 0; i < n; i++) {
5997 if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
5998 break;
5999 }
6000 i++;
6001 res = NULL;
6002 for (; i < n; i++) {
6003 tmp = PyTuple_GET_ITEM(mro, i);
6004 if (PyType_Check(tmp))
6005 dict = ((PyTypeObject *)tmp)->tp_dict;
6006 else
6007 continue;
6008 res = PyDict_GetItem(dict, name);
6009 if (res != NULL) {
6010 Py_INCREF(res);
6011 f = Py_TYPE(res)->tp_descr_get;
6012 if (f != NULL) {
6013 tmp = f(res,
6014 /* Only pass 'obj' param if
6015 this is instance-mode super
6016 (See SF ID #743627)
6017 */
6018 (su->obj == (PyObject *)
6019 su->obj_type
6020 ? (PyObject *)NULL
6021 : su->obj),
6022 (PyObject *)starttype);
6023 Py_DECREF(res);
6024 res = tmp;
6025 }
6026 return res;
6027 }
6028 }
6029 }
6030 return PyObject_GenericGetAttr(self, name);
Guido van Rossum705f0f52001-08-24 16:47:00 +00006031}
6032
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006033static PyTypeObject *
Guido van Rossum5b443c62001-12-03 15:38:28 +00006034supercheck(PyTypeObject *type, PyObject *obj)
6035{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006036 /* Check that a super() call makes sense. Return a type object.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006038 obj can be a new-style class, or an instance of one:
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006040 - If it is a class, it must be a subclass of 'type'. This case is
6041 used for class methods; the return value is obj.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006042
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006043 - If it is an instance, it must be an instance of 'type'. This is
6044 the normal case; the return value is obj.__class__.
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006046 But... when obj is an instance, we want to allow for the case where
6047 Py_TYPE(obj) is not a subclass of type, but obj.__class__ is!
6048 This will allow using super() with a proxy for obj.
6049 */
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006050
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006051 /* Check for first bullet above (special case) */
6052 if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
6053 Py_INCREF(obj);
6054 return (PyTypeObject *)obj;
6055 }
Guido van Rossum8e80a722003-02-18 19:22:22 +00006056
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006057 /* Normal case */
6058 if (PyType_IsSubtype(Py_TYPE(obj), type)) {
6059 Py_INCREF(Py_TYPE(obj));
6060 return Py_TYPE(obj);
6061 }
6062 else {
6063 /* Try the slow way */
6064 static PyObject *class_str = NULL;
6065 PyObject *class_attr;
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006066
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006067 if (class_str == NULL) {
6068 class_str = PyUnicode_FromString("__class__");
6069 if (class_str == NULL)
6070 return NULL;
6071 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006073 class_attr = PyObject_GetAttr(obj, class_str);
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006075 if (class_attr != NULL &&
6076 PyType_Check(class_attr) &&
6077 (PyTypeObject *)class_attr != Py_TYPE(obj))
6078 {
6079 int ok = PyType_IsSubtype(
6080 (PyTypeObject *)class_attr, type);
6081 if (ok)
6082 return (PyTypeObject *)class_attr;
6083 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006084
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006085 if (class_attr == NULL)
6086 PyErr_Clear();
6087 else
6088 Py_DECREF(class_attr);
6089 }
Guido van Rossuma89d10e2003-02-12 03:58:38 +00006090
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006091 PyErr_SetString(PyExc_TypeError,
6092 "super(type, obj): "
6093 "obj must be an instance or subtype of type");
6094 return NULL;
Guido van Rossum5b443c62001-12-03 15:38:28 +00006095}
6096
Guido van Rossum705f0f52001-08-24 16:47:00 +00006097static PyObject *
6098super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
6099{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006100 superobject *su = (superobject *)self;
6101 superobject *newobj;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006102
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006103 if (obj == NULL || obj == Py_None || su->obj != NULL) {
6104 /* Not binding to an object, or already bound */
6105 Py_INCREF(self);
6106 return self;
6107 }
6108 if (Py_TYPE(su) != &PySuper_Type)
6109 /* If su is an instance of a (strict) subclass of super,
6110 call its type */
6111 return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su),
6112 su->type, obj, NULL);
6113 else {
6114 /* Inline the common case */
6115 PyTypeObject *obj_type = supercheck(su->type, obj);
6116 if (obj_type == NULL)
6117 return NULL;
6118 newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
6119 NULL, NULL);
6120 if (newobj == NULL)
6121 return NULL;
6122 Py_INCREF(su->type);
6123 Py_INCREF(obj);
6124 newobj->type = su->type;
6125 newobj->obj = obj;
6126 newobj->obj_type = obj_type;
6127 return (PyObject *)newobj;
6128 }
Guido van Rossum705f0f52001-08-24 16:47:00 +00006129}
6130
6131static int
6132super_init(PyObject *self, PyObject *args, PyObject *kwds)
6133{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006134 superobject *su = (superobject *)self;
6135 PyTypeObject *type = NULL;
6136 PyObject *obj = NULL;
6137 PyTypeObject *obj_type = NULL;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006138
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006139 if (!_PyArg_NoKeywords("super", kwds))
6140 return -1;
6141 if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj))
6142 return -1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006143
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006144 if (type == NULL) {
6145 /* Call super(), without args -- fill in from __class__
6146 and first local variable on the stack. */
6147 PyFrameObject *f = PyThreadState_GET()->frame;
6148 PyCodeObject *co = f->f_code;
6149 int i, n;
6150 if (co == NULL) {
6151 PyErr_SetString(PyExc_SystemError,
6152 "super(): no code object");
6153 return -1;
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006154 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006155 if (co->co_argcount == 0) {
6156 PyErr_SetString(PyExc_SystemError,
6157 "super(): no arguments");
6158 return -1;
6159 }
6160 obj = f->f_localsplus[0];
6161 if (obj == NULL) {
6162 PyErr_SetString(PyExc_SystemError,
6163 "super(): arg[0] deleted");
6164 return -1;
6165 }
6166 if (co->co_freevars == NULL)
6167 n = 0;
6168 else {
6169 assert(PyTuple_Check(co->co_freevars));
6170 n = PyTuple_GET_SIZE(co->co_freevars);
6171 }
6172 for (i = 0; i < n; i++) {
6173 PyObject *name = PyTuple_GET_ITEM(co->co_freevars, i);
6174 assert(PyUnicode_Check(name));
6175 if (!PyUnicode_CompareWithASCIIString(name,
6176 "__class__")) {
6177 Py_ssize_t index = co->co_nlocals +
6178 PyTuple_GET_SIZE(co->co_cellvars) + i;
6179 PyObject *cell = f->f_localsplus[index];
6180 if (cell == NULL || !PyCell_Check(cell)) {
6181 PyErr_SetString(PyExc_SystemError,
6182 "super(): bad __class__ cell");
6183 return -1;
6184 }
6185 type = (PyTypeObject *) PyCell_GET(cell);
6186 if (type == NULL) {
6187 PyErr_SetString(PyExc_SystemError,
6188 "super(): empty __class__ cell");
6189 return -1;
6190 }
6191 if (!PyType_Check(type)) {
6192 PyErr_Format(PyExc_SystemError,
6193 "super(): __class__ is not a type (%s)",
6194 Py_TYPE(type)->tp_name);
6195 return -1;
6196 }
6197 break;
6198 }
6199 }
6200 if (type == NULL) {
6201 PyErr_SetString(PyExc_SystemError,
6202 "super(): __class__ cell not found");
6203 return -1;
6204 }
6205 }
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006206
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006207 if (obj == Py_None)
6208 obj = NULL;
6209 if (obj != NULL) {
6210 obj_type = supercheck(type, obj);
6211 if (obj_type == NULL)
6212 return -1;
6213 Py_INCREF(obj);
6214 }
6215 Py_INCREF(type);
6216 su->type = type;
6217 su->obj = obj;
6218 su->obj_type = obj_type;
6219 return 0;
Guido van Rossum705f0f52001-08-24 16:47:00 +00006220}
6221
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00006222PyDoc_STRVAR(super_doc,
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006223"super() -> same as super(__class__, <first argument>)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00006224"super(type) -> unbound super object\n"
6225"super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
Guido van Rossume705ef12001-08-29 15:47:06 +00006226"super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
Guido van Rossum705f0f52001-08-24 16:47:00 +00006227"Typical use to call a cooperative superclass method:\n"
6228"class C(B):\n"
6229" def meth(self, arg):\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006230" super().meth(arg)\n"
Guido van Rossumcd16bf62007-06-13 18:07:49 +00006231"This works for class methods too:\n"
6232"class C(B):\n"
6233" @classmethod\n"
6234" def cmeth(cls, arg):\n"
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006235" super().cmeth(arg)\n");
Guido van Rossum705f0f52001-08-24 16:47:00 +00006236
Guido van Rossum048eb752001-10-02 21:24:57 +00006237static int
6238super_traverse(PyObject *self, visitproc visit, void *arg)
6239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006240 superobject *su = (superobject *)self;
Guido van Rossum048eb752001-10-02 21:24:57 +00006241
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006242 Py_VISIT(su->obj);
6243 Py_VISIT(su->type);
6244 Py_VISIT(su->obj_type);
Guido van Rossum048eb752001-10-02 21:24:57 +00006245
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006246 return 0;
Guido van Rossum048eb752001-10-02 21:24:57 +00006247}
6248
Guido van Rossum705f0f52001-08-24 16:47:00 +00006249PyTypeObject PySuper_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00006250 PyVarObject_HEAD_INIT(&PyType_Type, 0)
6251 "super", /* tp_name */
6252 sizeof(superobject), /* tp_basicsize */
6253 0, /* tp_itemsize */
6254 /* methods */
6255 super_dealloc, /* tp_dealloc */
6256 0, /* tp_print */
6257 0, /* tp_getattr */
6258 0, /* tp_setattr */
6259 0, /* tp_reserved */
6260 super_repr, /* tp_repr */
6261 0, /* tp_as_number */
6262 0, /* tp_as_sequence */
6263 0, /* tp_as_mapping */
6264 0, /* tp_hash */
6265 0, /* tp_call */
6266 0, /* tp_str */
6267 super_getattro, /* tp_getattro */
6268 0, /* tp_setattro */
6269 0, /* tp_as_buffer */
6270 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
6271 Py_TPFLAGS_BASETYPE, /* tp_flags */
6272 super_doc, /* tp_doc */
6273 super_traverse, /* tp_traverse */
6274 0, /* tp_clear */
6275 0, /* tp_richcompare */
6276 0, /* tp_weaklistoffset */
6277 0, /* tp_iter */
6278 0, /* tp_iternext */
6279 0, /* tp_methods */
6280 super_members, /* tp_members */
6281 0, /* tp_getset */
6282 0, /* tp_base */
6283 0, /* tp_dict */
6284 super_descr_get, /* tp_descr_get */
6285 0, /* tp_descr_set */
6286 0, /* tp_dictoffset */
6287 super_init, /* tp_init */
6288 PyType_GenericAlloc, /* tp_alloc */
6289 PyType_GenericNew, /* tp_new */
6290 PyObject_GC_Del, /* tp_free */
Guido van Rossum705f0f52001-08-24 16:47:00 +00006291};