Branch data Line data Source code
1 : : /* Type object implementation */
2 : :
3 : : #include "Python.h"
4 : : #include "pycore_call.h"
5 : : #include "pycore_code.h" // CO_FAST_FREE
6 : : #include "pycore_compile.h" // _Py_Mangle()
7 : : #include "pycore_initconfig.h" // _PyStatus_OK()
8 : : #include "pycore_moduleobject.h" // _PyModule_GetDef()
9 : : #include "pycore_object.h" // _PyType_HasFeature()
10 : : #include "pycore_pyerrors.h" // _PyErr_Occurred()
11 : : #include "pycore_pystate.h" // _PyThreadState_GET()
12 : : #include "pycore_typeobject.h" // struct type_cache
13 : : #include "pycore_unionobject.h" // _Py_union_type_or
14 : : #include "pycore_frame.h" // _PyInterpreterFrame
15 : : #include "opcode.h" // MAKE_CELL
16 : : #include "structmember.h" // PyMemberDef
17 : :
18 : : #include <ctype.h>
19 : :
20 : : /*[clinic input]
21 : : class type "PyTypeObject *" "&PyType_Type"
22 : : class object "PyObject *" "&PyBaseObject_Type"
23 : : [clinic start generated code]*/
24 : : /*[clinic end generated code: output=da39a3ee5e6b4b0d input=4b94608d231c434b]*/
25 : :
26 : : #include "clinic/typeobject.c.h"
27 : :
28 : : /* Support type attribute lookup cache */
29 : :
30 : : /* The cache can keep references to the names alive for longer than
31 : : they normally would. This is why the maximum size is limited to
32 : : MCACHE_MAX_ATTR_SIZE, since it might be a problem if very large
33 : : strings are used as attribute names. */
34 : : #define MCACHE_MAX_ATTR_SIZE 100
35 : : #define MCACHE_HASH(version, name_hash) \
36 : : (((unsigned int)(version) ^ (unsigned int)(name_hash)) \
37 : : & ((1 << MCACHE_SIZE_EXP) - 1))
38 : :
39 : : #define MCACHE_HASH_METHOD(type, name) \
40 : : MCACHE_HASH((type)->tp_version_tag, ((Py_ssize_t)(name)) >> 3)
41 : : #define MCACHE_CACHEABLE_NAME(name) \
42 : : PyUnicode_CheckExact(name) && \
43 : : PyUnicode_IS_READY(name) && \
44 : : (PyUnicode_GET_LENGTH(name) <= MCACHE_MAX_ATTR_SIZE)
45 : :
46 : : // bpo-42745: next_version_tag remains shared by all interpreters because of static types
47 : : // Used to set PyTypeObject.tp_version_tag
48 : : static unsigned int next_version_tag = 1;
49 : :
50 : : typedef struct PySlot_Offset {
51 : : short subslot_offset;
52 : : short slot_offset;
53 : : } PySlot_Offset;
54 : :
55 : :
56 : : static PyObject *
57 : : slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
58 : :
59 : : static void
60 : : clear_slotdefs(void);
61 : :
62 : : static PyObject *
63 : : lookup_maybe_method(PyObject *self, PyObject *attr, int *unbound);
64 : :
65 : : static int
66 : : slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value);
67 : :
68 : : /*
69 : : * finds the beginning of the docstring's introspection signature.
70 : : * if present, returns a pointer pointing to the first '('.
71 : : * otherwise returns NULL.
72 : : *
73 : : * doesn't guarantee that the signature is valid, only that it
74 : : * has a valid prefix. (the signature must also pass skip_signature.)
75 : : */
76 : : static const char *
77 : 663554 : find_signature(const char *name, const char *doc)
78 : : {
79 : : const char *dot;
80 : : size_t length;
81 : :
82 [ + + ]: 663554 : if (!doc)
83 : 243 : return NULL;
84 : :
85 : : assert(name != NULL);
86 : :
87 : : /* for dotted names like classes, only use the last component */
88 : 663311 : dot = strrchr(name, '.');
89 [ + + ]: 663311 : if (dot)
90 : 342632 : name = dot + 1;
91 : :
92 : 663311 : length = strlen(name);
93 [ + + ]: 663311 : if (strncmp(doc, name, length))
94 : 398068 : return NULL;
95 : 265243 : doc += length;
96 [ + + ]: 265243 : if (*doc != '(')
97 : 48166 : return NULL;
98 : 217077 : return doc;
99 : : }
100 : :
101 : : #define SIGNATURE_END_MARKER ")\n--\n\n"
102 : : #define SIGNATURE_END_MARKER_LENGTH 6
103 : : /*
104 : : * skips past the end of the docstring's introspection signature.
105 : : * (assumes doc starts with a valid signature prefix.)
106 : : */
107 : : static const char *
108 : 217077 : skip_signature(const char *doc)
109 : : {
110 [ + + ]: 12047369 : while (*doc) {
111 [ + + ]: 12033066 : if ((*doc == *SIGNATURE_END_MARKER) &&
112 [ + + ]: 331893 : !strncmp(doc, SIGNATURE_END_MARKER, SIGNATURE_END_MARKER_LENGTH))
113 : 129168 : return doc + SIGNATURE_END_MARKER_LENGTH;
114 [ + + + + ]: 11903898 : if ((*doc == '\n') && (doc[1] == '\n'))
115 : 73606 : return NULL;
116 : 11830292 : doc++;
117 : : }
118 : 14303 : return NULL;
119 : : }
120 : :
121 : : int
122 : 0 : _PyType_CheckConsistency(PyTypeObject *type)
123 : : {
124 : : #define CHECK(expr) \
125 : : do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG((PyObject *)type, Py_STRINGIFY(expr)); } } while (0)
126 : :
127 [ # # ]: 0 : CHECK(!_PyObject_IsFreed((PyObject *)type));
128 : :
129 [ # # ]: 0 : if (!(type->tp_flags & Py_TPFLAGS_READY)) {
130 : : /* don't check static types before PyType_Ready() */
131 : 0 : return 1;
132 : : }
133 : :
134 [ # # ]: 0 : CHECK(Py_REFCNT(type) >= 1);
135 [ # # ]: 0 : CHECK(PyType_Check(type));
136 : :
137 [ # # ]: 0 : CHECK(!(type->tp_flags & Py_TPFLAGS_READYING));
138 [ # # ]: 0 : CHECK(type->tp_dict != NULL);
139 : :
140 [ # # ]: 0 : if (type->tp_flags & Py_TPFLAGS_HAVE_GC) {
141 : : // bpo-44263: tp_traverse is required if Py_TPFLAGS_HAVE_GC is set.
142 : : // Note: tp_clear is optional.
143 [ # # ]: 0 : CHECK(type->tp_traverse != NULL);
144 : : }
145 : :
146 [ # # ]: 0 : if (type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION) {
147 [ # # ]: 0 : CHECK(type->tp_new == NULL);
148 [ # # ]: 0 : CHECK(PyDict_Contains(type->tp_dict, &_Py_ID(__new__)) == 0);
149 : : }
150 : :
151 : 0 : return 1;
152 : : #undef CHECK
153 : : }
154 : :
155 : : static const char *
156 : 661366 : _PyType_DocWithoutSignature(const char *name, const char *internal_doc)
157 : : {
158 : 661366 : const char *doc = find_signature(name, internal_doc);
159 : :
160 [ + + ]: 661366 : if (doc) {
161 : 215055 : doc = skip_signature(doc);
162 [ + + ]: 215055 : if (doc)
163 : 127286 : return doc;
164 : : }
165 : 534080 : return internal_doc;
166 : : }
167 : :
168 : : PyObject *
169 : 74063 : _PyType_GetDocFromInternalDoc(const char *name, const char *internal_doc)
170 : : {
171 : 74063 : const char *doc = _PyType_DocWithoutSignature(name, internal_doc);
172 : :
173 [ + + + + ]: 74063 : if (!doc || *doc == '\0') {
174 : 316 : Py_RETURN_NONE;
175 : : }
176 : :
177 : 73747 : return PyUnicode_FromString(doc);
178 : : }
179 : :
180 : : PyObject *
181 : 2188 : _PyType_GetTextSignatureFromInternalDoc(const char *name, const char *internal_doc)
182 : : {
183 : 2188 : const char *start = find_signature(name, internal_doc);
184 : : const char *end;
185 : :
186 [ + + ]: 2188 : if (start)
187 : 2022 : end = skip_signature(start);
188 : : else
189 : 166 : end = NULL;
190 [ + + ]: 2188 : if (!end) {
191 : 306 : Py_RETURN_NONE;
192 : : }
193 : :
194 : : /* back "end" up until it points just past the final ')' */
195 : 1882 : end -= SIGNATURE_END_MARKER_LENGTH - 1;
196 : : assert((end - start) >= 2); /* should be "()" at least */
197 : : assert(end[-1] == ')');
198 : : assert(end[0] == '\n');
199 : 1882 : return PyUnicode_FromStringAndSize(start, end - start);
200 : : }
201 : :
202 : :
203 : : static struct type_cache*
204 : 449312092 : get_type_cache(void)
205 : : {
206 : 449312092 : PyInterpreterState *interp = _PyInterpreterState_GET();
207 : 449312092 : return &interp->type_cache;
208 : : }
209 : :
210 : :
211 : : static void
212 : 3156 : type_cache_clear(struct type_cache *cache, PyObject *value)
213 : : {
214 [ + + ]: 12930132 : for (Py_ssize_t i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
215 : 12926976 : struct type_cache_entry *entry = &cache->hashtable[i];
216 : 12926976 : entry->version = 0;
217 : 12926976 : Py_XSETREF(entry->name, _Py_XNewRef(value));
218 : 12926976 : entry->value = NULL;
219 : : }
220 : 3156 : }
221 : :
222 : :
223 : : void
224 : 3138 : _PyType_InitCache(PyInterpreterState *interp)
225 : : {
226 : 3138 : struct type_cache *cache = &interp->type_cache;
227 [ + + ]: 12856386 : for (Py_ssize_t i = 0; i < (1 << MCACHE_SIZE_EXP); i++) {
228 : 12853248 : struct type_cache_entry *entry = &cache->hashtable[i];
229 : : assert(entry->name == NULL);
230 : :
231 : 12853248 : entry->version = 0;
232 : : // Set to None so _PyType_Lookup() can use Py_SETREF(),
233 : : // rather than using slower Py_XSETREF().
234 : 12853248 : entry->name = Py_NewRef(Py_None);
235 : 12853248 : entry->value = NULL;
236 : : }
237 : 3138 : }
238 : :
239 : :
240 : : static unsigned int
241 : 31 : _PyType_ClearCache(PyInterpreterState *interp)
242 : : {
243 : 31 : struct type_cache *cache = &interp->type_cache;
244 : : #if MCACHE_STATS
245 : : size_t total = cache->hits + cache->collisions + cache->misses;
246 : : fprintf(stderr, "-- Method cache hits = %zd (%d%%)\n",
247 : : cache->hits, (int) (100.0 * cache->hits / total));
248 : : fprintf(stderr, "-- Method cache true misses = %zd (%d%%)\n",
249 : : cache->misses, (int) (100.0 * cache->misses / total));
250 : : fprintf(stderr, "-- Method cache collisions = %zd (%d%%)\n",
251 : : cache->collisions, (int) (100.0 * cache->collisions / total));
252 : : fprintf(stderr, "-- Method cache size = %zd KiB\n",
253 : : sizeof(cache->hashtable) / 1024);
254 : : #endif
255 : :
256 : : // Set to None, rather than NULL, so _PyType_Lookup() can
257 : : // use Py_SETREF() rather than using slower Py_XSETREF().
258 : 31 : type_cache_clear(cache, Py_None);
259 : :
260 : 31 : return next_version_tag - 1;
261 : : }
262 : :
263 : :
264 : : unsigned int
265 : 31 : PyType_ClearCache(void)
266 : : {
267 : 31 : PyInterpreterState *interp = _PyInterpreterState_GET();
268 : 31 : return _PyType_ClearCache(interp);
269 : : }
270 : :
271 : :
272 : : void
273 : 3125 : _PyTypes_Fini(PyInterpreterState *interp)
274 : : {
275 : 3125 : struct type_cache *cache = &interp->type_cache;
276 : 3125 : type_cache_clear(cache, NULL);
277 [ + + ]: 3125 : if (_Py_IsMainInterpreter(interp)) {
278 : 2956 : clear_slotdefs();
279 : : }
280 : 3125 : }
281 : :
282 : :
283 : : void
284 : 13486479 : PyType_Modified(PyTypeObject *type)
285 : : {
286 : : /* Invalidate any cached data for the specified type and all
287 : : subclasses. This function is called after the base
288 : : classes, mro, or attributes of the type are altered.
289 : :
290 : : Invariants:
291 : :
292 : : - before Py_TPFLAGS_VALID_VERSION_TAG can be set on a type,
293 : : it must first be set on all super types.
294 : :
295 : : This function clears the Py_TPFLAGS_VALID_VERSION_TAG of a
296 : : type (so it must first clear it on all subclasses). The
297 : : tp_version_tag value is meaningless unless this flag is set.
298 : : We don't assign new version tags eagerly, but only as
299 : : needed.
300 : : */
301 [ + + ]: 13486479 : if (!_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) {
302 : 4013300 : return;
303 : : }
304 : :
305 : 9473179 : PyObject *subclasses = type->tp_subclasses;
306 [ + + ]: 9473179 : if (subclasses != NULL) {
307 : : assert(PyDict_CheckExact(subclasses));
308 : :
309 : 131658 : Py_ssize_t i = 0;
310 : : PyObject *ref;
311 [ + + ]: 486925 : while (PyDict_Next(subclasses, &i, NULL, &ref)) {
312 : : assert(PyWeakref_CheckRef(ref));
313 : 355267 : PyObject *obj = PyWeakref_GET_OBJECT(ref);
314 [ + + ]: 355267 : if (obj == Py_None) {
315 : 351398 : continue;
316 : : }
317 : 3869 : PyType_Modified(_PyType_CAST(obj));
318 : : }
319 : : }
320 : :
321 : 9473179 : type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
322 : 9473179 : type->tp_version_tag = 0; /* 0 is not a valid version tag */
323 : : }
324 : :
325 : : static void
326 : 4011956 : type_mro_modified(PyTypeObject *type, PyObject *bases) {
327 : : /*
328 : : Check that all base classes or elements of the MRO of type are
329 : : able to be cached. This function is called after the base
330 : : classes or mro of the type are altered.
331 : :
332 : : Unset HAVE_VERSION_TAG and VALID_VERSION_TAG if the type
333 : : has a custom MRO that includes a type which is not officially
334 : : super type, or if the type implements its own mro() method.
335 : :
336 : : Called from mro_internal, which will subsequently be called on
337 : : each subclass when their mro is recursively updated.
338 : : */
339 : : Py_ssize_t i, n;
340 : 4011956 : int custom = !Py_IS_TYPE(type, &PyType_Type);
341 : : int unbound;
342 : :
343 [ + + ]: 4011956 : if (custom) {
344 : : PyObject *mro_meth, *type_mro_meth;
345 : 480818 : mro_meth = lookup_maybe_method(
346 : : (PyObject *)type, &_Py_ID(mro), &unbound);
347 [ - + ]: 480818 : if (mro_meth == NULL) {
348 : 0 : goto clear;
349 : : }
350 : 480818 : type_mro_meth = lookup_maybe_method(
351 : : (PyObject *)&PyType_Type, &_Py_ID(mro), &unbound);
352 [ - + ]: 480818 : if (type_mro_meth == NULL) {
353 : 0 : Py_DECREF(mro_meth);
354 : 0 : goto clear;
355 : : }
356 : 480818 : int custom_mro = (mro_meth != type_mro_meth);
357 : 480818 : Py_DECREF(mro_meth);
358 : 480818 : Py_DECREF(type_mro_meth);
359 [ + + ]: 480818 : if (custom_mro) {
360 : 86 : goto clear;
361 : : }
362 : : }
363 : 4011870 : n = PyTuple_GET_SIZE(bases);
364 [ + + ]: 12791670 : for (i = 0; i < n; i++) {
365 : 8779801 : PyObject *b = PyTuple_GET_ITEM(bases, i);
366 : 8779801 : PyTypeObject *cls = _PyType_CAST(b);
367 : :
368 [ + + ]: 8779801 : if (!PyType_IsSubtype(type, cls)) {
369 : 1 : goto clear;
370 : : }
371 : : }
372 : 4011869 : return;
373 : 87 : clear:
374 : 87 : type->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
375 : 87 : type->tp_version_tag = 0; /* 0 is not a valid version tag */
376 : : }
377 : :
378 : : static int
379 : 52416362 : assign_version_tag(struct type_cache *cache, PyTypeObject *type)
380 : : {
381 : : /* Ensure that the tp_version_tag is valid and set
382 : : Py_TPFLAGS_VALID_VERSION_TAG. To respect the invariant, this
383 : : must first be done on all super classes. Return 0 if this
384 : : cannot be done, 1 if Py_TPFLAGS_VALID_VERSION_TAG.
385 : : */
386 [ + + ]: 52416362 : if (_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG)) {
387 : 42762187 : return 1;
388 : : }
389 [ - + ]: 9654175 : if (!_PyType_HasFeature(type, Py_TPFLAGS_READY)) {
390 : 0 : return 0;
391 : : }
392 : :
393 [ - + ]: 9654175 : if (next_version_tag == 0) {
394 : : /* We have run out of version numbers */
395 : 0 : return 0;
396 : : }
397 : 9654175 : type->tp_version_tag = next_version_tag++;
398 : : assert (type->tp_version_tag != 0);
399 : :
400 : 9654175 : PyObject *bases = type->tp_bases;
401 : 9654175 : Py_ssize_t n = PyTuple_GET_SIZE(bases);
402 [ + + ]: 19451812 : for (Py_ssize_t i = 0; i < n; i++) {
403 : 9797637 : PyObject *b = PyTuple_GET_ITEM(bases, i);
404 [ - + ]: 9797637 : if (!assign_version_tag(cache, _PyType_CAST(b)))
405 : 0 : return 0;
406 : : }
407 : 9654175 : type->tp_flags |= Py_TPFLAGS_VALID_VERSION_TAG;
408 : 9654175 : return 1;
409 : : }
410 : :
411 : :
412 : : static PyMemberDef type_members[] = {
413 : : {"__basicsize__", T_PYSSIZET, offsetof(PyTypeObject,tp_basicsize),READONLY},
414 : : {"__itemsize__", T_PYSSIZET, offsetof(PyTypeObject, tp_itemsize), READONLY},
415 : : {"__flags__", T_ULONG, offsetof(PyTypeObject, tp_flags), READONLY},
416 : : {"__weakrefoffset__", T_PYSSIZET,
417 : : offsetof(PyTypeObject, tp_weaklistoffset), READONLY},
418 : : {"__base__", T_OBJECT, offsetof(PyTypeObject, tp_base), READONLY},
419 : : {"__dictoffset__", T_PYSSIZET,
420 : : offsetof(PyTypeObject, tp_dictoffset), READONLY},
421 : : {"__mro__", T_OBJECT, offsetof(PyTypeObject, tp_mro), READONLY},
422 : : {0}
423 : : };
424 : :
425 : : static int
426 : 89630 : check_set_special_type_attr(PyTypeObject *type, PyObject *value, const char *name)
427 : : {
428 [ + + ]: 89630 : if (_PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE)) {
429 : 2 : PyErr_Format(PyExc_TypeError,
430 : : "cannot set '%s' attribute of immutable type '%s'",
431 : : name, type->tp_name);
432 : 2 : return 0;
433 : : }
434 [ + + ]: 89628 : if (!value) {
435 : 3 : PyErr_Format(PyExc_TypeError,
436 : : "cannot delete '%s' attribute of immutable type '%s'",
437 : : name, type->tp_name);
438 : 3 : return 0;
439 : : }
440 : :
441 [ - + ]: 89625 : if (PySys_Audit("object.__setattr__", "OsO",
442 : : type, name, value) < 0) {
443 : 0 : return 0;
444 : : }
445 : :
446 : 89625 : return 1;
447 : : }
448 : :
449 : : const char *
450 : 927769 : _PyType_Name(PyTypeObject *type)
451 : : {
452 : : assert(type->tp_name != NULL);
453 : 927769 : const char *s = strrchr(type->tp_name, '.');
454 [ + + ]: 927769 : if (s == NULL) {
455 : 668735 : s = type->tp_name;
456 : : }
457 : : else {
458 : 259034 : s++;
459 : : }
460 : 927769 : return s;
461 : : }
462 : :
463 : : static PyObject *
464 : 3336283 : type_name(PyTypeObject *type, void *context)
465 : : {
466 [ + + ]: 3336283 : if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
467 : 2639522 : PyHeapTypeObject* et = (PyHeapTypeObject*)type;
468 : :
469 : 2639522 : Py_INCREF(et->ht_name);
470 : 2639522 : return et->ht_name;
471 : : }
472 : : else {
473 : 696761 : return PyUnicode_FromString(_PyType_Name(type));
474 : : }
475 : : }
476 : :
477 : : static PyObject *
478 : 660915 : type_qualname(PyTypeObject *type, void *context)
479 : : {
480 [ + + ]: 660915 : if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
481 : 585648 : PyHeapTypeObject* et = (PyHeapTypeObject*)type;
482 : 585648 : Py_INCREF(et->ht_qualname);
483 : 585648 : return et->ht_qualname;
484 : : }
485 : : else {
486 : 75267 : return PyUnicode_FromString(_PyType_Name(type));
487 : : }
488 : : }
489 : :
490 : : static int
491 : 18544 : type_set_name(PyTypeObject *type, PyObject *value, void *context)
492 : : {
493 : : const char *tp_name;
494 : : Py_ssize_t name_size;
495 : :
496 [ - + ]: 18544 : if (!check_set_special_type_attr(type, value, "__name__"))
497 : 0 : return -1;
498 [ + + ]: 18544 : if (!PyUnicode_Check(value)) {
499 : 1 : PyErr_Format(PyExc_TypeError,
500 : : "can only assign string to %s.__name__, not '%s'",
501 : 1 : type->tp_name, Py_TYPE(value)->tp_name);
502 : 1 : return -1;
503 : : }
504 : :
505 : 18543 : tp_name = PyUnicode_AsUTF8AndSize(value, &name_size);
506 [ + + ]: 18543 : if (tp_name == NULL)
507 : 1 : return -1;
508 [ + + ]: 18542 : if (strlen(tp_name) != (size_t)name_size) {
509 : 1 : PyErr_SetString(PyExc_ValueError,
510 : : "type name must not contain null characters");
511 : 1 : return -1;
512 : : }
513 : :
514 : 18541 : type->tp_name = tp_name;
515 : 18541 : Py_INCREF(value);
516 : 18541 : Py_SETREF(((PyHeapTypeObject*)type)->ht_name, value);
517 : :
518 : 18541 : return 0;
519 : : }
520 : :
521 : : static int
522 : 17414 : type_set_qualname(PyTypeObject *type, PyObject *value, void *context)
523 : : {
524 : : PyHeapTypeObject* et;
525 : :
526 [ + + ]: 17414 : if (!check_set_special_type_attr(type, value, "__qualname__"))
527 : 2 : return -1;
528 [ + + ]: 17412 : if (!PyUnicode_Check(value)) {
529 : 1 : PyErr_Format(PyExc_TypeError,
530 : : "can only assign string to %s.__qualname__, not '%s'",
531 : 1 : type->tp_name, Py_TYPE(value)->tp_name);
532 : 1 : return -1;
533 : : }
534 : :
535 : 17411 : et = (PyHeapTypeObject*)type;
536 : 17411 : Py_INCREF(value);
537 : 17411 : Py_SETREF(et->ht_qualname, value);
538 : 17411 : return 0;
539 : : }
540 : :
541 : : static PyObject *
542 : 678559 : type_module(PyTypeObject *type, void *context)
543 : : {
544 : : PyObject *mod;
545 : :
546 [ + + ]: 678559 : if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
547 : 596929 : mod = PyDict_GetItemWithError(type->tp_dict, &_Py_ID(__module__));
548 [ - + ]: 596929 : if (mod == NULL) {
549 [ # # ]: 0 : if (!PyErr_Occurred()) {
550 : 0 : PyErr_Format(PyExc_AttributeError, "__module__");
551 : : }
552 : 0 : return NULL;
553 : : }
554 : 596929 : Py_INCREF(mod);
555 : : }
556 : : else {
557 : 81630 : const char *s = strrchr(type->tp_name, '.');
558 [ + + ]: 81630 : if (s != NULL) {
559 : 121834 : mod = PyUnicode_FromStringAndSize(
560 : 60917 : type->tp_name, (Py_ssize_t)(s - type->tp_name));
561 [ + - ]: 60917 : if (mod != NULL)
562 : 60917 : PyUnicode_InternInPlace(&mod);
563 : : }
564 : : else {
565 : 20713 : mod = &_Py_ID(builtins);
566 : 20713 : Py_INCREF(mod);
567 : : }
568 : : }
569 : 678559 : return mod;
570 : : }
571 : :
572 : : static int
573 : 48797 : type_set_module(PyTypeObject *type, PyObject *value, void *context)
574 : : {
575 [ - + ]: 48797 : if (!check_set_special_type_attr(type, value, "__module__"))
576 : 0 : return -1;
577 : :
578 : 48797 : PyType_Modified(type);
579 : :
580 : 48797 : return PyDict_SetItem(type->tp_dict, &_Py_ID(__module__), value);
581 : : }
582 : :
583 : : static PyObject *
584 : 219209 : type_abstractmethods(PyTypeObject *type, void *context)
585 : : {
586 : 219209 : PyObject *mod = NULL;
587 : : /* type itself has an __abstractmethods__ descriptor (this). Don't return
588 : : that. */
589 [ + + ]: 219209 : if (type != &PyType_Type)
590 : 219203 : mod = PyDict_GetItemWithError(type->tp_dict,
591 : : &_Py_ID(__abstractmethods__));
592 [ + + ]: 219209 : if (!mod) {
593 [ + - ]: 55173 : if (!PyErr_Occurred()) {
594 : 55173 : PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__abstractmethods__));
595 : : }
596 : 55173 : return NULL;
597 : : }
598 : 164036 : Py_INCREF(mod);
599 : 164036 : return mod;
600 : : }
601 : :
602 : : static int
603 : 175640 : type_set_abstractmethods(PyTypeObject *type, PyObject *value, void *context)
604 : : {
605 : : /* __abstractmethods__ should only be set once on a type, in
606 : : abc.ABCMeta.__new__, so this function doesn't do anything
607 : : special to update subclasses.
608 : : */
609 : : int abstract, res;
610 [ + + ]: 175640 : if (value != NULL) {
611 : 175639 : abstract = PyObject_IsTrue(value);
612 [ - + ]: 175639 : if (abstract < 0)
613 : 0 : return -1;
614 : 175639 : res = PyDict_SetItem(type->tp_dict, &_Py_ID(__abstractmethods__), value);
615 : : }
616 : : else {
617 : 1 : abstract = 0;
618 : 1 : res = PyDict_DelItem(type->tp_dict, &_Py_ID(__abstractmethods__));
619 [ + - + - ]: 1 : if (res && PyErr_ExceptionMatches(PyExc_KeyError)) {
620 : 1 : PyErr_SetObject(PyExc_AttributeError, &_Py_ID(__abstractmethods__));
621 : 1 : return -1;
622 : : }
623 : : }
624 [ + - ]: 175639 : if (res == 0) {
625 : 175639 : PyType_Modified(type);
626 [ + + ]: 175639 : if (abstract)
627 : 81580 : type->tp_flags |= Py_TPFLAGS_IS_ABSTRACT;
628 : : else
629 : 94059 : type->tp_flags &= ~Py_TPFLAGS_IS_ABSTRACT;
630 : : }
631 : 175639 : return res;
632 : : }
633 : :
634 : : static PyObject *
635 : 263504 : type_get_bases(PyTypeObject *type, void *context)
636 : : {
637 : 263504 : Py_INCREF(type->tp_bases);
638 : 263504 : return type->tp_bases;
639 : : }
640 : :
641 : : static PyTypeObject *best_base(PyObject *);
642 : : static int mro_internal(PyTypeObject *, PyObject **);
643 : : static int type_is_subtype_base_chain(PyTypeObject *, PyTypeObject *);
644 : : static int compatible_for_assignment(PyTypeObject *, PyTypeObject *, const char *);
645 : : static int add_subclass(PyTypeObject*, PyTypeObject*);
646 : : static int add_all_subclasses(PyTypeObject *type, PyObject *bases);
647 : : static void remove_subclass(PyTypeObject *, PyTypeObject *);
648 : : static void remove_all_subclasses(PyTypeObject *type, PyObject *bases);
649 : : static void update_all_slots(PyTypeObject *);
650 : :
651 : : typedef int (*update_callback)(PyTypeObject *, void *);
652 : : static int update_subclasses(PyTypeObject *type, PyObject *attr_name,
653 : : update_callback callback, void *data);
654 : : static int recurse_down_subclasses(PyTypeObject *type, PyObject *name,
655 : : update_callback callback, void *data);
656 : :
657 : : static int
658 : 720 : mro_hierarchy(PyTypeObject *type, PyObject *temp)
659 : : {
660 : : PyObject *old_mro;
661 : 720 : int res = mro_internal(type, &old_mro);
662 [ + + ]: 720 : if (res <= 0) {
663 : : /* error / reentrance */
664 : 21 : return res;
665 : : }
666 : 699 : PyObject *new_mro = type->tp_mro;
667 : :
668 : : PyObject *tuple;
669 [ + + ]: 699 : if (old_mro != NULL) {
670 : 698 : tuple = PyTuple_Pack(3, type, new_mro, old_mro);
671 : : }
672 : : else {
673 : 1 : tuple = PyTuple_Pack(2, type, new_mro);
674 : : }
675 : :
676 [ + - ]: 699 : if (tuple != NULL) {
677 : 699 : res = PyList_Append(temp, tuple);
678 : : }
679 : : else {
680 : 0 : res = -1;
681 : : }
682 : 699 : Py_XDECREF(tuple);
683 : :
684 [ - + ]: 699 : if (res < 0) {
685 : 0 : type->tp_mro = old_mro;
686 : 0 : Py_DECREF(new_mro);
687 : 0 : return -1;
688 : : }
689 : 699 : Py_XDECREF(old_mro);
690 : :
691 : : // Avoid creating an empty list if there is no subclass
692 [ + + ]: 699 : if (type->tp_subclasses != NULL) {
693 : : /* Obtain a copy of subclasses list to iterate over.
694 : :
695 : : Otherwise type->tp_subclasses might be altered
696 : : in the middle of the loop, for example, through a custom mro(),
697 : : by invoking type_set_bases on some subclass of the type
698 : : which in turn calls remove_subclass/add_subclass on this type.
699 : :
700 : : Finally, this makes things simple avoiding the need to deal
701 : : with dictionary iterators and weak references.
702 : : */
703 : 20 : PyObject *subclasses = _PyType_GetSubclasses(type);
704 [ - + ]: 20 : if (subclasses == NULL) {
705 : 0 : return -1;
706 : : }
707 : :
708 : 20 : Py_ssize_t n = PyList_GET_SIZE(subclasses);
709 [ + + ]: 55 : for (Py_ssize_t i = 0; i < n; i++) {
710 : 37 : PyTypeObject *subclass = _PyType_CAST(PyList_GET_ITEM(subclasses, i));
711 : 37 : res = mro_hierarchy(subclass, temp);
712 [ + + ]: 37 : if (res < 0) {
713 : 2 : break;
714 : : }
715 : : }
716 : 20 : Py_DECREF(subclasses);
717 : : }
718 : :
719 : 699 : return res;
720 : : }
721 : :
722 : : static int
723 : 695 : type_set_bases(PyTypeObject *type, PyObject *new_bases, void *context)
724 : : {
725 : : // Check arguments
726 [ + + ]: 695 : if (!check_set_special_type_attr(type, new_bases, "__bases__")) {
727 : 1 : return -1;
728 : : }
729 : : assert(new_bases != NULL);
730 : :
731 [ - + ]: 694 : if (!PyTuple_Check(new_bases)) {
732 : 0 : PyErr_Format(PyExc_TypeError,
733 : : "can only assign tuple to %s.__bases__, not %s",
734 : 0 : type->tp_name, Py_TYPE(new_bases)->tp_name);
735 : 0 : return -1;
736 : : }
737 [ + + ]: 694 : if (PyTuple_GET_SIZE(new_bases) == 0) {
738 : 1 : PyErr_Format(PyExc_TypeError,
739 : : "can only assign non-empty tuple to %s.__bases__, not ()",
740 : : type->tp_name);
741 : 1 : return -1;
742 : : }
743 : 693 : Py_ssize_t n = PyTuple_GET_SIZE(new_bases);
744 [ + + ]: 1397 : for (Py_ssize_t i = 0; i < n; i++) {
745 : 707 : PyObject *ob = PyTuple_GET_ITEM(new_bases, i);
746 [ - + ]: 707 : if (!PyType_Check(ob)) {
747 : 0 : PyErr_Format(PyExc_TypeError,
748 : : "%s.__bases__ must be tuple of classes, not '%s'",
749 : 0 : type->tp_name, Py_TYPE(ob)->tp_name);
750 : 0 : return -1;
751 : : }
752 : 707 : PyTypeObject *base = (PyTypeObject*)ob;
753 : :
754 [ + + ]: 707 : if (PyType_IsSubtype(base, type) ||
755 : : /* In case of reentering here again through a custom mro()
756 : : the above check is not enough since it relies on
757 : : base->tp_mro which would gonna be updated inside
758 : : mro_internal only upon returning from the mro().
759 : :
760 : : However, base->tp_base has already been assigned (see
761 : : below), which in turn may cause an inheritance cycle
762 : : through tp_base chain. And this is definitely
763 : : not what you want to ever happen. */
764 [ + - + + ]: 705 : (base->tp_mro != NULL && type_is_subtype_base_chain(base, type)))
765 : : {
766 : 3 : PyErr_SetString(PyExc_TypeError,
767 : : "a __bases__ item causes an inheritance cycle");
768 : 3 : return -1;
769 : : }
770 : : }
771 : :
772 : : // Compute the new MRO and the new base class
773 : 690 : PyTypeObject *new_base = best_base(new_bases);
774 [ + + ]: 690 : if (new_base == NULL)
775 : 5 : return -1;
776 : :
777 [ + + ]: 685 : if (!compatible_for_assignment(type->tp_base, new_base, "__bases__")) {
778 : 2 : return -1;
779 : : }
780 : :
781 : 683 : PyObject *old_bases = type->tp_bases;
782 : : assert(old_bases != NULL);
783 : 683 : PyTypeObject *old_base = type->tp_base;
784 : :
785 : 683 : type->tp_bases = Py_NewRef(new_bases);
786 : 683 : type->tp_base = (PyTypeObject *)Py_NewRef(new_base);
787 : :
788 : 683 : PyObject *temp = PyList_New(0);
789 [ - + ]: 683 : if (temp == NULL) {
790 : 0 : goto bail;
791 : : }
792 [ + + ]: 683 : if (mro_hierarchy(type, temp) < 0) {
793 : 7 : goto undo;
794 : : }
795 : 676 : Py_DECREF(temp);
796 : :
797 : : /* Take no action in case if type->tp_bases has been replaced
798 : : through reentrance. */
799 : : int res;
800 [ + + ]: 676 : if (type->tp_bases == new_bases) {
801 : : /* any base that was in __bases__ but now isn't, we
802 : : need to remove |type| from its tp_subclasses.
803 : : conversely, any class now in __bases__ that wasn't
804 : : needs to have |type| added to its subclasses. */
805 : :
806 : : /* for now, sod that: just remove from all old_bases,
807 : : add to all new_bases */
808 : 675 : remove_all_subclasses(type, old_bases);
809 : 675 : res = add_all_subclasses(type, new_bases);
810 : 675 : update_all_slots(type);
811 : : }
812 : : else {
813 : 1 : res = 0;
814 : : }
815 : :
816 : 676 : Py_DECREF(old_bases);
817 : 676 : Py_DECREF(old_base);
818 : :
819 : : assert(_PyType_CheckConsistency(type));
820 : 676 : return res;
821 : :
822 : 7 : undo:
823 : 7 : n = PyList_GET_SIZE(temp);
824 [ + + ]: 10 : for (Py_ssize_t i = n - 1; i >= 0; i--) {
825 : : PyTypeObject *cls;
826 : 3 : PyObject *new_mro, *old_mro = NULL;
827 : :
828 : 3 : PyArg_UnpackTuple(PyList_GET_ITEM(temp, i),
829 : : "", 2, 3, &cls, &new_mro, &old_mro);
830 : : /* Do not rollback if cls has a newer version of MRO. */
831 [ + - ]: 3 : if (cls->tp_mro == new_mro) {
832 : 3 : Py_XINCREF(old_mro);
833 : 3 : cls->tp_mro = old_mro;
834 : 3 : Py_DECREF(new_mro);
835 : : }
836 : : }
837 : 7 : Py_DECREF(temp);
838 : :
839 : 7 : bail:
840 [ + + ]: 7 : if (type->tp_bases == new_bases) {
841 : : assert(type->tp_base == new_base);
842 : :
843 : 6 : type->tp_bases = old_bases;
844 : 6 : type->tp_base = old_base;
845 : :
846 : 6 : Py_DECREF(new_bases);
847 : 6 : Py_DECREF(new_base);
848 : : }
849 : : else {
850 : 1 : Py_DECREF(old_bases);
851 : 1 : Py_DECREF(old_base);
852 : : }
853 : :
854 : : assert(_PyType_CheckConsistency(type));
855 : 7 : return -1;
856 : : }
857 : :
858 : : static PyObject *
859 : 1337337 : type_dict(PyTypeObject *type, void *context)
860 : : {
861 [ - + ]: 1337337 : if (type->tp_dict == NULL) {
862 : 0 : Py_RETURN_NONE;
863 : : }
864 : 1337337 : return PyDictProxy_New(type->tp_dict);
865 : : }
866 : :
867 : : static PyObject *
868 : 75215 : type_get_doc(PyTypeObject *type, void *context)
869 : : {
870 : : PyObject *result;
871 [ + + + + ]: 75215 : if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE) && type->tp_doc != NULL) {
872 : 57345 : return _PyType_GetDocFromInternalDoc(type->tp_name, type->tp_doc);
873 : : }
874 : 17870 : result = PyDict_GetItemWithError(type->tp_dict, &_Py_ID(__doc__));
875 [ - + ]: 17870 : if (result == NULL) {
876 [ # # ]: 0 : if (!PyErr_Occurred()) {
877 : 0 : result = Py_None;
878 : 0 : Py_INCREF(result);
879 : : }
880 : : }
881 [ + + ]: 17870 : else if (Py_TYPE(result)->tp_descr_get) {
882 : 527 : result = Py_TYPE(result)->tp_descr_get(result, NULL,
883 : : (PyObject *)type);
884 : : }
885 : : else {
886 : 17343 : Py_INCREF(result);
887 : : }
888 : 17870 : return result;
889 : : }
890 : :
891 : : static PyObject *
892 : 292 : type_get_text_signature(PyTypeObject *type, void *context)
893 : : {
894 : 292 : return _PyType_GetTextSignatureFromInternalDoc(type->tp_name, type->tp_doc);
895 : : }
896 : :
897 : : static int
898 : 4180 : type_set_doc(PyTypeObject *type, PyObject *value, void *context)
899 : : {
900 [ + + ]: 4180 : if (!check_set_special_type_attr(type, value, "__doc__"))
901 : 2 : return -1;
902 : 4178 : PyType_Modified(type);
903 : 4178 : return PyDict_SetItem(type->tp_dict, &_Py_ID(__doc__), value);
904 : : }
905 : :
906 : : static PyObject *
907 : 49402 : type_get_annotations(PyTypeObject *type, void *context)
908 : : {
909 [ + + ]: 49402 : if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
910 : 43535 : PyErr_Format(PyExc_AttributeError, "type object '%s' has no attribute '__annotations__'", type->tp_name);
911 : 43535 : return NULL;
912 : : }
913 : :
914 : : PyObject *annotations;
915 : : /* there's no _PyDict_GetItemId without WithError, so let's LBYL. */
916 [ + + ]: 5867 : if (PyDict_Contains(type->tp_dict, &_Py_ID(__annotations__))) {
917 : 613 : annotations = PyDict_GetItemWithError(
918 : : type->tp_dict, &_Py_ID(__annotations__));
919 : : /*
920 : : ** PyDict_GetItemWithError could still fail,
921 : : ** for instance with a well-timed Ctrl-C or a MemoryError.
922 : : ** so let's be totally safe.
923 : : */
924 [ + - ]: 613 : if (annotations) {
925 [ - + ]: 613 : if (Py_TYPE(annotations)->tp_descr_get) {
926 : 0 : annotations = Py_TYPE(annotations)->tp_descr_get(
927 : : annotations, NULL, (PyObject *)type);
928 : : } else {
929 : 613 : Py_INCREF(annotations);
930 : : }
931 : : }
932 : : } else {
933 : 5254 : annotations = PyDict_New();
934 [ + - ]: 5254 : if (annotations) {
935 : 5254 : int result = PyDict_SetItem(
936 : : type->tp_dict, &_Py_ID(__annotations__), annotations);
937 [ - + ]: 5254 : if (result) {
938 [ # # ]: 0 : Py_CLEAR(annotations);
939 : : } else {
940 : 5254 : PyType_Modified(type);
941 : : }
942 : : }
943 : : }
944 : 5867 : return annotations;
945 : : }
946 : :
947 : : static int
948 : 727 : type_set_annotations(PyTypeObject *type, PyObject *value, void *context)
949 : : {
950 [ - + ]: 727 : if (_PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE)) {
951 : 0 : PyErr_Format(PyExc_TypeError,
952 : : "cannot set '__annotations__' attribute of immutable type '%s'",
953 : : type->tp_name);
954 : 0 : return -1;
955 : : }
956 : :
957 : : int result;
958 [ + + ]: 727 : if (value != NULL) {
959 : : /* set */
960 : 718 : result = PyDict_SetItem(type->tp_dict, &_Py_ID(__annotations__), value);
961 : : } else {
962 : : /* delete */
963 [ + + ]: 9 : if (!PyDict_Contains(type->tp_dict, &_Py_ID(__annotations__))) {
964 : 1 : PyErr_Format(PyExc_AttributeError, "__annotations__");
965 : 1 : return -1;
966 : : }
967 : 8 : result = PyDict_DelItem(type->tp_dict, &_Py_ID(__annotations__));
968 : : }
969 : :
970 [ + - ]: 726 : if (result == 0) {
971 : 726 : PyType_Modified(type);
972 : : }
973 : 726 : return result;
974 : : }
975 : :
976 : :
977 : : /*[clinic input]
978 : : type.__instancecheck__ -> bool
979 : :
980 : : instance: object
981 : : /
982 : :
983 : : Check if an object is an instance.
984 : : [clinic start generated code]*/
985 : :
986 : : static int
987 : 401552 : type___instancecheck___impl(PyTypeObject *self, PyObject *instance)
988 : : /*[clinic end generated code: output=08b6bf5f591c3618 input=cdbfeaee82c01a0f]*/
989 : : {
990 : 401552 : return _PyObject_RealIsInstance(instance, (PyObject *)self);
991 : : }
992 : :
993 : : /*[clinic input]
994 : : type.__subclasscheck__ -> bool
995 : :
996 : : subclass: object
997 : : /
998 : :
999 : : Check if a class is a subclass.
1000 : : [clinic start generated code]*/
1001 : :
1002 : : static int
1003 : 359150 : type___subclasscheck___impl(PyTypeObject *self, PyObject *subclass)
1004 : : /*[clinic end generated code: output=97a4e51694500941 input=071b2ca9e03355f4]*/
1005 : : {
1006 : 359150 : return _PyObject_RealIsSubclass(subclass, (PyObject *)self);
1007 : : }
1008 : :
1009 : :
1010 : : static PyGetSetDef type_getsets[] = {
1011 : : {"__name__", (getter)type_name, (setter)type_set_name, NULL},
1012 : : {"__qualname__", (getter)type_qualname, (setter)type_set_qualname, NULL},
1013 : : {"__bases__", (getter)type_get_bases, (setter)type_set_bases, NULL},
1014 : : {"__module__", (getter)type_module, (setter)type_set_module, NULL},
1015 : : {"__abstractmethods__", (getter)type_abstractmethods,
1016 : : (setter)type_set_abstractmethods, NULL},
1017 : : {"__dict__", (getter)type_dict, NULL, NULL},
1018 : : {"__doc__", (getter)type_get_doc, (setter)type_set_doc, NULL},
1019 : : {"__text_signature__", (getter)type_get_text_signature, NULL, NULL},
1020 : : {"__annotations__", (getter)type_get_annotations, (setter)type_set_annotations, NULL},
1021 : : {0}
1022 : : };
1023 : :
1024 : : static PyObject *
1025 : 335334 : type_repr(PyTypeObject *type)
1026 : : {
1027 [ - + ]: 335334 : if (type->tp_name == NULL) {
1028 : : // type_repr() called before the type is fully initialized
1029 : : // by PyType_Ready().
1030 : 0 : return PyUnicode_FromFormat("<class at %p>", type);
1031 : : }
1032 : :
1033 : : PyObject *mod, *name, *rtn;
1034 : :
1035 : 335334 : mod = type_module(type, NULL);
1036 [ - + ]: 335334 : if (mod == NULL)
1037 : 0 : PyErr_Clear();
1038 [ - + ]: 335334 : else if (!PyUnicode_Check(mod)) {
1039 : 0 : Py_DECREF(mod);
1040 : 0 : mod = NULL;
1041 : : }
1042 : 335334 : name = type_qualname(type, NULL);
1043 [ - + ]: 335334 : if (name == NULL) {
1044 : 0 : Py_XDECREF(mod);
1045 : 0 : return NULL;
1046 : : }
1047 : :
1048 [ + - + + ]: 335334 : if (mod != NULL && !_PyUnicode_Equal(mod, &_Py_ID(builtins)))
1049 : 333893 : rtn = PyUnicode_FromFormat("<class '%U.%U'>", mod, name);
1050 : : else
1051 : 1441 : rtn = PyUnicode_FromFormat("<class '%s'>", type->tp_name);
1052 : :
1053 : 335334 : Py_XDECREF(mod);
1054 : 335334 : Py_DECREF(name);
1055 : 335334 : return rtn;
1056 : : }
1057 : :
1058 : : static PyObject *
1059 : 43766973 : type_call(PyTypeObject *type, PyObject *args, PyObject *kwds)
1060 : : {
1061 : : PyObject *obj;
1062 : 43766973 : PyThreadState *tstate = _PyThreadState_GET();
1063 : :
1064 : : #ifdef Py_DEBUG
1065 : : /* type_call() must not be called with an exception set,
1066 : : because it can clear it (directly or indirectly) and so the
1067 : : caller loses its exception */
1068 : : assert(!_PyErr_Occurred(tstate));
1069 : : #endif
1070 : :
1071 : : /* Special case: type(x) should return Py_TYPE(x) */
1072 : : /* We only want type itself to accept the one-argument form (#27157) */
1073 [ + + ]: 43766973 : if (type == &PyType_Type) {
1074 : : assert(args != NULL && PyTuple_Check(args));
1075 : : assert(kwds == NULL || PyDict_Check(kwds));
1076 : 995246 : Py_ssize_t nargs = PyTuple_GET_SIZE(args);
1077 : :
1078 [ - + - - : 995246 : if (nargs == 1 && (kwds == NULL || !PyDict_GET_SIZE(kwds))) {
- - ]
1079 : 0 : obj = (PyObject *) Py_TYPE(PyTuple_GET_ITEM(args, 0));
1080 : 0 : Py_INCREF(obj);
1081 : 0 : return obj;
1082 : : }
1083 : :
1084 : : /* SF bug 475327 -- if that didn't trigger, we need 3
1085 : : arguments. But PyArg_ParseTuple in type_new may give
1086 : : a msg saying type() needs exactly 3. */
1087 [ + + ]: 995246 : if (nargs != 3) {
1088 : 8 : PyErr_SetString(PyExc_TypeError,
1089 : : "type() takes 1 or 3 arguments");
1090 : 8 : return NULL;
1091 : : }
1092 : : }
1093 : :
1094 [ + + ]: 43766965 : if (type->tp_new == NULL) {
1095 : 54 : _PyErr_Format(tstate, PyExc_TypeError,
1096 : : "cannot create '%s' instances", type->tp_name);
1097 : 54 : return NULL;
1098 : : }
1099 : :
1100 : 43766911 : obj = type->tp_new(type, args, kwds);
1101 : 43766911 : obj = _Py_CheckFunctionResult(tstate, (PyObject*)type, obj, NULL);
1102 [ + + ]: 43766911 : if (obj == NULL)
1103 : 62824 : return NULL;
1104 : :
1105 : : /* If the returned object is not an instance of type,
1106 : : it won't be initialized. */
1107 [ + + ]: 43704087 : if (!PyObject_TypeCheck(obj, type))
1108 : 803 : return obj;
1109 : :
1110 : 43703284 : type = Py_TYPE(obj);
1111 [ + + ]: 43703284 : if (type->tp_init != NULL) {
1112 : 43703283 : int res = type->tp_init(obj, args, kwds);
1113 [ + + ]: 43703274 : if (res < 0) {
1114 : : assert(_PyErr_Occurred(tstate));
1115 : 78765 : Py_DECREF(obj);
1116 : 78765 : obj = NULL;
1117 : : }
1118 : : else {
1119 : : assert(!_PyErr_Occurred(tstate));
1120 : : }
1121 : : }
1122 : 43703275 : return obj;
1123 : : }
1124 : :
1125 : : PyObject *
1126 : 74028134 : _PyType_AllocNoTrack(PyTypeObject *type, Py_ssize_t nitems)
1127 : : {
1128 : : PyObject *obj;
1129 : 74028134 : const size_t size = _PyObject_VAR_SIZE(type, nitems+1);
1130 : : /* note that we need to add one, for the sentinel */
1131 : :
1132 : 74028134 : const size_t presize = _PyType_PreHeaderSize(type);
1133 : 74028134 : char *alloc = PyObject_Malloc(size + presize);
1134 [ + + ]: 74028134 : if (alloc == NULL) {
1135 : : return PyErr_NoMemory();
1136 : : }
1137 : 74028076 : obj = (PyObject *)(alloc + presize);
1138 [ + + ]: 74028076 : if (presize) {
1139 : 72804774 : ((PyObject **)alloc)[0] = NULL;
1140 : 72804774 : ((PyObject **)alloc)[1] = NULL;
1141 : 72804774 : _PyObject_GC_Link(obj);
1142 : : }
1143 : 74028076 : memset(obj, '\0', size);
1144 : :
1145 [ + + ]: 74028076 : if (type->tp_itemsize == 0) {
1146 : 64457804 : _PyObject_Init(obj, type);
1147 : : }
1148 : : else {
1149 : 9570272 : _PyObject_InitVar((PyVarObject *)obj, type, nitems);
1150 : : }
1151 : 74028076 : return obj;
1152 : : }
1153 : :
1154 : : PyObject *
1155 : 73441102 : PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
1156 : : {
1157 : 73441102 : PyObject *obj = _PyType_AllocNoTrack(type, nitems);
1158 [ + + ]: 73441102 : if (obj == NULL) {
1159 : 58 : return NULL;
1160 : : }
1161 : :
1162 [ + + ]: 73441044 : if (_PyType_IS_GC(type)) {
1163 : 72217742 : _PyObject_GC_TRACK(obj);
1164 : : }
1165 : 73441044 : return obj;
1166 : : }
1167 : :
1168 : : PyObject *
1169 : 11329065 : PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
1170 : : {
1171 : 11329065 : return type->tp_alloc(type, 0);
1172 : : }
1173 : :
1174 : : /* Helpers for subtyping */
1175 : :
1176 : : static int
1177 : 5371978 : traverse_slots(PyTypeObject *type, PyObject *self, visitproc visit, void *arg)
1178 : : {
1179 : : Py_ssize_t i, n;
1180 : : PyMemberDef *mp;
1181 : :
1182 : 5371978 : n = Py_SIZE(type);
1183 : 5371978 : mp = _PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
1184 [ + + ]: 16969864 : for (i = 0; i < n; i++, mp++) {
1185 [ + - ]: 11597886 : if (mp->type == T_OBJECT_EX) {
1186 : 11597886 : char *addr = (char *)self + mp->offset;
1187 : 11597886 : PyObject *obj = *(PyObject **)addr;
1188 [ + + ]: 11597886 : if (obj != NULL) {
1189 : 10908656 : int err = visit(obj, arg);
1190 [ - + ]: 10908656 : if (err)
1191 : 0 : return err;
1192 : : }
1193 : : }
1194 : : }
1195 : 5371978 : return 0;
1196 : : }
1197 : :
1198 : : static int
1199 : 158587222 : subtype_traverse(PyObject *self, visitproc visit, void *arg)
1200 : : {
1201 : : PyTypeObject *type, *base;
1202 : : traverseproc basetraverse;
1203 : :
1204 : : /* Find the nearest base with a different tp_traverse,
1205 : : and traverse slots while we're at it */
1206 : 158587222 : type = Py_TYPE(self);
1207 : 158587222 : base = type;
1208 [ + + ]: 396494850 : while ((basetraverse = base->tp_traverse) == subtype_traverse) {
1209 [ + + ]: 237907628 : if (Py_SIZE(base)) {
1210 : 5371978 : int err = traverse_slots(base, self, visit, arg);
1211 [ - + ]: 5371978 : if (err)
1212 : 0 : return err;
1213 : : }
1214 : 237907628 : base = base->tp_base;
1215 : : assert(base);
1216 : : }
1217 : :
1218 [ + + ]: 158587222 : if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
1219 : : assert(type->tp_dictoffset);
1220 : 103876107 : int err = _PyObject_VisitInstanceAttributes(self, visit, arg);
1221 [ + + ]: 103876107 : if (err) {
1222 : 1 : return err;
1223 : : }
1224 : : }
1225 : :
1226 [ + + ]: 158587221 : if (type->tp_dictoffset != base->tp_dictoffset) {
1227 : 126843556 : PyObject **dictptr = _PyObject_DictPointer(self);
1228 [ + - + + ]: 126843556 : if (dictptr && *dictptr)
1229 [ + - - + ]: 59565367 : Py_VISIT(*dictptr);
1230 : : }
1231 : :
1232 [ + - ]: 158587221 : if (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1233 [ + + + + ]: 158587221 : && (!basetraverse || !(base->tp_flags & Py_TPFLAGS_HEAPTYPE))) {
1234 : : /* For a heaptype, the instances count as references
1235 : : to the type. Traverse the type so the collector
1236 : : can find cycles involving this link.
1237 : : Skip this visit if basetraverse belongs to a heap type: in that
1238 : : case, basetraverse will visit the type when we call it later.
1239 : : */
1240 [ + - - + ]: 138799351 : Py_VISIT(type);
1241 : : }
1242 : :
1243 [ + + ]: 158587221 : if (basetraverse)
1244 : 89006276 : return basetraverse(self, visit, arg);
1245 : 69580945 : return 0;
1246 : : }
1247 : :
1248 : : static void
1249 : 2480824 : clear_slots(PyTypeObject *type, PyObject *self)
1250 : : {
1251 : : Py_ssize_t i, n;
1252 : : PyMemberDef *mp;
1253 : :
1254 : 2480824 : n = Py_SIZE(type);
1255 : 2480824 : mp = _PyHeapType_GET_MEMBERS((PyHeapTypeObject *)type);
1256 [ + + ]: 10719179 : for (i = 0; i < n; i++, mp++) {
1257 [ + - + - ]: 8238355 : if (mp->type == T_OBJECT_EX && !(mp->flags & READONLY)) {
1258 : 8238355 : char *addr = (char *)self + mp->offset;
1259 : 8238355 : PyObject *obj = *(PyObject **)addr;
1260 [ + + ]: 8238355 : if (obj != NULL) {
1261 : 7726454 : *(PyObject **)addr = NULL;
1262 : 7726454 : Py_DECREF(obj);
1263 : : }
1264 : : }
1265 : : }
1266 : 2480824 : }
1267 : :
1268 : : static int
1269 : 1226869 : subtype_clear(PyObject *self)
1270 : : {
1271 : : PyTypeObject *type, *base;
1272 : : inquiry baseclear;
1273 : :
1274 : : /* Find the nearest base with a different tp_clear
1275 : : and clear slots while we're at it */
1276 : 1226869 : type = Py_TYPE(self);
1277 : 1226869 : base = type;
1278 [ + + ]: 2904319 : while ((baseclear = base->tp_clear) == subtype_clear) {
1279 [ + + ]: 1677450 : if (Py_SIZE(base))
1280 : 6944 : clear_slots(base, self);
1281 : 1677450 : base = base->tp_base;
1282 : : assert(base);
1283 : : }
1284 : :
1285 : : /* Clear the instance dict (if any), to break cycles involving only
1286 : : __dict__ slots (as in the case 'self.__dict__ is self'). */
1287 [ + + ]: 1226869 : if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
1288 : 919500 : _PyObject_ClearInstanceAttributes(self);
1289 : : }
1290 [ + + ]: 1226869 : if (type->tp_dictoffset != base->tp_dictoffset) {
1291 : 992885 : PyObject **dictptr = _PyObject_DictPointer(self);
1292 [ + - + + ]: 992885 : if (dictptr && *dictptr)
1293 [ + - ]: 183405 : Py_CLEAR(*dictptr);
1294 : : }
1295 : :
1296 [ + + ]: 1226869 : if (baseclear)
1297 : 231311 : return baseclear(self);
1298 : 995558 : return 0;
1299 : : }
1300 : :
1301 : : static void
1302 : 29392660 : subtype_dealloc(PyObject *self)
1303 : : {
1304 : : PyTypeObject *type, *base;
1305 : : destructor basedealloc;
1306 : : int has_finalizer;
1307 : :
1308 : : /* Extract the type; we expect it to be a heap type */
1309 : 29392660 : type = Py_TYPE(self);
1310 : : _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
1311 : :
1312 : : /* Test whether the type has GC exactly once */
1313 : :
1314 [ + + ]: 29392660 : if (!_PyType_IS_GC(type)) {
1315 : : /* A non GC dynamic type allows certain simplifications:
1316 : : there's no need to call clear_slots(), or DECREF the dict,
1317 : : or clear weakrefs. */
1318 : :
1319 : : /* Maybe call finalizer; exit early if resurrected */
1320 [ + + ]: 2127 : if (type->tp_finalize) {
1321 [ + + ]: 5 : if (PyObject_CallFinalizerFromDealloc(self) < 0)
1322 : 2 : return;
1323 : : }
1324 [ - + ]: 2125 : if (type->tp_del) {
1325 : 0 : type->tp_del(self);
1326 [ # # ]: 0 : if (Py_REFCNT(self) > 0) {
1327 : 0 : return;
1328 : : }
1329 : : }
1330 : :
1331 : : /* Find the nearest base with a different tp_dealloc */
1332 : 2125 : base = type;
1333 [ + + ]: 4253 : while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
1334 : 2128 : base = base->tp_base;
1335 : : assert(base);
1336 : : }
1337 : :
1338 : : /* Extract the type again; tp_del may have changed it */
1339 : 2125 : type = Py_TYPE(self);
1340 : :
1341 : : // Don't read type memory after calling basedealloc() since basedealloc()
1342 : : // can deallocate the type and free its memory.
1343 : 4250 : int type_needs_decref = (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1344 [ + - + + ]: 2125 : && !(base->tp_flags & Py_TPFLAGS_HEAPTYPE));
1345 : :
1346 : : assert((type->tp_flags & Py_TPFLAGS_MANAGED_DICT) == 0);
1347 : :
1348 : : /* Call the base tp_dealloc() */
1349 : : assert(basedealloc);
1350 : 2125 : basedealloc(self);
1351 : :
1352 : : /* Can't reference self beyond this point. It's possible tp_del switched
1353 : : our type from a HEAPTYPE to a non-HEAPTYPE, so be careful about
1354 : : reference counting. Only decref if the base type is not already a heap
1355 : : allocated type. Otherwise, basedealloc should have decref'd it already */
1356 [ + + ]: 2125 : if (type_needs_decref) {
1357 : 25 : Py_DECREF(type);
1358 : : }
1359 : :
1360 : : /* Done */
1361 : 2125 : return;
1362 : : }
1363 : :
1364 : : /* We get here only if the type has GC */
1365 : :
1366 : : /* UnTrack and re-Track around the trashcan macro, alas */
1367 : : /* See explanation at end of function for full disclosure */
1368 : 29390533 : PyObject_GC_UnTrack(self);
1369 [ + - + + ]: 29390533 : Py_TRASHCAN_BEGIN(self, subtype_dealloc);
1370 : :
1371 : : /* Find the nearest base with a different tp_dealloc */
1372 : 29302581 : base = type;
1373 [ + + ]: 79730636 : while ((/*basedealloc =*/ base->tp_dealloc) == subtype_dealloc) {
1374 : 50428055 : base = base->tp_base;
1375 : : assert(base);
1376 : : }
1377 : :
1378 [ + + + + ]: 29302581 : has_finalizer = type->tp_finalize || type->tp_del;
1379 : :
1380 [ + + ]: 29302581 : if (type->tp_finalize) {
1381 : 4462682 : _PyObject_GC_TRACK(self);
1382 [ + + ]: 4462682 : if (PyObject_CallFinalizerFromDealloc(self) < 0) {
1383 : : /* Resurrected */
1384 : 41 : goto endlabel;
1385 : : }
1386 : 4462641 : _PyObject_GC_UNTRACK(self);
1387 : : }
1388 : : /*
1389 : : If we added a weaklist, we clear it. Do this *before* calling tp_del,
1390 : : clearing slots, or clearing the instance dict.
1391 : :
1392 : : GC tracking must be off at this point. weakref callbacks (if any, and
1393 : : whether directly here or indirectly in something we call) may trigger GC,
1394 : : and if self is tracked at that point, it will look like trash to GC and GC
1395 : : will try to delete self again.
1396 : : */
1397 [ + + + + ]: 29302540 : if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
1398 : 18640749 : PyObject_ClearWeakRefs(self);
1399 : : }
1400 : :
1401 [ + + ]: 29302540 : if (type->tp_del) {
1402 : 11 : _PyObject_GC_TRACK(self);
1403 : 11 : type->tp_del(self);
1404 [ + + ]: 11 : if (Py_REFCNT(self) > 0) {
1405 : : /* Resurrected */
1406 : 2 : goto endlabel;
1407 : : }
1408 : 9 : _PyObject_GC_UNTRACK(self);
1409 : : }
1410 [ + + ]: 29302538 : if (has_finalizer) {
1411 : : /* New weakrefs could be created during the finalizer call.
1412 : : If this occurs, clear them out without calling their
1413 : : finalizers since they might rely on part of the object
1414 : : being finalized that has already been destroyed. */
1415 [ + + + + ]: 4462645 : if (type->tp_weaklistoffset && !base->tp_weaklistoffset) {
1416 : : /* Modeled after GET_WEAKREFS_LISTPTR() */
1417 : : PyWeakReference **list = (PyWeakReference **) \
1418 : 4403401 : _PyObject_GET_WEAKREFS_LISTPTR(self);
1419 [ - + ]: 4403401 : while (*list)
1420 : 0 : _PyWeakref_ClearRef(*list);
1421 : : }
1422 : : }
1423 : :
1424 : : /* Clear slots up to the nearest base with a different tp_dealloc */
1425 : 29302538 : base = type;
1426 [ + + ]: 79730518 : while ((basedealloc = base->tp_dealloc) == subtype_dealloc) {
1427 [ + + ]: 50427980 : if (Py_SIZE(base))
1428 : 2473880 : clear_slots(base, self);
1429 : 50427980 : base = base->tp_base;
1430 : : assert(base);
1431 : : }
1432 : :
1433 : : /* If we added a dict, DECREF it, or free inline values. */
1434 [ + + ]: 29302538 : if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
1435 : 13319170 : PyObject **dictptr = _PyObject_ManagedDictPointer(self);
1436 [ + + ]: 13319170 : if (*dictptr != NULL) {
1437 : : assert(*_PyObject_ValuesPointer(self) == NULL);
1438 : 4439978 : Py_DECREF(*dictptr);
1439 : 4439978 : *dictptr = NULL;
1440 : : }
1441 : : else {
1442 : 8879192 : _PyObject_FreeInstanceAttributes(self);
1443 : : }
1444 : : }
1445 [ + + + + ]: 15983368 : else if (type->tp_dictoffset && !base->tp_dictoffset) {
1446 : 7947596 : PyObject **dictptr = _PyObject_DictPointer(self);
1447 [ + - ]: 7947596 : if (dictptr != NULL) {
1448 : 7947596 : PyObject *dict = *dictptr;
1449 [ + + ]: 7947596 : if (dict != NULL) {
1450 : 363428 : Py_DECREF(dict);
1451 : 363428 : *dictptr = NULL;
1452 : : }
1453 : : }
1454 : : }
1455 : :
1456 : : /* Extract the type again; tp_del may have changed it */
1457 : 29302538 : type = Py_TYPE(self);
1458 : :
1459 : : /* Call the base tp_dealloc(); first retrack self if
1460 : : * basedealloc knows about gc.
1461 : : */
1462 [ + + ]: 29302538 : if (_PyType_IS_GC(base)) {
1463 : 18137501 : _PyObject_GC_TRACK(self);
1464 : : }
1465 : :
1466 : : // Don't read type memory after calling basedealloc() since basedealloc()
1467 : : // can deallocate the type and free its memory.
1468 : 58605076 : int type_needs_decref = (type->tp_flags & Py_TPFLAGS_HEAPTYPE
1469 [ + - + + ]: 29302538 : && !(base->tp_flags & Py_TPFLAGS_HEAPTYPE));
1470 : :
1471 : : assert(basedealloc);
1472 : 29302538 : basedealloc(self);
1473 : :
1474 : : /* Can't reference self beyond this point. It's possible tp_del switched
1475 : : our type from a HEAPTYPE to a non-HEAPTYPE, so be careful about
1476 : : reference counting. Only decref if the base type is not already a heap
1477 : : allocated type. Otherwise, basedealloc should have decref'd it already */
1478 [ + + ]: 29302538 : if (type_needs_decref) {
1479 : 24416720 : Py_DECREF(type);
1480 : : }
1481 : :
1482 : 4885818 : endlabel:
1483 [ + - ]: 29302581 : Py_TRASHCAN_END
1484 : :
1485 : : /* Explanation of the weirdness around the trashcan macros:
1486 : :
1487 : : Q. What do the trashcan macros do?
1488 : :
1489 : : A. Read the comment titled "Trashcan mechanism" in object.h.
1490 : : For one, this explains why there must be a call to GC-untrack
1491 : : before the trashcan begin macro. Without understanding the
1492 : : trashcan code, the answers to the following questions don't make
1493 : : sense.
1494 : :
1495 : : Q. Why do we GC-untrack before the trashcan and then immediately
1496 : : GC-track again afterward?
1497 : :
1498 : : A. In the case that the base class is GC-aware, the base class
1499 : : probably GC-untracks the object. If it does that using the
1500 : : UNTRACK macro, this will crash when the object is already
1501 : : untracked. Because we don't know what the base class does, the
1502 : : only safe thing is to make sure the object is tracked when we
1503 : : call the base class dealloc. But... The trashcan begin macro
1504 : : requires that the object is *untracked* before it is called. So
1505 : : the dance becomes:
1506 : :
1507 : : GC untrack
1508 : : trashcan begin
1509 : : GC track
1510 : :
1511 : : Q. Why did the last question say "immediately GC-track again"?
1512 : : It's nowhere near immediately.
1513 : :
1514 : : A. Because the code *used* to re-track immediately. Bad Idea.
1515 : : self has a refcount of 0, and if gc ever gets its hands on it
1516 : : (which can happen if any weakref callback gets invoked), it
1517 : : looks like trash to gc too, and gc also tries to delete self
1518 : : then. But we're already deleting self. Double deallocation is
1519 : : a subtle disaster.
1520 : : */
1521 : : }
1522 : :
1523 : : static PyTypeObject *solid_base(PyTypeObject *type);
1524 : :
1525 : : /* type test with subclassing support */
1526 : :
1527 : : static int
1528 : 280077 : type_is_subtype_base_chain(PyTypeObject *a, PyTypeObject *b)
1529 : : {
1530 : : do {
1531 [ + + ]: 919480 : if (a == b)
1532 : 279370 : return 1;
1533 : 640110 : a = a->tp_base;
1534 [ + + ]: 640110 : } while (a != NULL);
1535 : :
1536 : 707 : return (b == &PyBaseObject_Type);
1537 : : }
1538 : :
1539 : : int
1540 : 219523507 : PyType_IsSubtype(PyTypeObject *a, PyTypeObject *b)
1541 : : {
1542 : : PyObject *mro;
1543 : :
1544 : 219523507 : mro = a->tp_mro;
1545 [ + + ]: 219523507 : if (mro != NULL) {
1546 : : /* Deal with multiple inheritance without recursion
1547 : : by walking the MRO tuple */
1548 : : Py_ssize_t i, n;
1549 : : assert(PyTuple_Check(mro));
1550 : 219244135 : n = PyTuple_GET_SIZE(mro);
1551 [ + + ]: 605170641 : for (i = 0; i < n; i++) {
1552 [ + + ]: 511305822 : if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b)
1553 : 125379316 : return 1;
1554 : : }
1555 : 93864819 : return 0;
1556 : : }
1557 : : else
1558 : : /* a is not completely initialized yet; follow tp_base */
1559 : 279372 : return type_is_subtype_base_chain(a, b);
1560 : : }
1561 : :
1562 : : /* Routines to do a method lookup in the type without looking in the
1563 : : instance dictionary (so we can't use PyObject_GetAttr) but still
1564 : : binding it to the instance.
1565 : :
1566 : : Variants:
1567 : :
1568 : : - _PyObject_LookupSpecial() returns NULL without raising an exception
1569 : : when the _PyType_Lookup() call fails;
1570 : :
1571 : : - lookup_maybe_method() and lookup_method() are internal routines similar
1572 : : to _PyObject_LookupSpecial(), but can return unbound PyFunction
1573 : : to avoid temporary method object. Pass self as first argument when
1574 : : unbound == 1.
1575 : : */
1576 : :
1577 : : PyObject *
1578 : 29075091 : _PyObject_LookupSpecial(PyObject *self, PyObject *attr)
1579 : : {
1580 : : PyObject *res;
1581 : :
1582 : 29075091 : res = _PyType_Lookup(Py_TYPE(self), attr);
1583 [ + + ]: 29075091 : if (res != NULL) {
1584 : : descrgetfunc f;
1585 [ + + ]: 16472723 : if ((f = Py_TYPE(res)->tp_descr_get) == NULL)
1586 : 29 : Py_INCREF(res);
1587 : : else
1588 : 16472694 : res = f(res, self, (PyObject *)(Py_TYPE(self)));
1589 : : }
1590 : 29075091 : return res;
1591 : : }
1592 : :
1593 : : PyObject *
1594 : 11 : _PyObject_LookupSpecialId(PyObject *self, _Py_Identifier *attrid)
1595 : : {
1596 : 11 : PyObject *attr = _PyUnicode_FromId(attrid); /* borrowed */
1597 [ - + ]: 11 : if (attr == NULL)
1598 : 0 : return NULL;
1599 : 11 : return _PyObject_LookupSpecial(self, attr);
1600 : : }
1601 : :
1602 : : static PyObject *
1603 : 38326246 : lookup_maybe_method(PyObject *self, PyObject *attr, int *unbound)
1604 : : {
1605 : 38326246 : PyObject *res = _PyType_Lookup(Py_TYPE(self), attr);
1606 [ + + ]: 38326246 : if (res == NULL) {
1607 : 33 : return NULL;
1608 : : }
1609 : :
1610 [ + + ]: 38326213 : if (_PyType_HasFeature(Py_TYPE(res), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
1611 : : /* Avoid temporary PyMethodObject */
1612 : 38323529 : *unbound = 1;
1613 : 38323529 : Py_INCREF(res);
1614 : : }
1615 : : else {
1616 : 2684 : *unbound = 0;
1617 : 2684 : descrgetfunc f = Py_TYPE(res)->tp_descr_get;
1618 [ + + ]: 2684 : if (f == NULL) {
1619 : 2397 : Py_INCREF(res);
1620 : : }
1621 : : else {
1622 : 287 : res = f(res, self, (PyObject *)(Py_TYPE(self)));
1623 : : }
1624 : : }
1625 : 38326213 : return res;
1626 : : }
1627 : :
1628 : : static PyObject *
1629 : 20393799 : lookup_method(PyObject *self, PyObject *attr, int *unbound)
1630 : : {
1631 : 20393799 : PyObject *res = lookup_maybe_method(self, attr, unbound);
1632 [ + + - + ]: 20393799 : if (res == NULL && !PyErr_Occurred()) {
1633 : 0 : PyErr_SetObject(PyExc_AttributeError, attr);
1634 : : }
1635 : 20393799 : return res;
1636 : : }
1637 : :
1638 : :
1639 : : static inline PyObject*
1640 : 17845660 : vectorcall_unbound(PyThreadState *tstate, int unbound, PyObject *func,
1641 : : PyObject *const *args, Py_ssize_t nargs)
1642 : : {
1643 : 17845660 : size_t nargsf = nargs;
1644 [ + + ]: 17845660 : if (!unbound) {
1645 : : /* Skip self argument, freeing up args[0] to use for
1646 : : * PY_VECTORCALL_ARGUMENTS_OFFSET */
1647 : 518 : args++;
1648 : 518 : nargsf = nargsf - 1 + PY_VECTORCALL_ARGUMENTS_OFFSET;
1649 : : }
1650 : : EVAL_CALL_STAT_INC_IF_FUNCTION(EVAL_CALL_SLOT, func);
1651 : 17845660 : return _PyObject_VectorcallTstate(tstate, func, args, nargsf, NULL);
1652 : : }
1653 : :
1654 : : static PyObject*
1655 : 6341029 : call_unbound_noarg(int unbound, PyObject *func, PyObject *self)
1656 : : {
1657 [ + + ]: 6341029 : if (unbound) {
1658 : 6340865 : return PyObject_CallOneArg(func, self);
1659 : : }
1660 : : else {
1661 : 164 : return _PyObject_CallNoArgs(func);
1662 : : }
1663 : : }
1664 : :
1665 : : /* A variation of PyObject_CallMethod* that uses lookup_method()
1666 : : instead of PyObject_GetAttrString().
1667 : :
1668 : : args is an argument vector of length nargs. The first element in this
1669 : : vector is the special object "self" which is used for the method lookup */
1670 : : static PyObject *
1671 : 6975506 : vectorcall_method(PyObject *name, PyObject *const *args, Py_ssize_t nargs)
1672 : : {
1673 : : assert(nargs >= 1);
1674 : :
1675 : 6975506 : PyThreadState *tstate = _PyThreadState_GET();
1676 : : int unbound;
1677 : 6975506 : PyObject *self = args[0];
1678 : 6975506 : PyObject *func = lookup_method(self, name, &unbound);
1679 [ + + ]: 6975506 : if (func == NULL) {
1680 : 1 : return NULL;
1681 : : }
1682 : 6975505 : PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs);
1683 : 6975505 : Py_DECREF(func);
1684 : 6975505 : return retval;
1685 : : }
1686 : :
1687 : : /* Clone of vectorcall_method() that returns NotImplemented
1688 : : * when the lookup fails. */
1689 : : static PyObject *
1690 : 588643 : vectorcall_maybe(PyThreadState *tstate, PyObject *name,
1691 : : PyObject *const *args, Py_ssize_t nargs)
1692 : : {
1693 : : assert(nargs >= 1);
1694 : :
1695 : : int unbound;
1696 : 588643 : PyObject *self = args[0];
1697 : 588643 : PyObject *func = lookup_maybe_method(self, name, &unbound);
1698 [ + + ]: 588643 : if (func == NULL) {
1699 [ + - ]: 33 : if (!PyErr_Occurred())
1700 : 33 : Py_RETURN_NOTIMPLEMENTED;
1701 : 0 : return NULL;
1702 : : }
1703 : 588610 : PyObject *retval = vectorcall_unbound(tstate, unbound, func, args, nargs);
1704 : 588610 : Py_DECREF(func);
1705 : 588610 : return retval;
1706 : : }
1707 : :
1708 : : /*
1709 : : Method resolution order algorithm C3 described in
1710 : : "A Monotonic Superclass Linearization for Dylan",
1711 : : by Kim Barrett, Bob Cassel, Paul Haahr,
1712 : : David A. Moon, Keith Playford, and P. Tucker Withington.
1713 : : (OOPSLA 1996)
1714 : :
1715 : : Some notes about the rules implied by C3:
1716 : :
1717 : : No duplicate bases.
1718 : : It isn't legal to repeat a class in a list of base classes.
1719 : :
1720 : : The next three properties are the 3 constraints in "C3".
1721 : :
1722 : : Local precedence order.
1723 : : If A precedes B in C's MRO, then A will precede B in the MRO of all
1724 : : subclasses of C.
1725 : :
1726 : : Monotonicity.
1727 : : The MRO of a class must be an extension without reordering of the
1728 : : MRO of each of its superclasses.
1729 : :
1730 : : Extended Precedence Graph (EPG).
1731 : : Linearization is consistent if there is a path in the EPG from
1732 : : each class to all its successors in the linearization. See
1733 : : the paper for definition of EPG.
1734 : : */
1735 : :
1736 : : static int
1737 : 2290531 : tail_contains(PyObject *tuple, int whence, PyObject *o)
1738 : : {
1739 : : Py_ssize_t j, size;
1740 : 2290531 : size = PyTuple_GET_SIZE(tuple);
1741 : :
1742 [ + + ]: 3885308 : for (j = whence+1; j < size; j++) {
1743 [ + + ]: 1842303 : if (PyTuple_GET_ITEM(tuple, j) == o)
1744 : 247526 : return 1;
1745 : : }
1746 : 2043005 : return 0;
1747 : : }
1748 : :
1749 : : static PyObject *
1750 : 26 : class_name(PyObject *cls)
1751 : : {
1752 : : PyObject *name;
1753 [ - + ]: 26 : if (_PyObject_LookupAttr(cls, &_Py_ID(__name__), &name) == 0) {
1754 : 0 : name = PyObject_Repr(cls);
1755 : : }
1756 : 26 : return name;
1757 : : }
1758 : :
1759 : : static int
1760 : 116193 : check_duplicates(PyObject *tuple)
1761 : : {
1762 : : Py_ssize_t i, j, n;
1763 : : /* Let's use a quadratic time algorithm,
1764 : : assuming that the bases tuples is short.
1765 : : */
1766 : 116193 : n = PyTuple_GET_SIZE(tuple);
1767 [ + + ]: 369427 : for (i = 0; i < n; i++) {
1768 : 253239 : PyObject *o = PyTuple_GET_ITEM(tuple, i);
1769 [ + + ]: 421903 : for (j = i + 1; j < n; j++) {
1770 [ + + ]: 168669 : if (PyTuple_GET_ITEM(tuple, j) == o) {
1771 : 5 : o = class_name(o);
1772 [ + - ]: 5 : if (o != NULL) {
1773 [ + - ]: 5 : if (PyUnicode_Check(o)) {
1774 : 5 : PyErr_Format(PyExc_TypeError,
1775 : : "duplicate base class %U", o);
1776 : : }
1777 : : else {
1778 : 0 : PyErr_SetString(PyExc_TypeError,
1779 : : "duplicate base class");
1780 : : }
1781 : 5 : Py_DECREF(o);
1782 : : }
1783 : 5 : return -1;
1784 : : }
1785 : : }
1786 : : }
1787 : 116188 : return 0;
1788 : : }
1789 : :
1790 : : /* Raise a TypeError for an MRO order disagreement.
1791 : :
1792 : : It's hard to produce a good error message. In the absence of better
1793 : : insight into error reporting, report the classes that were candidates
1794 : : to be put next into the MRO. There is some conflict between the
1795 : : order in which they should be put in the MRO, but it's hard to
1796 : : diagnose what constraint can't be satisfied.
1797 : : */
1798 : :
1799 : : static void
1800 : 10 : set_mro_error(PyObject **to_merge, Py_ssize_t to_merge_size, int *remain)
1801 : : {
1802 : : Py_ssize_t i, n, off;
1803 : : char buf[1000];
1804 : : PyObject *k, *v;
1805 : 10 : PyObject *set = PyDict_New();
1806 [ - + ]: 10 : if (!set) return;
1807 : :
1808 [ + + ]: 41 : for (i = 0; i < to_merge_size; i++) {
1809 : 31 : PyObject *L = to_merge[i];
1810 [ + + ]: 31 : if (remain[i] < PyTuple_GET_SIZE(L)) {
1811 : 27 : PyObject *c = PyTuple_GET_ITEM(L, remain[i]);
1812 [ - + ]: 27 : if (PyDict_SetItem(set, c, Py_None) < 0) {
1813 : 0 : Py_DECREF(set);
1814 : 0 : return;
1815 : : }
1816 : : }
1817 : : }
1818 : 10 : n = PyDict_GET_SIZE(set);
1819 : :
1820 : 10 : off = PyOS_snprintf(buf, sizeof(buf), "Cannot create a \
1821 : : consistent method resolution\norder (MRO) for bases");
1822 : 10 : i = 0;
1823 [ + + + - ]: 31 : while (PyDict_Next(set, &i, &k, &v) && (size_t)off < sizeof(buf)) {
1824 : 21 : PyObject *name = class_name(k);
1825 : 21 : const char *name_str = NULL;
1826 [ + - ]: 21 : if (name != NULL) {
1827 [ + - ]: 21 : if (PyUnicode_Check(name)) {
1828 : 21 : name_str = PyUnicode_AsUTF8(name);
1829 : : }
1830 : : else {
1831 : 0 : name_str = "?";
1832 : : }
1833 : : }
1834 [ - + ]: 21 : if (name_str == NULL) {
1835 : 0 : Py_XDECREF(name);
1836 : 0 : Py_DECREF(set);
1837 : 0 : return;
1838 : : }
1839 : 21 : off += PyOS_snprintf(buf + off, sizeof(buf) - off, " %s", name_str);
1840 : 21 : Py_XDECREF(name);
1841 [ + + + - ]: 21 : if (--n && (size_t)(off+1) < sizeof(buf)) {
1842 : 11 : buf[off++] = ',';
1843 : 11 : buf[off] = '\0';
1844 : : }
1845 : : }
1846 : 10 : PyErr_SetString(PyExc_TypeError, buf);
1847 : 10 : Py_DECREF(set);
1848 : : }
1849 : :
1850 : : static int
1851 : 116188 : pmerge(PyObject *acc, PyObject **to_merge, Py_ssize_t to_merge_size)
1852 : : {
1853 : 116188 : int res = 0;
1854 : : Py_ssize_t i, j, empty_cnt;
1855 : : int *remain;
1856 : :
1857 : : /* remain stores an index into each sublist of to_merge.
1858 : : remain[i] is the index of the next base in to_merge[i]
1859 : : that is not included in acc.
1860 : : */
1861 [ + - ]: 116188 : remain = PyMem_New(int, to_merge_size);
1862 [ - + ]: 116188 : if (remain == NULL) {
1863 : : PyErr_NoMemory();
1864 : 0 : return -1;
1865 : : }
1866 [ + + ]: 485610 : for (i = 0; i < to_merge_size; i++)
1867 : 369422 : remain[i] = 0;
1868 : :
1869 : 116188 : again:
1870 : 645579 : empty_cnt = 0;
1871 [ + + ]: 1262500 : for (i = 0; i < to_merge_size; i++) {
1872 : : PyObject *candidate;
1873 : :
1874 : 1146312 : PyObject *cur_tuple = to_merge[i];
1875 : :
1876 [ + + ]: 1146312 : if (remain[i] >= PyTuple_GET_SIZE(cur_tuple)) {
1877 : 369395 : empty_cnt++;
1878 : 369395 : continue;
1879 : : }
1880 : :
1881 : : /* Choose next candidate for MRO.
1882 : :
1883 : : The input sequences alone can determine the choice.
1884 : : If not, choose the class which appears in the MRO
1885 : : of the earliest direct superclass of the new class.
1886 : : */
1887 : :
1888 : 776917 : candidate = PyTuple_GET_ITEM(cur_tuple, remain[i]);
1889 [ + + ]: 2819922 : for (j = 0; j < to_merge_size; j++) {
1890 : 2290531 : PyObject *j_lst = to_merge[j];
1891 [ + + ]: 2290531 : if (tail_contains(j_lst, remain[j], candidate))
1892 : 247526 : goto skip; /* continue outer loop */
1893 : : }
1894 : 529391 : res = PyList_Append(acc, candidate);
1895 [ - + ]: 529391 : if (res < 0)
1896 : 0 : goto out;
1897 : :
1898 [ + + ]: 2262117 : for (j = 0; j < to_merge_size; j++) {
1899 : 1732726 : PyObject *j_lst = to_merge[j];
1900 [ + + ]: 1732726 : if (remain[j] < PyTuple_GET_SIZE(j_lst) &&
1901 [ + + ]: 1504029 : PyTuple_GET_ITEM(j_lst, remain[j]) == candidate) {
1902 : 979880 : remain[j]++;
1903 : : }
1904 : : }
1905 : 529391 : goto again;
1906 : 247526 : skip: ;
1907 : : }
1908 : :
1909 [ + + ]: 116188 : if (empty_cnt != to_merge_size) {
1910 : 10 : set_mro_error(to_merge, to_merge_size, remain);
1911 : 10 : res = -1;
1912 : : }
1913 : :
1914 : 116178 : out:
1915 : 116188 : PyMem_Free(remain);
1916 : :
1917 : 116188 : return res;
1918 : : }
1919 : :
1920 : : static PyObject *
1921 : 2006541 : mro_implementation(PyTypeObject *type)
1922 : : {
1923 [ - + ]: 2006541 : if (!_PyType_IsReady(type)) {
1924 [ # # ]: 0 : if (PyType_Ready(type) < 0)
1925 : 0 : return NULL;
1926 : : }
1927 : :
1928 : 2006541 : PyObject *bases = type->tp_bases;
1929 : 2006541 : Py_ssize_t n = PyTuple_GET_SIZE(bases);
1930 [ + + ]: 4150132 : for (Py_ssize_t i = 0; i < n; i++) {
1931 : 2143592 : PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, i));
1932 [ + + ]: 2143592 : if (base->tp_mro == NULL) {
1933 : 1 : PyErr_Format(PyExc_TypeError,
1934 : : "Cannot extend an incomplete type '%.100s'",
1935 : : base->tp_name);
1936 : 1 : return NULL;
1937 : : }
1938 : : assert(PyTuple_Check(base->tp_mro));
1939 : : }
1940 : :
1941 [ + + ]: 2006540 : if (n == 1) {
1942 : : /* Fast path: if there is a single base, constructing the MRO
1943 : : * is trivial.
1944 : : */
1945 : 1890347 : PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, 0));
1946 : 1890347 : Py_ssize_t k = PyTuple_GET_SIZE(base->tp_mro);
1947 : 1890347 : PyObject *result = PyTuple_New(k + 1);
1948 [ - + ]: 1890347 : if (result == NULL) {
1949 : 0 : return NULL;
1950 : : }
1951 : :
1952 : 1890347 : Py_INCREF(type);
1953 : 1890347 : PyTuple_SET_ITEM(result, 0, (PyObject *) type);
1954 [ + + ]: 5993340 : for (Py_ssize_t i = 0; i < k; i++) {
1955 : 4102993 : PyObject *cls = PyTuple_GET_ITEM(base->tp_mro, i);
1956 : 4102993 : Py_INCREF(cls);
1957 : 4102993 : PyTuple_SET_ITEM(result, i + 1, cls);
1958 : : }
1959 : 1890347 : return result;
1960 : : }
1961 : :
1962 : : /* This is just a basic sanity check. */
1963 [ + + ]: 116193 : if (check_duplicates(bases) < 0) {
1964 : 5 : return NULL;
1965 : : }
1966 : :
1967 : : /* Find a superclass linearization that honors the constraints
1968 : : of the explicit tuples of bases and the constraints implied by
1969 : : each base class.
1970 : :
1971 : : to_merge is an array of tuples, where each tuple is a superclass
1972 : : linearization implied by a base class. The last element of
1973 : : to_merge is the declared tuple of bases.
1974 : : */
1975 [ + - ]: 116188 : PyObject **to_merge = PyMem_New(PyObject *, n + 1);
1976 [ - + ]: 116188 : if (to_merge == NULL) {
1977 : : PyErr_NoMemory();
1978 : 0 : return NULL;
1979 : : }
1980 : :
1981 [ + + ]: 369422 : for (Py_ssize_t i = 0; i < n; i++) {
1982 : 253234 : PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(bases, i));
1983 : 253234 : to_merge[i] = base->tp_mro;
1984 : : }
1985 : 116188 : to_merge[n] = bases;
1986 : :
1987 : 116188 : PyObject *result = PyList_New(1);
1988 [ - + ]: 116188 : if (result == NULL) {
1989 : 0 : PyMem_Free(to_merge);
1990 : 0 : return NULL;
1991 : : }
1992 : :
1993 : 116188 : Py_INCREF(type);
1994 : 116188 : PyList_SET_ITEM(result, 0, (PyObject *)type);
1995 [ + + ]: 116188 : if (pmerge(result, to_merge, n + 1) < 0) {
1996 [ + - ]: 10 : Py_CLEAR(result);
1997 : : }
1998 : 116188 : PyMem_Free(to_merge);
1999 : :
2000 : 116188 : return result;
2001 : : }
2002 : :
2003 : : /*[clinic input]
2004 : : type.mro
2005 : :
2006 : : Return a type's method resolution order.
2007 : : [clinic start generated code]*/
2008 : :
2009 : : static PyObject *
2010 : 240962 : type_mro_impl(PyTypeObject *self)
2011 : : /*[clinic end generated code: output=bffc4a39b5b57027 input=28414f4e156db28d]*/
2012 : : {
2013 : : PyObject *seq;
2014 : 240962 : seq = mro_implementation(self);
2015 [ + + + + ]: 240962 : if (seq != NULL && !PyList_Check(seq)) {
2016 : 200368 : Py_SETREF(seq, PySequence_List(seq));
2017 : : }
2018 : 240962 : return seq;
2019 : : }
2020 : :
2021 : : static int
2022 : 240426 : mro_check(PyTypeObject *type, PyObject *mro)
2023 : : {
2024 : : PyTypeObject *solid;
2025 : : Py_ssize_t i, n;
2026 : :
2027 : 240426 : solid = solid_base(type);
2028 : :
2029 : 240426 : n = PyTuple_GET_SIZE(mro);
2030 [ + + ]: 1411649 : for (i = 0; i < n; i++) {
2031 : 1171225 : PyObject *obj = PyTuple_GET_ITEM(mro, i);
2032 [ + + ]: 1171225 : if (!PyType_Check(obj)) {
2033 : 1 : PyErr_Format(
2034 : : PyExc_TypeError,
2035 : : "mro() returned a non-class ('%.500s')",
2036 : 1 : Py_TYPE(obj)->tp_name);
2037 : 1 : return -1;
2038 : : }
2039 : 1171224 : PyTypeObject *base = (PyTypeObject*)obj;
2040 : :
2041 [ + + ]: 1171224 : if (!PyType_IsSubtype(solid, solid_base(base))) {
2042 : 1 : PyErr_Format(
2043 : : PyExc_TypeError,
2044 : : "mro() returned base with unsuitable layout ('%.500s')",
2045 : : base->tp_name);
2046 : 1 : return -1;
2047 : : }
2048 : : }
2049 : :
2050 : 240424 : return 0;
2051 : : }
2052 : :
2053 : : /* Lookups an mcls.mro method, invokes it and checks the result (if needed,
2054 : : in case of a custom mro() implementation).
2055 : :
2056 : : Keep in mind that during execution of this function type->tp_mro
2057 : : can be replaced due to possible reentrance (for example,
2058 : : through type_set_bases):
2059 : :
2060 : : - when looking up the mcls.mro attribute (it could be
2061 : : a user-provided descriptor);
2062 : :
2063 : : - from inside a custom mro() itself;
2064 : :
2065 : : - through a finalizer of the return value of mro().
2066 : : */
2067 : : static PyObject *
2068 : 2006016 : mro_invoke(PyTypeObject *type)
2069 : : {
2070 : : PyObject *mro_result;
2071 : : PyObject *new_mro;
2072 : 2006016 : const int custom = !Py_IS_TYPE(type, &PyType_Type);
2073 : :
2074 [ + + ]: 2006016 : if (custom) {
2075 : : int unbound;
2076 : 240437 : PyObject *mro_meth = lookup_method(
2077 : : (PyObject *)type, &_Py_ID(mro), &unbound);
2078 [ - + ]: 240437 : if (mro_meth == NULL)
2079 : 0 : return NULL;
2080 : 240437 : mro_result = call_unbound_noarg(unbound, mro_meth, (PyObject *)type);
2081 : 240437 : Py_DECREF(mro_meth);
2082 : : }
2083 : : else {
2084 : 1765579 : mro_result = mro_implementation(type);
2085 : : }
2086 [ + + ]: 2006016 : if (mro_result == NULL)
2087 : 20 : return NULL;
2088 : :
2089 : 2005996 : new_mro = PySequence_Tuple(mro_result);
2090 : 2005996 : Py_DECREF(mro_result);
2091 [ + + ]: 2005996 : if (new_mro == NULL) {
2092 : 1 : return NULL;
2093 : : }
2094 : :
2095 [ - + ]: 2005995 : if (PyTuple_GET_SIZE(new_mro) == 0) {
2096 : 0 : Py_DECREF(new_mro);
2097 : 0 : PyErr_Format(PyExc_TypeError, "type MRO must not be empty");
2098 : 0 : return NULL;
2099 : : }
2100 : :
2101 [ + + + + ]: 2005995 : if (custom && mro_check(type, new_mro) < 0) {
2102 : 2 : Py_DECREF(new_mro);
2103 : 2 : return NULL;
2104 : : }
2105 : 2005993 : return new_mro;
2106 : : }
2107 : :
2108 : : /* Calculates and assigns a new MRO to type->tp_mro.
2109 : : Return values and invariants:
2110 : :
2111 : : - Returns 1 if a new MRO value has been set to type->tp_mro due to
2112 : : this call of mro_internal (no tricky reentrancy and no errors).
2113 : :
2114 : : In case if p_old_mro argument is not NULL, a previous value
2115 : : of type->tp_mro is put there, and the ownership of this
2116 : : reference is transferred to a caller.
2117 : : Otherwise, the previous value (if any) is decref'ed.
2118 : :
2119 : : - Returns 0 in case when type->tp_mro gets changed because of
2120 : : reentering here through a custom mro() (see a comment to mro_invoke).
2121 : :
2122 : : In this case, a refcount of an old type->tp_mro is adjusted
2123 : : somewhere deeper in the call stack (by the innermost mro_internal
2124 : : or its caller) and may become zero upon returning from here.
2125 : : This also implies that the whole hierarchy of subclasses of the type
2126 : : has seen the new value and updated their MRO accordingly.
2127 : :
2128 : : - Returns -1 in case of an error.
2129 : : */
2130 : : static int
2131 : 2006016 : mro_internal(PyTypeObject *type, PyObject **p_old_mro)
2132 : : {
2133 : : PyObject *new_mro, *old_mro;
2134 : : int reent;
2135 : :
2136 : : /* Keep a reference to be able to do a reentrancy check below.
2137 : : Don't let old_mro be GC'ed and its address be reused for
2138 : : another object, like (suddenly!) a new tp_mro. */
2139 : 2006016 : old_mro = type->tp_mro;
2140 : 2006016 : Py_XINCREF(old_mro);
2141 : 2006016 : new_mro = mro_invoke(type); /* might cause reentrance */
2142 : 2006016 : reent = (type->tp_mro != old_mro);
2143 : 2006016 : Py_XDECREF(old_mro);
2144 [ + + ]: 2006016 : if (new_mro == NULL) {
2145 : 23 : return -1;
2146 : : }
2147 : :
2148 [ + + ]: 2005993 : if (reent) {
2149 : 15 : Py_DECREF(new_mro);
2150 : 15 : return 0;
2151 : : }
2152 : :
2153 : 2005978 : type->tp_mro = new_mro;
2154 : :
2155 : 2005978 : type_mro_modified(type, type->tp_mro);
2156 : : /* corner case: the super class might have been hidden
2157 : : from the custom MRO */
2158 : 2005978 : type_mro_modified(type, type->tp_bases);
2159 : :
2160 : 2005978 : PyType_Modified(type);
2161 : :
2162 [ + + ]: 2005978 : if (p_old_mro != NULL)
2163 : 699 : *p_old_mro = old_mro; /* transfer the ownership */
2164 : : else
2165 : 2005279 : Py_XDECREF(old_mro);
2166 : :
2167 : 2005978 : return 1;
2168 : : }
2169 : :
2170 : : /* Calculate the best base amongst multiple base classes.
2171 : : This is the first one that's on the path to the "solid base". */
2172 : :
2173 : : static PyTypeObject *
2174 : 1067362 : best_base(PyObject *bases)
2175 : : {
2176 : : Py_ssize_t i, n;
2177 : : PyTypeObject *base, *winner, *candidate;
2178 : :
2179 : : assert(PyTuple_Check(bases));
2180 : 1067362 : n = PyTuple_GET_SIZE(bases);
2181 : : assert(n > 0);
2182 : 1067362 : base = NULL;
2183 : 1067362 : winner = NULL;
2184 [ + + ]: 2274711 : for (i = 0; i < n; i++) {
2185 : 1207369 : PyObject *base_proto = PyTuple_GET_ITEM(bases, i);
2186 [ - + ]: 1207369 : if (!PyType_Check(base_proto)) {
2187 : 0 : PyErr_SetString(
2188 : : PyExc_TypeError,
2189 : : "bases must be types");
2190 : 0 : return NULL;
2191 : : }
2192 : 1207369 : PyTypeObject *base_i = (PyTypeObject *)base_proto;
2193 : :
2194 [ + + ]: 1207369 : if (!_PyType_IsReady(base_i)) {
2195 [ - + ]: 780 : if (PyType_Ready(base_i) < 0)
2196 : 0 : return NULL;
2197 : : }
2198 [ + + ]: 1207369 : if (!_PyType_HasFeature(base_i, Py_TPFLAGS_BASETYPE)) {
2199 : 17 : PyErr_Format(PyExc_TypeError,
2200 : : "type '%.100s' is not an acceptable base type",
2201 : : base_i->tp_name);
2202 : 17 : return NULL;
2203 : : }
2204 : 1207352 : candidate = solid_base(base_i);
2205 [ + + ]: 1207352 : if (winner == NULL) {
2206 : 1067349 : winner = candidate;
2207 : 1067349 : base = base_i;
2208 : : }
2209 [ + + ]: 140003 : else if (PyType_IsSubtype(winner, candidate))
2210 : : ;
2211 [ + + ]: 7589 : else if (PyType_IsSubtype(candidate, winner)) {
2212 : 7586 : winner = candidate;
2213 : 7586 : base = base_i;
2214 : : }
2215 : : else {
2216 : 3 : PyErr_SetString(
2217 : : PyExc_TypeError,
2218 : : "multiple bases have "
2219 : : "instance lay-out conflict");
2220 : 3 : return NULL;
2221 : : }
2222 : : }
2223 : : assert (base != NULL);
2224 : :
2225 : 1067342 : return base;
2226 : : }
2227 : :
2228 : : static int
2229 : 6929630 : extra_ivars(PyTypeObject *type, PyTypeObject *base)
2230 : : {
2231 : 6929630 : size_t t_size = type->tp_basicsize;
2232 : 6929630 : size_t b_size = base->tp_basicsize;
2233 : :
2234 : : assert(t_size >= b_size); /* Else type smaller than base! */
2235 [ + + - + ]: 6929630 : if (type->tp_itemsize || base->tp_itemsize) {
2236 : : /* If itemsize is involved, stricter rules */
2237 [ + + ]: 380256 : return t_size != b_size ||
2238 [ - + ]: 52290 : type->tp_itemsize != base->tp_itemsize;
2239 : : }
2240 [ + + + + ]: 6601664 : if (type->tp_weaklistoffset && base->tp_weaklistoffset == 0 &&
2241 [ + + ]: 1341049 : type->tp_weaklistoffset + sizeof(PyObject *) == t_size &&
2242 [ + + ]: 1333417 : type->tp_flags & Py_TPFLAGS_HEAPTYPE)
2243 : 1191174 : t_size -= sizeof(PyObject *);
2244 : 6601664 : return t_size != b_size;
2245 : : }
2246 : :
2247 : : static PyTypeObject *
2248 : 6929630 : solid_base(PyTypeObject *type)
2249 : : {
2250 : : PyTypeObject *base;
2251 : :
2252 [ + + ]: 6929630 : if (type->tp_base)
2253 : 4310628 : base = solid_base(type->tp_base);
2254 : : else
2255 : 2619002 : base = &PyBaseObject_Type;
2256 [ + + ]: 6929630 : if (extra_ivars(type, base))
2257 : 1135250 : return type;
2258 : : else
2259 : 5794380 : return base;
2260 : : }
2261 : :
2262 : : static void object_dealloc(PyObject *);
2263 : : static PyObject *object_new(PyTypeObject *, PyObject *, PyObject *);
2264 : : static int object_init(PyObject *, PyObject *, PyObject *);
2265 : : static int update_slot(PyTypeObject *, PyObject *);
2266 : : static void fixup_slot_dispatchers(PyTypeObject *);
2267 : : static int type_new_set_names(PyTypeObject *);
2268 : : static int type_new_init_subclass(PyTypeObject *, PyObject *);
2269 : :
2270 : : /*
2271 : : * Helpers for __dict__ descriptor. We don't want to expose the dicts
2272 : : * inherited from various builtin types. The builtin base usually provides
2273 : : * its own __dict__ descriptor, so we use that when we can.
2274 : : */
2275 : : static PyTypeObject *
2276 : 227944 : get_builtin_base_with_dict(PyTypeObject *type)
2277 : : {
2278 [ + + ]: 912070 : while (type->tp_base != NULL) {
2279 [ + + ]: 684138 : if (type->tp_dictoffset != 0 &&
2280 [ + + ]: 653215 : !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
2281 : 12 : return type;
2282 : 684126 : type = type->tp_base;
2283 : : }
2284 : 227932 : return NULL;
2285 : : }
2286 : :
2287 : : static PyObject *
2288 : 12 : get_dict_descriptor(PyTypeObject *type)
2289 : : {
2290 : : PyObject *descr;
2291 : :
2292 : 12 : descr = _PyType_Lookup(type, &_Py_ID(__dict__));
2293 [ + - - + ]: 12 : if (descr == NULL || !PyDescr_IsData(descr))
2294 : 0 : return NULL;
2295 : :
2296 : 12 : return descr;
2297 : : }
2298 : :
2299 : : static void
2300 : 0 : raise_dict_descr_error(PyObject *obj)
2301 : : {
2302 : 0 : PyErr_Format(PyExc_TypeError,
2303 : : "this __dict__ descriptor does not support "
2304 : 0 : "'%.200s' objects", Py_TYPE(obj)->tp_name);
2305 : 0 : }
2306 : :
2307 : : static PyObject *
2308 : 227320 : subtype_dict(PyObject *obj, void *context)
2309 : : {
2310 : : PyTypeObject *base;
2311 : :
2312 : 227320 : base = get_builtin_base_with_dict(Py_TYPE(obj));
2313 [ + + ]: 227320 : if (base != NULL) {
2314 : : descrgetfunc func;
2315 : 2 : PyObject *descr = get_dict_descriptor(base);
2316 [ - + ]: 2 : if (descr == NULL) {
2317 : 0 : raise_dict_descr_error(obj);
2318 : 0 : return NULL;
2319 : : }
2320 : 2 : func = Py_TYPE(descr)->tp_descr_get;
2321 [ - + ]: 2 : if (func == NULL) {
2322 : 0 : raise_dict_descr_error(obj);
2323 : 0 : return NULL;
2324 : : }
2325 : 2 : return func(descr, obj, (PyObject *)(Py_TYPE(obj)));
2326 : : }
2327 : 227318 : return PyObject_GenericGetDict(obj, context);
2328 : : }
2329 : :
2330 : : static int
2331 : 624 : subtype_setdict(PyObject *obj, PyObject *value, void *context)
2332 : : {
2333 : : PyObject **dictptr;
2334 : : PyTypeObject *base;
2335 : :
2336 : 624 : base = get_builtin_base_with_dict(Py_TYPE(obj));
2337 [ + + ]: 624 : if (base != NULL) {
2338 : : descrsetfunc func;
2339 : 10 : PyObject *descr = get_dict_descriptor(base);
2340 [ - + ]: 10 : if (descr == NULL) {
2341 : 0 : raise_dict_descr_error(obj);
2342 : 0 : return -1;
2343 : : }
2344 : 10 : func = Py_TYPE(descr)->tp_descr_set;
2345 [ - + ]: 10 : if (func == NULL) {
2346 : 0 : raise_dict_descr_error(obj);
2347 : 0 : return -1;
2348 : : }
2349 : 10 : return func(descr, obj, value);
2350 : : }
2351 : : /* Almost like PyObject_GenericSetDict, but allow __dict__ to be deleted. */
2352 : 614 : dictptr = _PyObject_GetDictPtr(obj);
2353 [ - + ]: 614 : if (dictptr == NULL) {
2354 : 0 : PyErr_SetString(PyExc_AttributeError,
2355 : : "This object has no __dict__");
2356 : 0 : return -1;
2357 : : }
2358 [ + + + + ]: 614 : if (value != NULL && !PyDict_Check(value)) {
2359 : 3 : PyErr_Format(PyExc_TypeError,
2360 : : "__dict__ must be set to a dictionary, "
2361 : 3 : "not a '%.200s'", Py_TYPE(value)->tp_name);
2362 : 3 : return -1;
2363 : : }
2364 : 611 : Py_XINCREF(value);
2365 : 611 : Py_XSETREF(*dictptr, value);
2366 : 611 : return 0;
2367 : : }
2368 : :
2369 : : static PyObject *
2370 : 106 : subtype_getweakref(PyObject *obj, void *context)
2371 : : {
2372 : : PyObject **weaklistptr;
2373 : : PyObject *result;
2374 : 106 : PyTypeObject *type = Py_TYPE(obj);
2375 : :
2376 [ - + ]: 106 : if (type->tp_weaklistoffset == 0) {
2377 : 0 : PyErr_SetString(PyExc_AttributeError,
2378 : : "This object has no __weakref__");
2379 : 0 : return NULL;
2380 : : }
2381 : : _PyObject_ASSERT((PyObject *)type,
2382 : : type->tp_weaklistoffset > 0);
2383 : : _PyObject_ASSERT((PyObject *)type,
2384 : : ((type->tp_weaklistoffset + sizeof(PyObject *))
2385 : : <= (size_t)(type->tp_basicsize)));
2386 : 106 : weaklistptr = (PyObject **)((char *)obj + type->tp_weaklistoffset);
2387 [ + - ]: 106 : if (*weaklistptr == NULL)
2388 : 106 : result = Py_None;
2389 : : else
2390 : 0 : result = *weaklistptr;
2391 : 106 : Py_INCREF(result);
2392 : 106 : return result;
2393 : : }
2394 : :
2395 : : /* Three variants on the subtype_getsets list. */
2396 : :
2397 : : static PyGetSetDef subtype_getsets_full[] = {
2398 : : {"__dict__", subtype_dict, subtype_setdict,
2399 : : PyDoc_STR("dictionary for instance variables (if defined)")},
2400 : : {"__weakref__", subtype_getweakref, NULL,
2401 : : PyDoc_STR("list of weak references to the object (if defined)")},
2402 : : {0}
2403 : : };
2404 : :
2405 : : static PyGetSetDef subtype_getsets_dict_only[] = {
2406 : : {"__dict__", subtype_dict, subtype_setdict,
2407 : : PyDoc_STR("dictionary for instance variables (if defined)")},
2408 : : {0}
2409 : : };
2410 : :
2411 : : static PyGetSetDef subtype_getsets_weakref_only[] = {
2412 : : {"__weakref__", subtype_getweakref, NULL,
2413 : : PyDoc_STR("list of weak references to the object (if defined)")},
2414 : : {0}
2415 : : };
2416 : :
2417 : : static int
2418 : 142808 : valid_identifier(PyObject *s)
2419 : : {
2420 [ + + ]: 142808 : if (!PyUnicode_Check(s)) {
2421 : 3 : PyErr_Format(PyExc_TypeError,
2422 : : "__slots__ items must be strings, not '%.200s'",
2423 : 3 : Py_TYPE(s)->tp_name);
2424 : 3 : return 0;
2425 : : }
2426 [ + + ]: 142805 : if (!PyUnicode_IsIdentifier(s)) {
2427 : 8 : PyErr_SetString(PyExc_TypeError,
2428 : : "__slots__ must be identifiers");
2429 : 8 : return 0;
2430 : : }
2431 : 142797 : return 1;
2432 : : }
2433 : :
2434 : : static int
2435 : 1205061 : type_init(PyObject *cls, PyObject *args, PyObject *kwds)
2436 : : {
2437 : : assert(args != NULL && PyTuple_Check(args));
2438 : : assert(kwds == NULL || PyDict_Check(kwds));
2439 : :
2440 [ + + - + : 1205061 : if (kwds != NULL && PyTuple_GET_SIZE(args) == 1 &&
- - ]
2441 : 0 : PyDict_GET_SIZE(kwds) != 0) {
2442 : 0 : PyErr_SetString(PyExc_TypeError,
2443 : : "type.__init__() takes no keyword arguments");
2444 : 0 : return -1;
2445 : : }
2446 : :
2447 [ + - - + ]: 1205061 : if ((PyTuple_GET_SIZE(args) != 1 && PyTuple_GET_SIZE(args) != 3)) {
2448 : 0 : PyErr_SetString(PyExc_TypeError,
2449 : : "type.__init__() takes 1 or 3 arguments");
2450 : 0 : return -1;
2451 : : }
2452 : :
2453 : 1205061 : return 0;
2454 : : }
2455 : :
2456 : :
2457 : : unsigned long
2458 : 8 : PyType_GetFlags(PyTypeObject *type)
2459 : : {
2460 : 8 : return type->tp_flags;
2461 : : }
2462 : :
2463 : :
2464 : : int
2465 : 0 : PyType_SUPPORTS_WEAKREFS(PyTypeObject *type)
2466 : : {
2467 : 0 : return _PyType_SUPPORTS_WEAKREFS(type);
2468 : : }
2469 : :
2470 : :
2471 : : /* Determine the most derived metatype. */
2472 : : PyTypeObject *
2473 : 2021240 : _PyType_CalculateMetaclass(PyTypeObject *metatype, PyObject *bases)
2474 : : {
2475 : : Py_ssize_t i, nbases;
2476 : : PyTypeObject *winner;
2477 : : PyObject *tmp;
2478 : : PyTypeObject *tmptype;
2479 : :
2480 : : /* Determine the proper metatype to deal with this,
2481 : : and check for metatype conflicts while we're at it.
2482 : : Note that if some other metatype wins to contract,
2483 : : it's possible that its instances are not types. */
2484 : :
2485 : 2021240 : nbases = PyTuple_GET_SIZE(bases);
2486 : 2021240 : winner = metatype;
2487 [ + + ]: 4042857 : for (i = 0; i < nbases; i++) {
2488 : 2021624 : tmp = PyTuple_GET_ITEM(bases, i);
2489 : 2021624 : tmptype = Py_TYPE(tmp);
2490 [ + + ]: 2021624 : if (PyType_IsSubtype(winner, tmptype))
2491 : 1981568 : continue;
2492 [ + + ]: 40056 : if (PyType_IsSubtype(tmptype, winner)) {
2493 : 40049 : winner = tmptype;
2494 : 40049 : continue;
2495 : : }
2496 : : /* else: */
2497 : 7 : PyErr_SetString(PyExc_TypeError,
2498 : : "metaclass conflict: "
2499 : : "the metaclass of a derived class "
2500 : : "must be a (non-strict) subclass "
2501 : : "of the metaclasses of all its bases");
2502 : 7 : return NULL;
2503 : : }
2504 : 2021233 : return winner;
2505 : : }
2506 : :
2507 : :
2508 : : // Forward declaration
2509 : : static PyObject *
2510 : : type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds);
2511 : :
2512 : : typedef struct {
2513 : : PyTypeObject *metatype;
2514 : : PyObject *args;
2515 : : PyObject *kwds;
2516 : : PyObject *orig_dict;
2517 : : PyObject *name;
2518 : : PyObject *bases;
2519 : : PyTypeObject *base;
2520 : : PyObject *slots;
2521 : : Py_ssize_t nslot;
2522 : : int add_dict;
2523 : : int add_weak;
2524 : : int may_add_dict;
2525 : : int may_add_weak;
2526 : : } type_new_ctx;
2527 : :
2528 : :
2529 : : /* Check for valid slot names and two special cases */
2530 : : static int
2531 : 179379 : type_new_visit_slots(type_new_ctx *ctx)
2532 : : {
2533 : 179379 : PyObject *slots = ctx->slots;
2534 : 179379 : Py_ssize_t nslot = ctx->nslot;
2535 [ + + ]: 322172 : for (Py_ssize_t i = 0; i < nslot; i++) {
2536 : 142808 : PyObject *name = PyTuple_GET_ITEM(slots, i);
2537 [ + + ]: 142808 : if (!valid_identifier(name)) {
2538 : 11 : return -1;
2539 : : }
2540 : : assert(PyUnicode_Check(name));
2541 [ + + ]: 142797 : if (_PyUnicode_Equal(name, &_Py_ID(__dict__))) {
2542 [ + + + + ]: 2000 : if (!ctx->may_add_dict || ctx->add_dict != 0) {
2543 : 2 : PyErr_SetString(PyExc_TypeError,
2544 : : "__dict__ slot disallowed: "
2545 : : "we already got one");
2546 : 2 : return -1;
2547 : : }
2548 : 1998 : ctx->add_dict++;
2549 : : }
2550 [ + + ]: 142795 : if (_PyUnicode_Equal(name, &_Py_ID(__weakref__))) {
2551 [ + + + + ]: 8798 : if (!ctx->may_add_weak || ctx->add_weak != 0) {
2552 : 2 : PyErr_SetString(PyExc_TypeError,
2553 : : "__weakref__ slot disallowed: "
2554 : : "either we already got one, "
2555 : : "or __itemsize__ != 0");
2556 : 2 : return -1;
2557 : : }
2558 : 8796 : ctx->add_weak++;
2559 : : }
2560 : : }
2561 : 179364 : return 0;
2562 : : }
2563 : :
2564 : :
2565 : : /* Copy slots into a list, mangle names and sort them.
2566 : : Sorted names are needed for __class__ assignment.
2567 : : Convert them back to tuple at the end.
2568 : : */
2569 : : static PyObject*
2570 : 179364 : type_new_copy_slots(type_new_ctx *ctx, PyObject *dict)
2571 : : {
2572 : 179364 : PyObject *slots = ctx->slots;
2573 : 179364 : Py_ssize_t nslot = ctx->nslot;
2574 : :
2575 : 179364 : Py_ssize_t new_nslot = nslot - ctx->add_dict - ctx->add_weak;
2576 : 179364 : PyObject *new_slots = PyList_New(new_nslot);
2577 [ - + ]: 179364 : if (new_slots == NULL) {
2578 : 0 : return NULL;
2579 : : }
2580 : :
2581 : 179364 : Py_ssize_t j = 0;
2582 [ + + ]: 322153 : for (Py_ssize_t i = 0; i < nslot; i++) {
2583 : 142791 : PyObject *slot = PyTuple_GET_ITEM(slots, i);
2584 [ + + + + ]: 142791 : if ((ctx->add_dict && _PyUnicode_Equal(slot, &_Py_ID(__dict__))) ||
2585 [ + + + + ]: 140794 : (ctx->add_weak && _PyUnicode_Equal(slot, &_Py_ID(__weakref__))))
2586 : : {
2587 : 10792 : continue;
2588 : : }
2589 : :
2590 : 131999 : slot =_Py_Mangle(ctx->name, slot);
2591 [ - + ]: 131999 : if (!slot) {
2592 : 0 : goto error;
2593 : : }
2594 : 131999 : PyList_SET_ITEM(new_slots, j, slot);
2595 : :
2596 : 131999 : int r = PyDict_Contains(dict, slot);
2597 [ - + ]: 131999 : if (r < 0) {
2598 : 0 : goto error;
2599 : : }
2600 [ + + ]: 131999 : if (r > 0) {
2601 : : /* CPython inserts __qualname__ and __classcell__ (when needed)
2602 : : into the namespace when creating a class. They will be deleted
2603 : : below so won't act as class variables. */
2604 [ + + + + ]: 10 : if (!_PyUnicode_Equal(slot, &_Py_ID(__qualname__)) &&
2605 : 4 : !_PyUnicode_Equal(slot, &_Py_ID(__classcell__)))
2606 : : {
2607 : 2 : PyErr_Format(PyExc_ValueError,
2608 : : "%R in __slots__ conflicts with class variable",
2609 : : slot);
2610 : 2 : goto error;
2611 : : }
2612 : : }
2613 : :
2614 : 131997 : j++;
2615 : : }
2616 : : assert(j == new_nslot);
2617 : :
2618 [ - + ]: 179362 : if (PyList_Sort(new_slots) == -1) {
2619 : 0 : goto error;
2620 : : }
2621 : :
2622 : 179362 : PyObject *tuple = PyList_AsTuple(new_slots);
2623 : 179362 : Py_DECREF(new_slots);
2624 [ - + ]: 179362 : if (tuple == NULL) {
2625 : 0 : return NULL;
2626 : : }
2627 : :
2628 : : assert(PyTuple_GET_SIZE(tuple) == new_nslot);
2629 : 179362 : return tuple;
2630 : :
2631 : 2 : error:
2632 : 2 : Py_DECREF(new_slots);
2633 : 2 : return NULL;
2634 : : }
2635 : :
2636 : :
2637 : : static void
2638 : 179362 : type_new_slots_bases(type_new_ctx *ctx)
2639 : : {
2640 : 179362 : Py_ssize_t nbases = PyTuple_GET_SIZE(ctx->bases);
2641 [ + + ]: 179362 : if (nbases > 1 &&
2642 [ + + - + ]: 23371 : ((ctx->may_add_dict && ctx->add_dict == 0) ||
2643 [ + + + - ]: 3 : (ctx->may_add_weak && ctx->add_weak == 0)))
2644 : : {
2645 [ + + ]: 73217 : for (Py_ssize_t i = 0; i < nbases; i++) {
2646 : 49855 : PyObject *obj = PyTuple_GET_ITEM(ctx->bases, i);
2647 [ + + ]: 49855 : if (obj == (PyObject *)ctx->base) {
2648 : : /* Skip primary base */
2649 : 23369 : continue;
2650 : : }
2651 : 26486 : PyTypeObject *base = _PyType_CAST(obj);
2652 : :
2653 [ + + + - ]: 26486 : if (ctx->may_add_dict && ctx->add_dict == 0 &&
2654 [ + + ]: 26485 : base->tp_dictoffset != 0)
2655 : : {
2656 : 6 : ctx->add_dict++;
2657 : : }
2658 [ + + + + ]: 26486 : if (ctx->may_add_weak && ctx->add_weak == 0 &&
2659 [ + + ]: 21627 : base->tp_weaklistoffset != 0)
2660 : : {
2661 : 6 : ctx->add_weak++;
2662 : : }
2663 [ + + + + ]: 26486 : if (ctx->may_add_dict && ctx->add_dict == 0) {
2664 : 26479 : continue;
2665 : : }
2666 [ + + - + ]: 7 : if (ctx->may_add_weak && ctx->add_weak == 0) {
2667 : 0 : continue;
2668 : : }
2669 : : /* Nothing more to check */
2670 : 7 : break;
2671 : : }
2672 : : }
2673 : 179362 : }
2674 : :
2675 : :
2676 : : static int
2677 : 179380 : type_new_slots_impl(type_new_ctx *ctx, PyObject *dict)
2678 : : {
2679 : : /* Are slots allowed? */
2680 [ + + + + ]: 179380 : if (ctx->nslot > 0 && ctx->base->tp_itemsize != 0) {
2681 : 1 : PyErr_Format(PyExc_TypeError,
2682 : : "nonempty __slots__ not supported for subtype of '%s'",
2683 : 1 : ctx->base->tp_name);
2684 : 1 : return -1;
2685 : : }
2686 : :
2687 [ + + ]: 179379 : if (type_new_visit_slots(ctx) < 0) {
2688 : 15 : return -1;
2689 : : }
2690 : :
2691 : 179364 : PyObject *new_slots = type_new_copy_slots(ctx, dict);
2692 [ + + ]: 179364 : if (new_slots == NULL) {
2693 : 2 : return -1;
2694 : : }
2695 : : assert(PyTuple_CheckExact(new_slots));
2696 : :
2697 : 179362 : Py_XSETREF(ctx->slots, new_slots);
2698 : 179362 : ctx->nslot = PyTuple_GET_SIZE(new_slots);
2699 : :
2700 : : /* Secondary bases may provide weakrefs or dict */
2701 : 179362 : type_new_slots_bases(ctx);
2702 : 179362 : return 0;
2703 : : }
2704 : :
2705 : :
2706 : : static Py_ssize_t
2707 : 1216618 : type_new_slots(type_new_ctx *ctx, PyObject *dict)
2708 : : {
2709 : : // Check for a __slots__ sequence variable in dict, and count it
2710 : 1216618 : ctx->add_dict = 0;
2711 : 1216618 : ctx->add_weak = 0;
2712 : 1216618 : ctx->may_add_dict = (ctx->base->tp_dictoffset == 0);
2713 : 2433236 : ctx->may_add_weak = (ctx->base->tp_weaklistoffset == 0
2714 [ + + + + ]: 1216618 : && ctx->base->tp_itemsize == 0);
2715 : :
2716 [ + + ]: 1216618 : if (ctx->slots == NULL) {
2717 [ + + ]: 1037238 : if (ctx->may_add_dict) {
2718 : 405457 : ctx->add_dict++;
2719 : : }
2720 [ + + ]: 1037238 : if (ctx->may_add_weak) {
2721 : 496598 : ctx->add_weak++;
2722 : : }
2723 : : }
2724 : : else {
2725 : : /* Have slots */
2726 [ + + ]: 179380 : if (type_new_slots_impl(ctx, dict) < 0) {
2727 : 18 : return -1;
2728 : : }
2729 : : }
2730 : 1216600 : return 0;
2731 : : }
2732 : :
2733 : :
2734 : : static PyTypeObject*
2735 : 1216600 : type_new_alloc(type_new_ctx *ctx)
2736 : : {
2737 : 1216600 : PyTypeObject *metatype = ctx->metatype;
2738 : : PyTypeObject *type;
2739 : :
2740 : : // Allocate the type object
2741 : 1216600 : type = (PyTypeObject *)metatype->tp_alloc(metatype, ctx->nslot);
2742 [ - + ]: 1216600 : if (type == NULL) {
2743 : 0 : return NULL;
2744 : : }
2745 : 1216600 : PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2746 : :
2747 : : // Initialize tp_flags.
2748 : : // All heap types need GC, since we can create a reference cycle by storing
2749 : : // an instance on one of its parents.
2750 : 1216600 : type->tp_flags = (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HEAPTYPE |
2751 : : Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC);
2752 : :
2753 : : // Initialize essential fields
2754 : 1216600 : type->tp_as_async = &et->as_async;
2755 : 1216600 : type->tp_as_number = &et->as_number;
2756 : 1216600 : type->tp_as_sequence = &et->as_sequence;
2757 : 1216600 : type->tp_as_mapping = &et->as_mapping;
2758 : 1216600 : type->tp_as_buffer = &et->as_buffer;
2759 : :
2760 : 1216600 : type->tp_bases = Py_NewRef(ctx->bases);
2761 : 1216600 : type->tp_base = (PyTypeObject *)Py_NewRef(ctx->base);
2762 : :
2763 : 1216600 : type->tp_dealloc = subtype_dealloc;
2764 : : /* Always override allocation strategy to use regular heap */
2765 : 1216600 : type->tp_alloc = PyType_GenericAlloc;
2766 : 1216600 : type->tp_free = PyObject_GC_Del;
2767 : :
2768 : 1216600 : type->tp_traverse = subtype_traverse;
2769 : 1216600 : type->tp_clear = subtype_clear;
2770 : :
2771 : 1216600 : et->ht_name = Py_NewRef(ctx->name);
2772 : 1216600 : et->ht_module = NULL;
2773 : 1216600 : et->_ht_tpname = NULL;
2774 : :
2775 : 1216600 : return type;
2776 : : }
2777 : :
2778 : :
2779 : : static int
2780 : 1216600 : type_new_set_name(const type_new_ctx *ctx, PyTypeObject *type)
2781 : : {
2782 : : Py_ssize_t name_size;
2783 : 1216600 : type->tp_name = PyUnicode_AsUTF8AndSize(ctx->name, &name_size);
2784 [ + + ]: 1216600 : if (!type->tp_name) {
2785 : 1 : return -1;
2786 : : }
2787 [ + + ]: 1216599 : if (strlen(type->tp_name) != (size_t)name_size) {
2788 : 1 : PyErr_SetString(PyExc_ValueError,
2789 : : "type name must not contain null characters");
2790 : 1 : return -1;
2791 : : }
2792 : 1216598 : return 0;
2793 : : }
2794 : :
2795 : :
2796 : : /* Set __module__ in the dict */
2797 : : static int
2798 : 1216598 : type_new_set_module(PyTypeObject *type)
2799 : : {
2800 : 1216598 : int r = PyDict_Contains(type->tp_dict, &_Py_ID(__module__));
2801 [ - + ]: 1216598 : if (r < 0) {
2802 : 0 : return -1;
2803 : : }
2804 [ + + ]: 1216598 : if (r > 0) {
2805 : 1162772 : return 0;
2806 : : }
2807 : :
2808 : 53826 : PyObject *globals = PyEval_GetGlobals();
2809 [ - + ]: 53826 : if (globals == NULL) {
2810 : 0 : return 0;
2811 : : }
2812 : :
2813 : 53826 : PyObject *module = PyDict_GetItemWithError(globals, &_Py_ID(__name__));
2814 [ - + ]: 53826 : if (module == NULL) {
2815 [ # # ]: 0 : if (PyErr_Occurred()) {
2816 : 0 : return -1;
2817 : : }
2818 : 0 : return 0;
2819 : : }
2820 : :
2821 [ - + ]: 53826 : if (PyDict_SetItem(type->tp_dict, &_Py_ID(__module__), module) < 0) {
2822 : 0 : return -1;
2823 : : }
2824 : 53826 : return 0;
2825 : : }
2826 : :
2827 : :
2828 : : /* Set ht_qualname to dict['__qualname__'] if available, else to
2829 : : __name__. The __qualname__ accessor will look for ht_qualname. */
2830 : : static int
2831 : 1216598 : type_new_set_ht_name(PyTypeObject *type)
2832 : : {
2833 : 1216598 : PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2834 : 1216598 : PyObject *qualname = PyDict_GetItemWithError(
2835 : : type->tp_dict, &_Py_ID(__qualname__));
2836 [ + + ]: 1216598 : if (qualname != NULL) {
2837 [ + + ]: 939381 : if (!PyUnicode_Check(qualname)) {
2838 : 3 : PyErr_Format(PyExc_TypeError,
2839 : : "type __qualname__ must be a str, not %s",
2840 : 3 : Py_TYPE(qualname)->tp_name);
2841 : 3 : return -1;
2842 : : }
2843 : 939378 : et->ht_qualname = Py_NewRef(qualname);
2844 [ - + ]: 939378 : if (PyDict_DelItem(type->tp_dict, &_Py_ID(__qualname__)) < 0) {
2845 : 0 : return -1;
2846 : : }
2847 : : }
2848 : : else {
2849 [ - + ]: 277217 : if (PyErr_Occurred()) {
2850 : 0 : return -1;
2851 : : }
2852 : 277217 : et->ht_qualname = Py_NewRef(et->ht_name);
2853 : : }
2854 : 1216595 : return 0;
2855 : : }
2856 : :
2857 : :
2858 : : /* Set tp_doc to a copy of dict['__doc__'], if the latter is there
2859 : : and is a string. The __doc__ accessor will first look for tp_doc;
2860 : : if that fails, it will still look into __dict__. */
2861 : : static int
2862 : 1216595 : type_new_set_doc(PyTypeObject *type)
2863 : : {
2864 : 1216595 : PyObject *doc = PyDict_GetItemWithError(type->tp_dict, &_Py_ID(__doc__));
2865 [ + + ]: 1216595 : if (doc == NULL) {
2866 [ - + ]: 470338 : if (PyErr_Occurred()) {
2867 : 0 : return -1;
2868 : : }
2869 : : // no __doc__ key
2870 : 470338 : return 0;
2871 : : }
2872 [ + + ]: 746257 : if (!PyUnicode_Check(doc)) {
2873 : : // ignore non-string __doc__
2874 : 72 : return 0;
2875 : : }
2876 : :
2877 : 746185 : const char *doc_str = PyUnicode_AsUTF8(doc);
2878 [ + + ]: 746185 : if (doc_str == NULL) {
2879 : 1 : return -1;
2880 : : }
2881 : :
2882 : : // Silently truncate the docstring if it contains a null byte
2883 : 746184 : Py_ssize_t size = strlen(doc_str) + 1;
2884 : 746184 : char *tp_doc = (char *)PyObject_Malloc(size);
2885 [ - + ]: 746184 : if (tp_doc == NULL) {
2886 : : PyErr_NoMemory();
2887 : 0 : return -1;
2888 : : }
2889 : :
2890 : 746184 : memcpy(tp_doc, doc_str, size);
2891 : 746184 : type->tp_doc = tp_doc;
2892 : 746184 : return 0;
2893 : : }
2894 : :
2895 : :
2896 : : static int
2897 : 1216594 : type_new_staticmethod(PyTypeObject *type, PyObject *attr)
2898 : : {
2899 : 1216594 : PyObject *func = PyDict_GetItemWithError(type->tp_dict, attr);
2900 [ + + ]: 1216594 : if (func == NULL) {
2901 [ - + ]: 1144705 : if (PyErr_Occurred()) {
2902 : 0 : return -1;
2903 : : }
2904 : 1144705 : return 0;
2905 : : }
2906 [ + + ]: 71889 : if (!PyFunction_Check(func)) {
2907 : 172 : return 0;
2908 : : }
2909 : :
2910 : 71717 : PyObject *static_func = PyStaticMethod_New(func);
2911 [ - + ]: 71717 : if (static_func == NULL) {
2912 : 0 : return -1;
2913 : : }
2914 [ - + ]: 71717 : if (PyDict_SetItem(type->tp_dict, attr, static_func) < 0) {
2915 : 0 : Py_DECREF(static_func);
2916 : 0 : return -1;
2917 : : }
2918 : 71717 : Py_DECREF(static_func);
2919 : 71717 : return 0;
2920 : : }
2921 : :
2922 : :
2923 : : static int
2924 : 2433188 : type_new_classmethod(PyTypeObject *type, PyObject *attr)
2925 : : {
2926 : 2433188 : PyObject *func = PyDict_GetItemWithError(type->tp_dict, attr);
2927 [ + + ]: 2433188 : if (func == NULL) {
2928 [ - + ]: 2378082 : if (PyErr_Occurred()) {
2929 : 0 : return -1;
2930 : : }
2931 : 2378082 : return 0;
2932 : : }
2933 [ + + ]: 55106 : if (!PyFunction_Check(func)) {
2934 : 46621 : return 0;
2935 : : }
2936 : :
2937 : 8485 : PyObject *method = PyClassMethod_New(func);
2938 [ - + ]: 8485 : if (method == NULL) {
2939 : 0 : return -1;
2940 : : }
2941 : :
2942 [ - + ]: 8485 : if (PyDict_SetItem(type->tp_dict, attr, method) < 0) {
2943 : 0 : Py_DECREF(method);
2944 : 0 : return -1;
2945 : : }
2946 : 8485 : Py_DECREF(method);
2947 : 8485 : return 0;
2948 : : }
2949 : :
2950 : :
2951 : : /* Add descriptors for custom slots from __slots__, or for __dict__ */
2952 : : static int
2953 : 1216594 : type_new_descriptors(const type_new_ctx *ctx, PyTypeObject *type)
2954 : : {
2955 : 1216594 : PyHeapTypeObject *et = (PyHeapTypeObject *)type;
2956 : 1216594 : Py_ssize_t slotoffset = ctx->base->tp_basicsize;
2957 [ + + ]: 1216594 : if (et->ht_slots != NULL) {
2958 : 179361 : PyMemberDef *mp = _PyHeapType_GET_MEMBERS(et);
2959 : 179361 : Py_ssize_t nslot = PyTuple_GET_SIZE(et->ht_slots);
2960 [ + + ]: 311357 : for (Py_ssize_t i = 0; i < nslot; i++, mp++) {
2961 : 263992 : mp->name = PyUnicode_AsUTF8(
2962 : 131996 : PyTuple_GET_ITEM(et->ht_slots, i));
2963 [ - + ]: 131996 : if (mp->name == NULL) {
2964 : 0 : return -1;
2965 : : }
2966 : 131996 : mp->type = T_OBJECT_EX;
2967 : 131996 : mp->offset = slotoffset;
2968 : :
2969 : : /* __dict__ and __weakref__ are already filtered out */
2970 : : assert(strcmp(mp->name, "__dict__") != 0);
2971 : : assert(strcmp(mp->name, "__weakref__") != 0);
2972 : :
2973 : 131996 : slotoffset += sizeof(PyObject *);
2974 : : }
2975 : : }
2976 : :
2977 [ + + + + ]: 1216594 : if (ctx->add_dict && ctx->base->tp_itemsize) {
2978 : 17456 : type->tp_dictoffset = -(long)sizeof(PyObject *);
2979 : 17456 : slotoffset += sizeof(PyObject *);
2980 : : }
2981 : :
2982 [ + + ]: 1216594 : if (ctx->add_weak) {
2983 : : assert(!ctx->base->tp_itemsize);
2984 : 505394 : type->tp_weaklistoffset = slotoffset;
2985 : 505394 : slotoffset += sizeof(PyObject *);
2986 : : }
2987 [ + + + + ]: 1216594 : if (ctx->add_dict && ctx->base->tp_itemsize == 0) {
2988 : : assert((type->tp_flags & Py_TPFLAGS_MANAGED_DICT) == 0);
2989 : 389999 : type->tp_flags |= Py_TPFLAGS_MANAGED_DICT;
2990 : 389999 : type->tp_dictoffset = -slotoffset - sizeof(PyObject *)*3;
2991 : : }
2992 : :
2993 : 1216594 : type->tp_basicsize = slotoffset;
2994 : 1216594 : type->tp_itemsize = ctx->base->tp_itemsize;
2995 : 1216594 : type->tp_members = _PyHeapType_GET_MEMBERS(et);
2996 : 1216594 : return 0;
2997 : : }
2998 : :
2999 : :
3000 : : static void
3001 : 1216594 : type_new_set_slots(const type_new_ctx *ctx, PyTypeObject *type)
3002 : : {
3003 [ + + + + ]: 1216594 : if (type->tp_weaklistoffset && type->tp_dictoffset) {
3004 : 381385 : type->tp_getset = subtype_getsets_full;
3005 : : }
3006 [ + + + - ]: 835209 : else if (type->tp_weaklistoffset && !type->tp_dictoffset) {
3007 : 124009 : type->tp_getset = subtype_getsets_weakref_only;
3008 : : }
3009 [ + - + + ]: 711200 : else if (!type->tp_weaklistoffset && type->tp_dictoffset) {
3010 : 26070 : type->tp_getset = subtype_getsets_dict_only;
3011 : : }
3012 : : else {
3013 : 685130 : type->tp_getset = NULL;
3014 : : }
3015 : :
3016 : : /* Special case some slots */
3017 [ + + + + ]: 1216594 : if (type->tp_dictoffset != 0 || ctx->nslot > 0) {
3018 : 443384 : PyTypeObject *base = ctx->base;
3019 [ + - - + ]: 443384 : if (base->tp_getattr == NULL && base->tp_getattro == NULL) {
3020 : 0 : type->tp_getattro = PyObject_GenericGetAttr;
3021 : : }
3022 [ + - - + ]: 443384 : if (base->tp_setattr == NULL && base->tp_setattro == NULL) {
3023 : 0 : type->tp_setattro = PyObject_GenericSetAttr;
3024 : : }
3025 : : }
3026 : 1216594 : }
3027 : :
3028 : :
3029 : : /* store type in class' cell if one is supplied */
3030 : : static int
3031 : 1216594 : type_new_set_classcell(PyTypeObject *type)
3032 : : {
3033 : 1216594 : PyObject *cell = PyDict_GetItemWithError(
3034 : : type->tp_dict, &_Py_ID(__classcell__));
3035 [ + + ]: 1216594 : if (cell == NULL) {
3036 [ - + ]: 1098117 : if (PyErr_Occurred()) {
3037 : 0 : return -1;
3038 : : }
3039 : 1098117 : return 0;
3040 : : }
3041 : :
3042 : : /* At least one method requires a reference to its defining class */
3043 [ + + ]: 118477 : if (!PyCell_Check(cell)) {
3044 : 5 : PyErr_Format(PyExc_TypeError,
3045 : : "__classcell__ must be a nonlocal cell, not %.200R",
3046 : : Py_TYPE(cell));
3047 : 5 : return -1;
3048 : : }
3049 : :
3050 : 118472 : (void)PyCell_Set(cell, (PyObject *) type);
3051 [ - + ]: 118472 : if (PyDict_DelItem(type->tp_dict, &_Py_ID(__classcell__)) < 0) {
3052 : 0 : return -1;
3053 : : }
3054 : 118472 : return 0;
3055 : : }
3056 : :
3057 : :
3058 : : static int
3059 : 1216600 : type_new_set_attrs(const type_new_ctx *ctx, PyTypeObject *type)
3060 : : {
3061 [ + + ]: 1216600 : if (type_new_set_name(ctx, type) < 0) {
3062 : 2 : return -1;
3063 : : }
3064 : :
3065 [ - + ]: 1216598 : if (type_new_set_module(type) < 0) {
3066 : 0 : return -1;
3067 : : }
3068 : :
3069 [ + + ]: 1216598 : if (type_new_set_ht_name(type) < 0) {
3070 : 3 : return -1;
3071 : : }
3072 : :
3073 [ + + ]: 1216595 : if (type_new_set_doc(type) < 0) {
3074 : 1 : return -1;
3075 : : }
3076 : :
3077 : : /* Special-case __new__: if it's a plain function,
3078 : : make it a static function */
3079 [ - + ]: 1216594 : if (type_new_staticmethod(type, &_Py_ID(__new__)) < 0) {
3080 : 0 : return -1;
3081 : : }
3082 : :
3083 : : /* Special-case __init_subclass__ and __class_getitem__:
3084 : : if they are plain functions, make them classmethods */
3085 [ - + ]: 1216594 : if (type_new_classmethod(type, &_Py_ID(__init_subclass__)) < 0) {
3086 : 0 : return -1;
3087 : : }
3088 [ - + ]: 1216594 : if (type_new_classmethod(type, &_Py_ID(__class_getitem__)) < 0) {
3089 : 0 : return -1;
3090 : : }
3091 : :
3092 [ - + ]: 1216594 : if (type_new_descriptors(ctx, type) < 0) {
3093 : 0 : return -1;
3094 : : }
3095 : :
3096 : 1216594 : type_new_set_slots(ctx, type);
3097 : :
3098 [ + + ]: 1216594 : if (type_new_set_classcell(type) < 0) {
3099 : 5 : return -1;
3100 : : }
3101 : 1216589 : return 0;
3102 : : }
3103 : :
3104 : :
3105 : : static int
3106 : 1216619 : type_new_get_slots(type_new_ctx *ctx, PyObject *dict)
3107 : : {
3108 : 1216619 : PyObject *slots = PyDict_GetItemWithError(dict, &_Py_ID(__slots__));
3109 [ + + ]: 1216619 : if (slots == NULL) {
3110 [ - + ]: 1037238 : if (PyErr_Occurred()) {
3111 : 0 : return -1;
3112 : : }
3113 : 1037238 : ctx->slots = NULL;
3114 : 1037238 : ctx->nslot = 0;
3115 : 1037238 : return 0;
3116 : : }
3117 : :
3118 : : // Make it into a tuple
3119 : : PyObject *new_slots;
3120 [ + + ]: 179381 : if (PyUnicode_Check(slots)) {
3121 : 2003 : new_slots = PyTuple_Pack(1, slots);
3122 : : }
3123 : : else {
3124 : 177378 : new_slots = PySequence_Tuple(slots);
3125 : : }
3126 [ + + ]: 179381 : if (new_slots == NULL) {
3127 : 1 : return -1;
3128 : : }
3129 : : assert(PyTuple_CheckExact(new_slots));
3130 : 179380 : ctx->slots = new_slots;
3131 : 179380 : ctx->nslot = PyTuple_GET_SIZE(new_slots);
3132 : 179380 : return 0;
3133 : : }
3134 : :
3135 : :
3136 : : static PyTypeObject*
3137 : 1216619 : type_new_init(type_new_ctx *ctx)
3138 : : {
3139 : 1216619 : PyObject *dict = PyDict_Copy(ctx->orig_dict);
3140 [ - + ]: 1216619 : if (dict == NULL) {
3141 : 0 : goto error;
3142 : : }
3143 : :
3144 [ + + ]: 1216619 : if (type_new_get_slots(ctx, dict) < 0) {
3145 : 1 : goto error;
3146 : : }
3147 : : assert(!PyErr_Occurred());
3148 : :
3149 [ + + ]: 1216618 : if (type_new_slots(ctx, dict) < 0) {
3150 : 18 : goto error;
3151 : : }
3152 : :
3153 : 1216600 : PyTypeObject *type = type_new_alloc(ctx);
3154 [ - + ]: 1216600 : if (type == NULL) {
3155 : 0 : goto error;
3156 : : }
3157 : :
3158 : 1216600 : type->tp_dict = dict;
3159 : :
3160 : 1216600 : PyHeapTypeObject *et = (PyHeapTypeObject*)type;
3161 : 1216600 : et->ht_slots = ctx->slots;
3162 : 1216600 : ctx->slots = NULL;
3163 : :
3164 : 1216600 : return type;
3165 : :
3166 : 19 : error:
3167 [ + + ]: 19 : Py_CLEAR(ctx->slots);
3168 : 19 : Py_XDECREF(dict);
3169 : 19 : return NULL;
3170 : : }
3171 : :
3172 : :
3173 : : static PyObject*
3174 : 1216619 : type_new_impl(type_new_ctx *ctx)
3175 : : {
3176 : 1216619 : PyTypeObject *type = type_new_init(ctx);
3177 [ + + ]: 1216619 : if (type == NULL) {
3178 : 19 : return NULL;
3179 : : }
3180 : :
3181 [ + + ]: 1216600 : if (type_new_set_attrs(ctx, type) < 0) {
3182 : 11 : goto error;
3183 : : }
3184 : :
3185 : : /* Initialize the rest */
3186 [ + + ]: 1216589 : if (PyType_Ready(type) < 0) {
3187 : 16 : goto error;
3188 : : }
3189 : :
3190 : : // Put the proper slots in place
3191 : 1216573 : fixup_slot_dispatchers(type);
3192 : :
3193 [ + + ]: 1216573 : if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
3194 : 670556 : PyHeapTypeObject *et = (PyHeapTypeObject*)type;
3195 : 670556 : et->ht_cached_keys = _PyDict_NewKeysForClass();
3196 : : }
3197 : :
3198 [ + + ]: 1216573 : if (type_new_set_names(type) < 0) {
3199 : 12 : goto error;
3200 : : }
3201 : :
3202 [ + + ]: 1216561 : if (type_new_init_subclass(type, ctx->kwds) < 0) {
3203 : 44 : goto error;
3204 : : }
3205 : :
3206 : : assert(_PyType_CheckConsistency(type));
3207 : :
3208 : 1216517 : return (PyObject *)type;
3209 : :
3210 : 83 : error:
3211 : 83 : Py_DECREF(type);
3212 : 83 : return NULL;
3213 : : }
3214 : :
3215 : :
3216 : : static int
3217 : 1233673 : type_new_get_bases(type_new_ctx *ctx, PyObject **type)
3218 : : {
3219 : 1233673 : Py_ssize_t nbases = PyTuple_GET_SIZE(ctx->bases);
3220 [ + + ]: 1233673 : if (nbases == 0) {
3221 : : // Adjust for empty tuple bases
3222 : 265751 : ctx->base = &PyBaseObject_Type;
3223 : 265751 : PyObject *new_bases = PyTuple_Pack(1, ctx->base);
3224 [ - + ]: 265751 : if (new_bases == NULL) {
3225 : 0 : return -1;
3226 : : }
3227 : 265751 : ctx->bases = new_bases;
3228 : 265751 : return 0;
3229 : : }
3230 : :
3231 [ + + ]: 2075891 : for (Py_ssize_t i = 0; i < nbases; i++) {
3232 : 1107970 : PyObject *base = PyTuple_GET_ITEM(ctx->bases, i);
3233 [ + + ]: 1107970 : if (PyType_Check(base)) {
3234 : 1107968 : continue;
3235 : : }
3236 : : PyObject *mro_entries;
3237 [ - + ]: 2 : if (_PyObject_LookupAttr(base, &_Py_ID(__mro_entries__),
3238 : : &mro_entries) < 0) {
3239 : 1 : return -1;
3240 : : }
3241 [ + + ]: 2 : if (mro_entries != NULL) {
3242 : 1 : PyErr_SetString(PyExc_TypeError,
3243 : : "type() doesn't support MRO entry resolution; "
3244 : : "use types.new_class()");
3245 : 1 : Py_DECREF(mro_entries);
3246 : 1 : return -1;
3247 : : }
3248 : : }
3249 : :
3250 : : // Search the bases for the proper metatype to deal with this
3251 : : PyTypeObject *winner;
3252 : 967921 : winner = _PyType_CalculateMetaclass(ctx->metatype, ctx->bases);
3253 [ + + ]: 967921 : if (winner == NULL) {
3254 : 1 : return -1;
3255 : : }
3256 : :
3257 [ + + ]: 967920 : if (winner != ctx->metatype) {
3258 [ + - ]: 17037 : if (winner->tp_new != type_new) {
3259 : : /* Pass it to the winner */
3260 : 17037 : *type = winner->tp_new(winner, ctx->args, ctx->kwds);
3261 [ + + ]: 17037 : if (*type == NULL) {
3262 : 1 : return -1;
3263 : : }
3264 : 17036 : return 1;
3265 : : }
3266 : :
3267 : 0 : ctx->metatype = winner;
3268 : : }
3269 : :
3270 : : /* Calculate best base, and check that all bases are type objects */
3271 : 950883 : PyTypeObject *base = best_base(ctx->bases);
3272 [ + + ]: 950883 : if (base == NULL) {
3273 : 15 : return -1;
3274 : : }
3275 : :
3276 : 950868 : ctx->base = base;
3277 : 950868 : ctx->bases = Py_NewRef(ctx->bases);
3278 : 950868 : return 0;
3279 : : }
3280 : :
3281 : :
3282 : : static PyObject *
3283 : 1233680 : type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
3284 : : {
3285 : : assert(args != NULL && PyTuple_Check(args));
3286 : : assert(kwds == NULL || PyDict_Check(kwds));
3287 : :
3288 : : /* Parse arguments: (name, bases, dict) */
3289 : : PyObject *name, *bases, *orig_dict;
3290 [ + + ]: 1233680 : if (!PyArg_ParseTuple(args, "UO!O!:type.__new__",
3291 : : &name,
3292 : : &PyTuple_Type, &bases,
3293 : : &PyDict_Type, &orig_dict))
3294 : : {
3295 : 7 : return NULL;
3296 : : }
3297 : :
3298 : 1233673 : type_new_ctx ctx = {
3299 : : .metatype = metatype,
3300 : : .args = args,
3301 : : .kwds = kwds,
3302 : : .orig_dict = orig_dict,
3303 : : .name = name,
3304 : : .bases = bases,
3305 : : .base = NULL,
3306 : : .slots = NULL,
3307 : : .nslot = 0,
3308 : : .add_dict = 0,
3309 : : .add_weak = 0,
3310 : : .may_add_dict = 0,
3311 : : .may_add_weak = 0};
3312 : 1233673 : PyObject *type = NULL;
3313 : 1233673 : int res = type_new_get_bases(&ctx, &type);
3314 [ + + ]: 1233673 : if (res < 0) {
3315 : : assert(PyErr_Occurred());
3316 : 18 : return NULL;
3317 : : }
3318 [ + + ]: 1233655 : if (res == 1) {
3319 : : assert(type != NULL);
3320 : 17036 : return type;
3321 : : }
3322 : : assert(ctx.base != NULL);
3323 : : assert(ctx.bases != NULL);
3324 : :
3325 : 1216619 : type = type_new_impl(&ctx);
3326 : 1216619 : Py_DECREF(ctx.bases);
3327 : 1216619 : return type;
3328 : : }
3329 : :
3330 : :
3331 : : static PyObject *
3332 : 1523709 : type_vectorcall(PyObject *metatype, PyObject *const *args,
3333 : : size_t nargsf, PyObject *kwnames)
3334 : : {
3335 : 1523709 : Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
3336 [ + + + - ]: 1523709 : if (nargs == 1 && metatype == (PyObject *)&PyType_Type){
3337 [ - + - - ]: 528463 : if (!_PyArg_NoKwnames("type", kwnames)) {
3338 : 0 : return NULL;
3339 : : }
3340 : 528463 : return Py_NewRef(Py_TYPE(args[0]));
3341 : : }
3342 : : /* In other (much less common) cases, fall back to
3343 : : more flexible calling conventions. */
3344 : 995246 : PyThreadState *tstate = _PyThreadState_GET();
3345 : 995246 : return _PyObject_MakeTpCall(tstate, metatype, args, nargs, kwnames);
3346 : : }
3347 : :
3348 : : /* An array of type slot offsets corresponding to Py_tp_* constants,
3349 : : * for use in e.g. PyType_Spec and PyType_GetSlot.
3350 : : * Each entry has two offsets: "slot_offset" and "subslot_offset".
3351 : : * If is subslot_offset is -1, slot_offset is an offset within the
3352 : : * PyTypeObject struct.
3353 : : * Otherwise slot_offset is an offset to a pointer to a sub-slots struct
3354 : : * (such as "tp_as_number"), and subslot_offset is the offset within
3355 : : * that struct.
3356 : : * The actual table is generated by a script.
3357 : : */
3358 : : static const PySlot_Offset pyslot_offsets[] = {
3359 : : {0, 0},
3360 : : #include "typeslots.inc"
3361 : : };
3362 : :
3363 : : /* Given a PyType_FromMetaclass `bases` argument (NULL, type, or tuple of
3364 : : * types), return a tuple of types.
3365 : : */
3366 : : inline static PyObject *
3367 : 115791 : get_bases_tuple(PyObject *bases_in, PyType_Spec *spec)
3368 : : {
3369 [ + + ]: 115791 : if (!bases_in) {
3370 : : /* Default: look in the spec, fall back to (type,). */
3371 : 78345 : PyTypeObject *base = &PyBaseObject_Type; // borrowed ref
3372 : 78345 : PyObject *bases = NULL; // borrowed ref
3373 : : const PyType_Slot *slot;
3374 [ + + ]: 571277 : for (slot = spec->slots; slot->slot; slot++) {
3375 [ + - + ]: 492932 : switch (slot->slot) {
3376 : 23 : case Py_tp_base:
3377 : 23 : base = slot->pfunc;
3378 : 23 : break;
3379 : 0 : case Py_tp_bases:
3380 : 0 : bases = slot->pfunc;
3381 : 0 : break;
3382 : : }
3383 : : }
3384 [ + - ]: 78345 : if (!bases) {
3385 : 78345 : return PyTuple_Pack(1, base);
3386 : : }
3387 [ # # ]: 0 : if (PyTuple_Check(bases)) {
3388 : 0 : return Py_NewRef(bases);
3389 : : }
3390 : 0 : PyErr_SetString(PyExc_SystemError, "Py_tp_bases is not a tuple");
3391 : 0 : return NULL;
3392 : : }
3393 [ + + ]: 37446 : if (PyTuple_Check(bases_in)) {
3394 : 2358 : return Py_NewRef(bases_in);
3395 : : }
3396 : : // Not a tuple, should be a single type
3397 : 35088 : return PyTuple_Pack(1, bases_in);
3398 : : }
3399 : :
3400 : : static inline int
3401 : 115789 : check_basicsize_includes_size_and_offsets(PyTypeObject* type)
3402 : : {
3403 [ - + ]: 115789 : if (type->tp_alloc != PyType_GenericAlloc) {
3404 : : // Custom allocators can ignore tp_basicsize
3405 : 0 : return 1;
3406 : : }
3407 : 115789 : Py_ssize_t max = (Py_ssize_t)type->tp_basicsize;
3408 : :
3409 [ + - - + ]: 115789 : if (type->tp_base && type->tp_base->tp_basicsize > type->tp_basicsize) {
3410 : 0 : PyErr_Format(PyExc_TypeError,
3411 : : "tp_basicsize for type '%s' (%d) is too small for base '%s' (%d)",
3412 : : type->tp_name, type->tp_basicsize,
3413 : 0 : type->tp_base->tp_name, type->tp_base->tp_basicsize);
3414 : 0 : return 0;
3415 : : }
3416 [ - + ]: 115789 : if (type->tp_weaklistoffset + (Py_ssize_t)sizeof(PyObject*) > max) {
3417 : 0 : PyErr_Format(PyExc_TypeError,
3418 : : "weaklist offset %d is out of bounds for type '%s' (tp_basicsize = %d)",
3419 : : type->tp_weaklistoffset,
3420 : : type->tp_name, type->tp_basicsize);
3421 : 0 : return 0;
3422 : : }
3423 [ - + ]: 115789 : if (type->tp_dictoffset + (Py_ssize_t)sizeof(PyObject*) > max) {
3424 : 0 : PyErr_Format(PyExc_TypeError,
3425 : : "dict offset %d is out of bounds for type '%s' (tp_basicsize = %d)",
3426 : : type->tp_dictoffset,
3427 : : type->tp_name, type->tp_basicsize);
3428 : 0 : return 0;
3429 : : }
3430 [ - + ]: 115789 : if (type->tp_vectorcall_offset + (Py_ssize_t)sizeof(vectorcallfunc*) > max) {
3431 : 0 : PyErr_Format(PyExc_TypeError,
3432 : : "vectorcall offset %d is out of bounds for type '%s' (tp_basicsize = %d)",
3433 : : type->tp_vectorcall_offset,
3434 : : type->tp_name, type->tp_basicsize);
3435 : 0 : return 0;
3436 : : }
3437 : 115789 : return 1;
3438 : : }
3439 : :
3440 : : PyObject *
3441 : 115793 : PyType_FromMetaclass(PyTypeObject *metaclass, PyObject *module,
3442 : : PyType_Spec *spec, PyObject *bases_in)
3443 : : {
3444 : : /* Invariant: A non-NULL value in one of these means this function holds
3445 : : * a strong reference or owns allocated memory.
3446 : : * These get decrefed/freed/returned at the end, on both success and error.
3447 : : */
3448 : 115793 : PyHeapTypeObject *res = NULL;
3449 : : PyTypeObject *type;
3450 : 115793 : PyObject *bases = NULL;
3451 : 115793 : char *tp_doc = NULL;
3452 : 115793 : PyObject *ht_name = NULL;
3453 : 115793 : char *_ht_tpname = NULL;
3454 : :
3455 : : int r;
3456 : :
3457 : : /* Prepare slots that need special handling.
3458 : : * Keep in mind that a slot can be given multiple times:
3459 : : * if that would cause trouble (leaks, UB, ...), raise an exception.
3460 : : */
3461 : :
3462 : : const PyType_Slot *slot;
3463 : 115793 : Py_ssize_t nmembers = 0;
3464 : : Py_ssize_t weaklistoffset, dictoffset, vectorcalloffset;
3465 : : char *res_start;
3466 : :
3467 : 115793 : nmembers = weaklistoffset = dictoffset = vectorcalloffset = 0;
3468 [ + + ]: 843433 : for (slot = spec->slots; slot->slot; slot++) {
3469 [ + - ]: 727642 : if (slot->slot < 0
3470 [ - + ]: 727642 : || (size_t)slot->slot >= Py_ARRAY_LENGTH(pyslot_offsets)) {
3471 : 0 : PyErr_SetString(PyExc_RuntimeError, "invalid slot offset");
3472 : 0 : goto finally;
3473 : : }
3474 [ + + + ]: 727642 : switch (slot->slot) {
3475 : 84993 : case Py_tp_members:
3476 [ + + ]: 84993 : if (nmembers != 0) {
3477 : 1 : PyErr_SetString(
3478 : : PyExc_SystemError,
3479 : : "Multiple Py_tp_members slots are not supported.");
3480 : 1 : goto finally;
3481 : : }
3482 [ + + ]: 402774 : for (const PyMemberDef *memb = slot->pfunc; memb->name != NULL; memb++) {
3483 : 317782 : nmembers++;
3484 [ + + ]: 317782 : if (strcmp(memb->name, "__weaklistoffset__") == 0) {
3485 : : // The PyMemberDef must be a Py_ssize_t and readonly
3486 : : assert(memb->type == T_PYSSIZET);
3487 : : assert(memb->flags == READONLY);
3488 : 22806 : weaklistoffset = memb->offset;
3489 : : }
3490 [ + + ]: 317782 : if (strcmp(memb->name, "__dictoffset__") == 0) {
3491 : : // The PyMemberDef must be a Py_ssize_t and readonly
3492 : : assert(memb->type == T_PYSSIZET);
3493 : : assert(memb->flags == READONLY);
3494 : 7763 : dictoffset = memb->offset;
3495 : : }
3496 [ + + ]: 317782 : if (strcmp(memb->name, "__vectorcalloffset__") == 0) {
3497 : : // The PyMemberDef must be a Py_ssize_t and readonly
3498 : : assert(memb->type == T_PYSSIZET);
3499 : : assert(memb->flags == READONLY);
3500 : 5962 : vectorcalloffset = memb->offset;
3501 : : }
3502 : : }
3503 : 84992 : break;
3504 : 82551 : case Py_tp_doc:
3505 : : /* For the docstring slot, which usually points to a static string
3506 : : literal, we need to make a copy */
3507 [ + + ]: 82551 : if (tp_doc != NULL) {
3508 : 1 : PyErr_SetString(
3509 : : PyExc_SystemError,
3510 : : "Multiple Py_tp_doc slots are not supported.");
3511 : 1 : goto finally;
3512 : : }
3513 [ + + ]: 82550 : if (slot->pfunc == NULL) {
3514 : 1189 : PyObject_Free(tp_doc);
3515 : 1189 : tp_doc = NULL;
3516 : : }
3517 : : else {
3518 : 81361 : size_t len = strlen(slot->pfunc)+1;
3519 : 81361 : tp_doc = PyObject_Malloc(len);
3520 [ - + ]: 81361 : if (tp_doc == NULL) {
3521 : : PyErr_NoMemory();
3522 : 0 : goto finally;
3523 : : }
3524 : 81361 : memcpy(tp_doc, slot->pfunc, len);
3525 : : }
3526 : 82550 : break;
3527 : : }
3528 : : }
3529 : :
3530 : : /* Prepare the type name and qualname */
3531 : :
3532 [ - + ]: 115791 : if (spec->name == NULL) {
3533 : 0 : PyErr_SetString(PyExc_SystemError,
3534 : : "Type spec does not define the name field.");
3535 : 0 : goto finally;
3536 : : }
3537 : :
3538 : 115791 : const char *s = strrchr(spec->name, '.');
3539 [ - + ]: 115791 : if (s == NULL) {
3540 : 0 : s = spec->name;
3541 : : }
3542 : : else {
3543 : 115791 : s++;
3544 : : }
3545 : :
3546 : 115791 : ht_name = PyUnicode_FromString(s);
3547 [ - + ]: 115791 : if (!ht_name) {
3548 : 0 : goto finally;
3549 : : }
3550 : :
3551 : : /* Copy spec->name to a buffer we own.
3552 : : *
3553 : : * Unfortunately, we can't use tp_name directly (with some
3554 : : * flag saying that it should be deallocated with the type),
3555 : : * because tp_name is public API and may be set independently
3556 : : * of any such flag.
3557 : : * So, we use a separate buffer, _ht_tpname, that's always
3558 : : * deallocated with the type (if it's non-NULL).
3559 : : */
3560 : 115791 : Py_ssize_t name_buf_len = strlen(spec->name) + 1;
3561 : 115791 : _ht_tpname = PyMem_Malloc(name_buf_len);
3562 [ - + ]: 115791 : if (_ht_tpname == NULL) {
3563 : 0 : goto finally;
3564 : : }
3565 : 115791 : memcpy(_ht_tpname, spec->name, name_buf_len);
3566 : :
3567 : : /* Get a tuple of bases.
3568 : : * bases is a strong reference (unlike bases_in).
3569 : : */
3570 : 115791 : bases = get_bases_tuple(bases_in, spec);
3571 [ - + ]: 115791 : if (!bases) {
3572 : 0 : goto finally;
3573 : : }
3574 : :
3575 : : /* Calculate the metaclass */
3576 : :
3577 [ + + ]: 115791 : if (!metaclass) {
3578 : 113449 : metaclass = &PyType_Type;
3579 : : }
3580 : 115791 : metaclass = _PyType_CalculateMetaclass(metaclass, bases);
3581 [ + + ]: 115791 : if (metaclass == NULL) {
3582 : 1 : goto finally;
3583 : : }
3584 [ - + ]: 115790 : if (!PyType_Check(metaclass)) {
3585 : 0 : PyErr_Format(PyExc_TypeError,
3586 : : "Metaclass '%R' is not a subclass of 'type'.",
3587 : : metaclass);
3588 : 0 : goto finally;
3589 : : }
3590 [ + + ]: 115790 : if (metaclass->tp_new != PyType_Type.tp_new) {
3591 : 1 : PyErr_SetString(PyExc_TypeError,
3592 : : "Metaclasses with custom tp_new are not supported.");
3593 : 1 : goto finally;
3594 : : }
3595 : :
3596 : : /* Calculate best base, and check that all bases are type objects */
3597 : 115789 : PyTypeObject *base = best_base(bases); // borrowed ref
3598 [ - + ]: 115789 : if (base == NULL) {
3599 : 0 : goto finally;
3600 : : }
3601 : : // best_base should check Py_TPFLAGS_BASETYPE & raise a proper exception,
3602 : : // here we just check its work
3603 : : assert(_PyType_HasFeature(base, Py_TPFLAGS_BASETYPE));
3604 : :
3605 : : /* Allocate the new type
3606 : : *
3607 : : * Between here and PyType_Ready, we should limit:
3608 : : * - calls to Python code
3609 : : * - raising exceptions
3610 : : * - memory allocations
3611 : : */
3612 : :
3613 : 115789 : res = (PyHeapTypeObject*)metaclass->tp_alloc(metaclass, nmembers);
3614 [ - + ]: 115789 : if (res == NULL) {
3615 : 0 : goto finally;
3616 : : }
3617 : 115789 : res_start = (char*)res;
3618 : :
3619 : 115789 : type = &res->ht_type;
3620 : : /* The flags must be initialized early, before the GC traverses us */
3621 : 115789 : type->tp_flags = spec->flags | Py_TPFLAGS_HEAPTYPE;
3622 : :
3623 : 115789 : res->ht_module = Py_XNewRef(module);
3624 : :
3625 : : /* Initialize essential fields */
3626 : :
3627 : 115789 : type->tp_as_async = &res->as_async;
3628 : 115789 : type->tp_as_number = &res->as_number;
3629 : 115789 : type->tp_as_sequence = &res->as_sequence;
3630 : 115789 : type->tp_as_mapping = &res->as_mapping;
3631 : 115789 : type->tp_as_buffer = &res->as_buffer;
3632 : :
3633 : : /* Set slots we have prepared */
3634 : :
3635 : 115789 : type->tp_base = (PyTypeObject *)Py_NewRef(base);
3636 : 115789 : type->tp_bases = bases;
3637 : 115789 : bases = NULL; // We give our reference to bases to the type
3638 : :
3639 : 115789 : type->tp_doc = tp_doc;
3640 : 115789 : tp_doc = NULL; // Give ownership of the allocated memory to the type
3641 : :
3642 : 115789 : res->ht_qualname = Py_NewRef(ht_name);
3643 : 115789 : res->ht_name = ht_name;
3644 : 115789 : ht_name = NULL; // Give our reference to to the type
3645 : :
3646 : 115789 : type->tp_name = _ht_tpname;
3647 : 115789 : res->_ht_tpname = _ht_tpname;
3648 : 115789 : _ht_tpname = NULL; // Give ownership to to the type
3649 : :
3650 : : /* Copy the sizes */
3651 : :
3652 : 115789 : type->tp_basicsize = spec->basicsize;
3653 : 115789 : type->tp_itemsize = spec->itemsize;
3654 : :
3655 : : /* Copy all the ordinary slots */
3656 : :
3657 [ + + ]: 843427 : for (slot = spec->slots; slot->slot; slot++) {
3658 [ + + + ]: 727638 : switch (slot->slot) {
3659 : 82572 : case Py_tp_base:
3660 : : case Py_tp_bases:
3661 : : case Py_tp_doc:
3662 : : /* Processed above */
3663 : 82572 : break;
3664 : 84991 : case Py_tp_members:
3665 : : {
3666 : : /* Move the slots to the heap type itself */
3667 : 84991 : size_t len = Py_TYPE(type)->tp_itemsize * nmembers;
3668 : 84991 : memcpy(_PyHeapType_GET_MEMBERS(res), slot->pfunc, len);
3669 : 84991 : type->tp_members = _PyHeapType_GET_MEMBERS(res);
3670 : : }
3671 : 84991 : break;
3672 : 560075 : default:
3673 : : {
3674 : : /* Copy other slots directly */
3675 : 560075 : PySlot_Offset slotoffsets = pyslot_offsets[slot->slot];
3676 : 560075 : short slot_offset = slotoffsets.slot_offset;
3677 [ + + ]: 560075 : if (slotoffsets.subslot_offset == -1) {
3678 : 542556 : *(void**)((char*)res_start + slot_offset) = slot->pfunc;
3679 : : }
3680 : : else {
3681 : 17519 : void *procs = *(void**)((char*)res_start + slot_offset);
3682 : 17519 : short subslot_offset = slotoffsets.subslot_offset;
3683 : 17519 : *(void**)((char*)procs + subslot_offset) = slot->pfunc;
3684 : : }
3685 : : }
3686 : 560075 : break;
3687 : : }
3688 : : }
3689 [ + + ]: 115789 : if (type->tp_dealloc == NULL) {
3690 : : /* It's a heap type, so needs the heap types' dealloc.
3691 : : subtype_dealloc will call the base type's tp_dealloc, if
3692 : : necessary. */
3693 : 10227 : type->tp_dealloc = subtype_dealloc;
3694 : : }
3695 : :
3696 : : /* Set up offsets */
3697 : :
3698 : 115789 : type->tp_vectorcall_offset = vectorcalloffset;
3699 : 115789 : type->tp_weaklistoffset = weaklistoffset;
3700 : 115789 : type->tp_dictoffset = dictoffset;
3701 : :
3702 : : /* Ready the type (which includes inheritance).
3703 : : *
3704 : : * After this call we should generally only touch up what's
3705 : : * accessible to Python code, like __dict__.
3706 : : */
3707 : :
3708 [ - + ]: 115789 : if (PyType_Ready(type) < 0) {
3709 : 0 : goto finally;
3710 : : }
3711 : :
3712 [ - + ]: 115789 : if (!check_basicsize_includes_size_and_offsets(type)) {
3713 : 0 : goto finally;
3714 : : }
3715 : :
3716 [ + + ]: 115789 : if (type->tp_flags & Py_TPFLAGS_MANAGED_DICT) {
3717 : 1 : res->ht_cached_keys = _PyDict_NewKeysForClass();
3718 : : }
3719 : :
3720 [ + + ]: 115789 : if (type->tp_doc) {
3721 : 81360 : PyObject *__doc__ = PyUnicode_FromString(_PyType_DocWithoutSignature(type->tp_name, type->tp_doc));
3722 [ - + ]: 81360 : if (!__doc__) {
3723 : 0 : goto finally;
3724 : : }
3725 : 81360 : r = PyDict_SetItem(type->tp_dict, &_Py_ID(__doc__), __doc__);
3726 : 81360 : Py_DECREF(__doc__);
3727 [ - + ]: 81360 : if (r < 0) {
3728 : 0 : goto finally;
3729 : : }
3730 : : }
3731 : :
3732 [ + + ]: 115789 : if (weaklistoffset) {
3733 [ - + ]: 22806 : if (PyDict_DelItem((PyObject *)type->tp_dict, &_Py_ID(__weaklistoffset__)) < 0) {
3734 : 0 : goto finally;
3735 : : }
3736 : : }
3737 [ + + ]: 115789 : if (dictoffset) {
3738 [ - + ]: 7763 : if (PyDict_DelItem((PyObject *)type->tp_dict, &_Py_ID(__dictoffset__)) < 0) {
3739 : 0 : goto finally;
3740 : : }
3741 : : }
3742 : :
3743 : : /* Set type.__module__ */
3744 : 115789 : r = PyDict_Contains(type->tp_dict, &_Py_ID(__module__));
3745 [ - + ]: 115789 : if (r < 0) {
3746 : 0 : goto finally;
3747 : : }
3748 [ - + ]: 115789 : if (r == 0) {
3749 : 115789 : s = strrchr(spec->name, '.');
3750 [ + - ]: 115789 : if (s != NULL) {
3751 : 115789 : PyObject *modname = PyUnicode_FromStringAndSize(
3752 : 115789 : spec->name, (Py_ssize_t)(s - spec->name));
3753 [ - + ]: 115789 : if (modname == NULL) {
3754 : 0 : goto finally;
3755 : : }
3756 : 115789 : r = PyDict_SetItem(type->tp_dict, &_Py_ID(__module__), modname);
3757 : 115789 : Py_DECREF(modname);
3758 [ - + ]: 115789 : if (r != 0) {
3759 : 0 : goto finally;
3760 : : }
3761 : : }
3762 : : else {
3763 [ # # ]: 0 : if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1,
3764 : : "builtin type %.200s has no __module__ attribute",
3765 : : spec->name))
3766 : 0 : goto finally;
3767 : : }
3768 : : }
3769 : :
3770 : : assert(_PyType_CheckConsistency(type));
3771 : :
3772 : 0 : finally:
3773 [ + + ]: 115793 : if (PyErr_Occurred()) {
3774 [ - + ]: 4 : Py_CLEAR(res);
3775 : : }
3776 : 115793 : Py_XDECREF(bases);
3777 : 115793 : PyObject_Free(tp_doc);
3778 : 115793 : Py_XDECREF(ht_name);
3779 : 115793 : PyMem_Free(_ht_tpname);
3780 : 115793 : return (PyObject*)res;
3781 : : }
3782 : :
3783 : : PyObject *
3784 : 54862 : PyType_FromModuleAndSpec(PyObject *module, PyType_Spec *spec, PyObject *bases)
3785 : : {
3786 : 54862 : return PyType_FromMetaclass(NULL, module, spec, bases);
3787 : : }
3788 : :
3789 : : PyObject *
3790 : 35087 : PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
3791 : : {
3792 : 35087 : return PyType_FromMetaclass(NULL, NULL, spec, bases);
3793 : : }
3794 : :
3795 : : PyObject *
3796 : 23502 : PyType_FromSpec(PyType_Spec *spec)
3797 : : {
3798 : 23502 : return PyType_FromMetaclass(NULL, NULL, spec, NULL);
3799 : : }
3800 : :
3801 : : PyObject *
3802 : 4 : PyType_GetName(PyTypeObject *type)
3803 : : {
3804 : 4 : return type_name(type, NULL);
3805 : : }
3806 : :
3807 : : PyObject *
3808 : 610 : PyType_GetQualName(PyTypeObject *type)
3809 : : {
3810 : 610 : return type_qualname(type, NULL);
3811 : : }
3812 : :
3813 : : void *
3814 : 5545506 : PyType_GetSlot(PyTypeObject *type, int slot)
3815 : : {
3816 : : void *parent_slot;
3817 : 5545506 : int slots_len = Py_ARRAY_LENGTH(pyslot_offsets);
3818 : :
3819 [ + + - + ]: 5545506 : if (slot <= 0 || slot >= slots_len) {
3820 : 1 : PyErr_BadInternalCall();
3821 : 1 : return NULL;
3822 : : }
3823 : :
3824 : 5545505 : parent_slot = *(void**)((char*)type + pyslot_offsets[slot].slot_offset);
3825 [ + + ]: 5545505 : if (parent_slot == NULL) {
3826 : 3 : return NULL;
3827 : : }
3828 : : /* Return slot directly if we have no sub slot. */
3829 [ + + ]: 5545502 : if (pyslot_offsets[slot].subslot_offset == -1) {
3830 : 5545501 : return parent_slot;
3831 : : }
3832 : 1 : return *(void**)((char*)parent_slot + pyslot_offsets[slot].subslot_offset);
3833 : : }
3834 : :
3835 : : PyObject *
3836 : 14351156 : PyType_GetModule(PyTypeObject *type)
3837 : : {
3838 : : assert(PyType_Check(type));
3839 [ - + ]: 14351156 : if (!_PyType_HasFeature(type, Py_TPFLAGS_HEAPTYPE)) {
3840 : 0 : PyErr_Format(
3841 : : PyExc_TypeError,
3842 : : "PyType_GetModule: Type '%s' is not a heap type",
3843 : : type->tp_name);
3844 : 0 : return NULL;
3845 : : }
3846 : :
3847 : 14351156 : PyHeapTypeObject* et = (PyHeapTypeObject*)type;
3848 [ - + ]: 14351156 : if (!et->ht_module) {
3849 : 0 : PyErr_Format(
3850 : : PyExc_TypeError,
3851 : : "PyType_GetModule: Type '%s' has no associated module",
3852 : : type->tp_name);
3853 : 0 : return NULL;
3854 : : }
3855 : 14351156 : return et->ht_module;
3856 : :
3857 : : }
3858 : :
3859 : : void *
3860 : 331546 : PyType_GetModuleState(PyTypeObject *type)
3861 : : {
3862 : 331546 : PyObject *m = PyType_GetModule(type);
3863 [ - + ]: 331546 : if (m == NULL) {
3864 : 0 : return NULL;
3865 : : }
3866 : 331546 : return _PyModule_GetState(m);
3867 : : }
3868 : :
3869 : :
3870 : : /* Get the module of the first superclass where the module has the
3871 : : * given PyModuleDef.
3872 : : */
3873 : : PyObject *
3874 : 10145425 : PyType_GetModuleByDef(PyTypeObject *type, PyModuleDef *def)
3875 : : {
3876 : : assert(PyType_Check(type));
3877 : :
3878 : 10145425 : PyObject *mro = type->tp_mro;
3879 : : // The type must be ready
3880 : : assert(mro != NULL);
3881 : : assert(PyTuple_Check(mro));
3882 : : // mro_invoke() ensures that the type MRO cannot be empty, so we don't have
3883 : : // to check i < PyTuple_GET_SIZE(mro) at the first loop iteration.
3884 : : assert(PyTuple_GET_SIZE(mro) >= 1);
3885 : :
3886 : 10145425 : Py_ssize_t n = PyTuple_GET_SIZE(mro);
3887 [ + + ]: 10183858 : for (Py_ssize_t i = 0; i < n; i++) {
3888 : 10183857 : PyObject *super = PyTuple_GET_ITEM(mro, i);
3889 [ + + ]: 10183857 : if(!_PyType_HasFeature((PyTypeObject *)super, Py_TPFLAGS_HEAPTYPE)) {
3890 : : // Static types in the MRO need to be skipped
3891 : 1 : continue;
3892 : : }
3893 : :
3894 : 10183856 : PyHeapTypeObject *ht = (PyHeapTypeObject*)super;
3895 : 10183856 : PyObject *module = ht->ht_module;
3896 [ + + + + ]: 10183856 : if (module && _PyModule_GetDef(module) == def) {
3897 : 10145424 : return module;
3898 : : }
3899 : : }
3900 : :
3901 : 1 : PyErr_Format(
3902 : : PyExc_TypeError,
3903 : : "PyType_GetModuleByDef: No superclass of '%s' has the given module",
3904 : : type->tp_name);
3905 : 1 : return NULL;
3906 : : }
3907 : :
3908 : :
3909 : : /* Internal API to look for a name through the MRO, bypassing the method cache.
3910 : : This returns a borrowed reference, and might set an exception.
3911 : : 'error' is set to: -1: error with exception; 1: error without exception; 0: ok */
3912 : : static PyObject *
3913 : 155502324 : find_name_in_mro(PyTypeObject *type, PyObject *name, int *error)
3914 : : {
3915 : : Py_hash_t hash;
3916 [ + + ]: 155502324 : if (!PyUnicode_CheckExact(name) ||
3917 [ + + ]: 155502318 : (hash = _PyASCIIObject_CAST(name)->hash) == -1)
3918 : : {
3919 : 6360230 : hash = PyObject_Hash(name);
3920 [ - + ]: 6360230 : if (hash == -1) {
3921 : 0 : *error = -1;
3922 : 0 : return NULL;
3923 : : }
3924 : : }
3925 : :
3926 : : /* Look in tp_dict of types in MRO */
3927 : 155502324 : PyObject *mro = type->tp_mro;
3928 [ + + ]: 155502324 : if (mro == NULL) {
3929 [ + + ]: 3 : if ((type->tp_flags & Py_TPFLAGS_READYING) == 0) {
3930 [ - + ]: 1 : if (PyType_Ready(type) < 0) {
3931 : 0 : *error = -1;
3932 : 0 : return NULL;
3933 : : }
3934 : 1 : mro = type->tp_mro;
3935 : : }
3936 [ + + ]: 3 : if (mro == NULL) {
3937 : 2 : *error = 1;
3938 : 2 : return NULL;
3939 : : }
3940 : : }
3941 : :
3942 : 155502322 : PyObject *res = NULL;
3943 : : /* Keep a strong reference to mro because type->tp_mro can be replaced
3944 : : during dict lookup, e.g. when comparing to non-string keys. */
3945 : 155502322 : Py_INCREF(mro);
3946 : 155502322 : Py_ssize_t n = PyTuple_GET_SIZE(mro);
3947 [ + + ]: 570553613 : for (Py_ssize_t i = 0; i < n; i++) {
3948 : 467314224 : PyObject *base = PyTuple_GET_ITEM(mro, i);
3949 : 467314224 : PyObject *dict = _PyType_CAST(base)->tp_dict;
3950 : : assert(dict && PyDict_Check(dict));
3951 : 467314224 : res = _PyDict_GetItem_KnownHash(dict, name, hash);
3952 [ + + ]: 467314224 : if (res != NULL) {
3953 : 52262933 : break;
3954 : : }
3955 [ - + ]: 415051291 : if (PyErr_Occurred()) {
3956 : 0 : *error = -1;
3957 : 0 : goto done;
3958 : : }
3959 : : }
3960 : 155502322 : *error = 0;
3961 : 155502322 : done:
3962 : 155502322 : Py_DECREF(mro);
3963 : 155502322 : return res;
3964 : : }
3965 : :
3966 : : /* Internal API to look for a name through the MRO.
3967 : : This returns a borrowed reference, and doesn't set an exception! */
3968 : : PyObject *
3969 : 449312092 : _PyType_Lookup(PyTypeObject *type, PyObject *name)
3970 : : {
3971 : : PyObject *res;
3972 : : int error;
3973 : :
3974 : 449312092 : unsigned int h = MCACHE_HASH_METHOD(type, name);
3975 : 449312092 : struct type_cache *cache = get_type_cache();
3976 : 449312092 : struct type_cache_entry *entry = &cache->hashtable[h];
3977 [ + + ]: 449312092 : if (entry->version == type->tp_version_tag &&
3978 [ + + ]: 415407337 : entry->name == name) {
3979 : : #if MCACHE_STATS
3980 : : cache->hits++;
3981 : : #endif
3982 : : assert(_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG));
3983 : 406693350 : return entry->value;
3984 : : }
3985 : :
3986 : : /* We may end up clearing live exceptions below, so make sure it's ours. */
3987 : : assert(!PyErr_Occurred());
3988 : :
3989 : 42618742 : res = find_name_in_mro(type, name, &error);
3990 : : /* Only put NULL results into cache if there was no error. */
3991 [ + + ]: 42618742 : if (error) {
3992 : : /* It's not ideal to clear the error condition,
3993 : : but this function is documented as not setting
3994 : : an exception, and I don't want to change that.
3995 : : E.g., when PyType_Ready() can't proceed, it won't
3996 : : set the "ready" flag, so future attempts to ready
3997 : : the same type will call it again -- hopefully
3998 : : in a context that propagates the exception out.
3999 : : */
4000 [ - + ]: 2 : if (error == -1) {
4001 : 0 : PyErr_Clear();
4002 : : }
4003 : 2 : return NULL;
4004 : : }
4005 : :
4006 [ + + + - : 42618740 : if (MCACHE_CACHEABLE_NAME(name) && assign_version_tag(cache, type)) {
+ + + - ]
4007 : 42618725 : h = MCACHE_HASH_METHOD(type, name);
4008 : 42618725 : struct type_cache_entry *entry = &cache->hashtable[h];
4009 : 42618725 : entry->version = type->tp_version_tag;
4010 : 42618725 : entry->value = res; /* borrowed */
4011 : : assert(_PyASCIIObject_CAST(name)->hash != -1);
4012 : : #if MCACHE_STATS
4013 : : if (entry->name != Py_None && entry->name != name) {
4014 : : cache->collisions++;
4015 : : }
4016 : : else {
4017 : : cache->misses++;
4018 : : }
4019 : : #endif
4020 : : assert(_PyType_HasFeature(type, Py_TPFLAGS_VALID_VERSION_TAG));
4021 : 42618725 : Py_SETREF(entry->name, Py_NewRef(name));
4022 : : }
4023 : 42618740 : return res;
4024 : : }
4025 : :
4026 : : PyObject *
4027 : 0 : _PyType_LookupId(PyTypeObject *type, _Py_Identifier *name)
4028 : : {
4029 : : PyObject *oname;
4030 : 0 : oname = _PyUnicode_FromId(name); /* borrowed */
4031 [ # # ]: 0 : if (oname == NULL)
4032 : 0 : return NULL;
4033 : 0 : return _PyType_Lookup(type, oname);
4034 : : }
4035 : :
4036 : : /* Check if the "readied" PyUnicode name
4037 : : is a double-underscore special name. */
4038 : : static int
4039 : 9938340 : is_dunder_name(PyObject *name)
4040 : : {
4041 : 9938340 : Py_ssize_t length = PyUnicode_GET_LENGTH(name);
4042 : 9938340 : int kind = PyUnicode_KIND(name);
4043 : : /* Special names contain at least "__x__" and are always ASCII. */
4044 [ + + + + ]: 9938340 : if (length > 4 && kind == PyUnicode_1BYTE_KIND) {
4045 : 1483268 : const Py_UCS1 *characters = PyUnicode_1BYTE_DATA(name);
4046 : : return (
4047 [ + + + + ]: 2299956 : ((characters[length-2] == '_') && (characters[length-1] == '_')) &&
4048 [ + - + - ]: 816688 : ((characters[0] == '_') && (characters[1] == '_'))
4049 : : );
4050 : : }
4051 : 8455072 : return 0;
4052 : : }
4053 : :
4054 : : /* This is similar to PyObject_GenericGetAttr(),
4055 : : but uses _PyType_Lookup() instead of just looking in type->tp_dict. */
4056 : : static PyObject *
4057 : 40456369 : type_getattro(PyTypeObject *type, PyObject *name)
4058 : : {
4059 : 40456369 : PyTypeObject *metatype = Py_TYPE(type);
4060 : : PyObject *meta_attribute, *attribute;
4061 : : descrgetfunc meta_get;
4062 : : PyObject* res;
4063 : :
4064 [ + + ]: 40456369 : if (!PyUnicode_Check(name)) {
4065 : 1 : PyErr_Format(PyExc_TypeError,
4066 : : "attribute name must be string, not '%.200s'",
4067 : 1 : Py_TYPE(name)->tp_name);
4068 : 1 : return NULL;
4069 : : }
4070 : :
4071 : : /* Initialize this type (we'll assume the metatype is initialized) */
4072 [ + + ]: 40456368 : if (!_PyType_IsReady(type)) {
4073 [ - + ]: 1 : if (PyType_Ready(type) < 0)
4074 : 0 : return NULL;
4075 : : }
4076 : :
4077 : : /* No readable descriptor found yet */
4078 : 40456368 : meta_get = NULL;
4079 : :
4080 : : /* Look for the attribute in the metatype */
4081 : 40456368 : meta_attribute = _PyType_Lookup(metatype, name);
4082 : :
4083 [ + + ]: 40456368 : if (meta_attribute != NULL) {
4084 : 23185046 : Py_INCREF(meta_attribute);
4085 : 23185046 : meta_get = Py_TYPE(meta_attribute)->tp_descr_get;
4086 : :
4087 [ + + + + ]: 23185046 : if (meta_get != NULL && PyDescr_IsData(meta_attribute)) {
4088 : : /* Data descriptors implement tp_descr_set to intercept
4089 : : * writes. Assume the attribute is not overridden in
4090 : : * type's tp_dict (and bases): call the descriptor now.
4091 : : */
4092 : 6640565 : res = meta_get(meta_attribute, (PyObject *)type,
4093 : : (PyObject *)metatype);
4094 : 6640565 : Py_DECREF(meta_attribute);
4095 : 6640565 : return res;
4096 : : }
4097 : : }
4098 : :
4099 : : /* No data descriptor found on metatype. Look in tp_dict of this
4100 : : * type and its bases */
4101 : 33815803 : attribute = _PyType_Lookup(type, name);
4102 [ + + ]: 33815803 : if (attribute != NULL) {
4103 : : /* Implement descriptor functionality, if any */
4104 : 33350599 : Py_INCREF(attribute);
4105 : 33350599 : descrgetfunc local_get = Py_TYPE(attribute)->tp_descr_get;
4106 : :
4107 : 33350599 : Py_XDECREF(meta_attribute);
4108 : :
4109 [ + + ]: 33350599 : if (local_get != NULL) {
4110 : : /* NULL 2nd argument indicates the descriptor was
4111 : : * found on the target object itself (or a base) */
4112 : 19146707 : res = local_get(attribute, (PyObject *)NULL,
4113 : : (PyObject *)type);
4114 : 19146707 : Py_DECREF(attribute);
4115 : 19146707 : return res;
4116 : : }
4117 : :
4118 : 14203892 : return attribute;
4119 : : }
4120 : :
4121 : : /* No attribute found in local __dict__ (or bases): use the
4122 : : * descriptor from the metatype, if any */
4123 [ + + ]: 465204 : if (meta_get != NULL) {
4124 : : PyObject *res;
4125 : 256514 : res = meta_get(meta_attribute, (PyObject *)type,
4126 : : (PyObject *)metatype);
4127 : 256514 : Py_DECREF(meta_attribute);
4128 : 256514 : return res;
4129 : : }
4130 : :
4131 : : /* If an ordinary attribute was found on the metatype, return it now */
4132 [ + + ]: 208690 : if (meta_attribute != NULL) {
4133 : 6 : return meta_attribute;
4134 : : }
4135 : :
4136 : : /* Give up */
4137 : 208684 : PyErr_Format(PyExc_AttributeError,
4138 : : "type object '%.50s' has no attribute '%U'",
4139 : : type->tp_name, name);
4140 : 208684 : return NULL;
4141 : : }
4142 : :
4143 : : static int
4144 : 9938973 : type_setattro(PyTypeObject *type, PyObject *name, PyObject *value)
4145 : : {
4146 : : int res;
4147 [ + + ]: 9938973 : if (type->tp_flags & Py_TPFLAGS_IMMUTABLETYPE) {
4148 : 585 : PyErr_Format(
4149 : : PyExc_TypeError,
4150 : : "cannot set %R attribute of immutable type '%s'",
4151 : : name, type->tp_name);
4152 : 585 : return -1;
4153 : : }
4154 [ + + ]: 9938388 : if (PyUnicode_Check(name)) {
4155 [ + - ]: 9938387 : if (PyUnicode_CheckExact(name)) {
4156 [ - + ]: 9938387 : if (PyUnicode_READY(name) == -1)
4157 : 0 : return -1;
4158 : 9938387 : Py_INCREF(name);
4159 : : }
4160 : : else {
4161 : 0 : name = _PyUnicode_Copy(name);
4162 [ # # ]: 0 : if (name == NULL)
4163 : 0 : return -1;
4164 : : }
4165 : : /* bpo-40521: Interned strings are shared by all subinterpreters */
4166 [ + + ]: 9938387 : if (!PyUnicode_CHECK_INTERNED(name)) {
4167 : 2 : PyUnicode_InternInPlace(&name);
4168 [ - + ]: 2 : if (!PyUnicode_CHECK_INTERNED(name)) {
4169 : 0 : PyErr_SetString(PyExc_MemoryError,
4170 : : "Out of memory interning an attribute name");
4171 : 0 : Py_DECREF(name);
4172 : 0 : return -1;
4173 : : }
4174 : : }
4175 : : }
4176 : : else {
4177 : : /* Will fail in _PyObject_GenericSetAttrWithDict. */
4178 : 1 : Py_INCREF(name);
4179 : : }
4180 : 9938388 : res = _PyObject_GenericSetAttrWithDict((PyObject *)type, name, value, NULL);
4181 [ + + ]: 9938388 : if (res == 0) {
4182 : : /* Clear the VALID_VERSION flag of 'type' and all its
4183 : : subclasses. This could possibly be unified with the
4184 : : update_subclasses() recursion in update_slot(), but carefully:
4185 : : they each have their own conditions on which to stop
4186 : : recursing into subclasses. */
4187 : 9938340 : PyType_Modified(type);
4188 : :
4189 [ + + ]: 9938340 : if (is_dunder_name(name)) {
4190 : 816688 : res = update_slot(type, name);
4191 : : }
4192 : : assert(_PyType_CheckConsistency(type));
4193 : : }
4194 : 9938388 : Py_DECREF(name);
4195 : 9938388 : return res;
4196 : : }
4197 : :
4198 : : extern void
4199 : : _PyDictKeys_DecRef(PyDictKeysObject *keys);
4200 : :
4201 : :
4202 : : static void
4203 : 1881591 : type_dealloc_common(PyTypeObject *type)
4204 : : {
4205 [ + - ]: 1881591 : if (type->tp_bases != NULL) {
4206 : : PyObject *tp, *val, *tb;
4207 : 1881591 : PyErr_Fetch(&tp, &val, &tb);
4208 : 1881591 : remove_all_subclasses(type, type->tp_bases);
4209 : 1881591 : PyErr_Restore(tp, val, tb);
4210 : : }
4211 : 1881591 : }
4212 : :
4213 : :
4214 : : void
4215 : 588244 : _PyStaticType_Dealloc(PyTypeObject *type)
4216 : : {
4217 : : // If a type still has subtypes, it cannot be deallocated.
4218 : : // A subtype can inherit attributes and methods of its parent type,
4219 : : // and a type must no longer be used once it's deallocated.
4220 [ + + ]: 588244 : if (type->tp_subclasses != NULL) {
4221 : 9703 : return;
4222 : : }
4223 : :
4224 : 578541 : type_dealloc_common(type);
4225 : :
4226 [ + - ]: 578541 : Py_CLEAR(type->tp_dict);
4227 [ + - ]: 578541 : Py_CLEAR(type->tp_bases);
4228 [ + - ]: 578541 : Py_CLEAR(type->tp_mro);
4229 [ - + ]: 578541 : Py_CLEAR(type->tp_cache);
4230 : : // type->tp_subclasses is NULL
4231 : :
4232 : : // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
4233 [ - + ]: 578541 : if (Py_REFCNT(type) == 0) {
4234 : 0 : PyObject_ClearWeakRefs((PyObject *)type);
4235 : : }
4236 : :
4237 : 578541 : type->tp_flags &= ~Py_TPFLAGS_READY;
4238 : : }
4239 : :
4240 : :
4241 : : static void
4242 : 1303050 : type_dealloc(PyTypeObject *type)
4243 : : {
4244 : : // Assert this is a heap-allocated type object
4245 : : _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
4246 : :
4247 : 1303050 : _PyObject_GC_UNTRACK(type);
4248 : :
4249 : 1303050 : type_dealloc_common(type);
4250 : :
4251 : : // PyObject_ClearWeakRefs() raises an exception if Py_REFCNT() != 0
4252 : : assert(Py_REFCNT(type) == 0);
4253 : 1303050 : PyObject_ClearWeakRefs((PyObject *)type);
4254 : :
4255 : 1303050 : Py_XDECREF(type->tp_base);
4256 : 1303050 : Py_XDECREF(type->tp_dict);
4257 : 1303050 : Py_XDECREF(type->tp_bases);
4258 : 1303050 : Py_XDECREF(type->tp_mro);
4259 : 1303050 : Py_XDECREF(type->tp_cache);
4260 : 1303050 : Py_XDECREF(type->tp_subclasses);
4261 : :
4262 : : /* A type's tp_doc is heap allocated, unlike the tp_doc slots
4263 : : * of most other objects. It's okay to cast it to char *.
4264 : : */
4265 : 1303050 : PyObject_Free((char *)type->tp_doc);
4266 : :
4267 : 1303050 : PyHeapTypeObject *et = (PyHeapTypeObject *)type;
4268 : 1303050 : Py_XDECREF(et->ht_name);
4269 : 1303050 : Py_XDECREF(et->ht_qualname);
4270 : 1303050 : Py_XDECREF(et->ht_slots);
4271 [ + + ]: 1303050 : if (et->ht_cached_keys) {
4272 : 652903 : _PyDictKeys_DecRef(et->ht_cached_keys);
4273 : : }
4274 : 1303050 : Py_XDECREF(et->ht_module);
4275 : 1303050 : PyMem_Free(et->_ht_tpname);
4276 : 1303050 : Py_TYPE(type)->tp_free((PyObject *)type);
4277 : 1303050 : }
4278 : :
4279 : :
4280 : : PyObject*
4281 : 108141 : _PyType_GetSubclasses(PyTypeObject *self)
4282 : : {
4283 : 108141 : PyObject *list = PyList_New(0);
4284 [ - + ]: 108141 : if (list == NULL) {
4285 : 0 : return NULL;
4286 : : }
4287 : :
4288 : 108141 : PyObject *subclasses = self->tp_subclasses; // borrowed ref
4289 [ + + ]: 108141 : if (subclasses == NULL) {
4290 : 98047 : return list;
4291 : : }
4292 : : assert(PyDict_CheckExact(subclasses));
4293 : : // The loop cannot modify tp_subclasses, there is no need
4294 : : // to hold a strong reference (use a borrowed reference).
4295 : :
4296 : 10094 : Py_ssize_t i = 0;
4297 : : PyObject *ref; // borrowed ref
4298 [ + + ]: 44198 : while (PyDict_Next(subclasses, &i, NULL, &ref)) {
4299 : : assert(PyWeakref_CheckRef(ref));
4300 : 34104 : PyObject *obj = PyWeakref_GET_OBJECT(ref); // borrowed ref
4301 [ + + ]: 34104 : if (obj == Py_None) {
4302 : 3 : continue;
4303 : : }
4304 : : assert(PyType_Check(obj));
4305 : :
4306 [ - + ]: 34101 : if (PyList_Append(list, obj) < 0) {
4307 : 0 : Py_DECREF(list);
4308 : 0 : return NULL;
4309 : : }
4310 : : }
4311 : 10094 : return list;
4312 : : }
4313 : :
4314 : :
4315 : : /*[clinic input]
4316 : : type.__subclasses__
4317 : :
4318 : : Return a list of immediate subclasses.
4319 : : [clinic start generated code]*/
4320 : :
4321 : : static PyObject *
4322 : 108090 : type___subclasses___impl(PyTypeObject *self)
4323 : : /*[clinic end generated code: output=eb5eb54485942819 input=5af66132436f9a7b]*/
4324 : : {
4325 : 108090 : return _PyType_GetSubclasses(self);
4326 : : }
4327 : :
4328 : : static PyObject *
4329 : 916309 : type_prepare(PyObject *self, PyObject *const *args, Py_ssize_t nargs,
4330 : : PyObject *kwnames)
4331 : : {
4332 : 916309 : return PyDict_New();
4333 : : }
4334 : :
4335 : :
4336 : : /*
4337 : : Merge the __dict__ of aclass into dict, and recursively also all
4338 : : the __dict__s of aclass's base classes. The order of merging isn't
4339 : : defined, as it's expected that only the final set of dict keys is
4340 : : interesting.
4341 : : Return 0 on success, -1 on error.
4342 : : */
4343 : :
4344 : : static int
4345 : 61749 : merge_class_dict(PyObject *dict, PyObject *aclass)
4346 : : {
4347 : : PyObject *classdict;
4348 : : PyObject *bases;
4349 : :
4350 : : assert(PyDict_Check(dict));
4351 : : assert(aclass);
4352 : :
4353 : : /* Merge in the type's dict (if any). */
4354 [ - + ]: 61749 : if (_PyObject_LookupAttr(aclass, &_Py_ID(__dict__), &classdict) < 0) {
4355 : 0 : return -1;
4356 : : }
4357 [ + - ]: 61749 : if (classdict != NULL) {
4358 : 61749 : int status = PyDict_Update(dict, classdict);
4359 : 61749 : Py_DECREF(classdict);
4360 [ - + ]: 61749 : if (status < 0)
4361 : 0 : return -1;
4362 : : }
4363 : :
4364 : : /* Recursively merge in the base types' (if any) dicts. */
4365 [ - + ]: 61749 : if (_PyObject_LookupAttr(aclass, &_Py_ID(__bases__), &bases) < 0) {
4366 : 0 : return -1;
4367 : : }
4368 [ + - ]: 61749 : if (bases != NULL) {
4369 : : /* We have no guarantee that bases is a real tuple */
4370 : : Py_ssize_t i, n;
4371 : 61749 : n = PySequence_Size(bases); /* This better be right */
4372 [ - + ]: 61749 : if (n < 0) {
4373 : 0 : Py_DECREF(bases);
4374 : 0 : return -1;
4375 : : }
4376 : : else {
4377 [ + + ]: 104073 : for (i = 0; i < n; i++) {
4378 : : int status;
4379 : 42324 : PyObject *base = PySequence_GetItem(bases, i);
4380 [ - + ]: 42324 : if (base == NULL) {
4381 : 0 : Py_DECREF(bases);
4382 : 0 : return -1;
4383 : : }
4384 : 42324 : status = merge_class_dict(dict, base);
4385 : 42324 : Py_DECREF(base);
4386 [ - + ]: 42324 : if (status < 0) {
4387 : 0 : Py_DECREF(bases);
4388 : 0 : return -1;
4389 : : }
4390 : : }
4391 : : }
4392 : 61749 : Py_DECREF(bases);
4393 : : }
4394 : 61749 : return 0;
4395 : : }
4396 : :
4397 : : /* __dir__ for type objects: returns __dict__ and __bases__.
4398 : : We deliberately don't suck up its __class__, as methods belonging to the
4399 : : metaclass would probably be more confusing than helpful.
4400 : : */
4401 : : /*[clinic input]
4402 : : type.__dir__
4403 : :
4404 : : Specialized __dir__ implementation for types.
4405 : : [clinic start generated code]*/
4406 : :
4407 : : static PyObject *
4408 : 6858 : type___dir___impl(PyTypeObject *self)
4409 : : /*[clinic end generated code: output=69d02fe92c0f15fa input=7733befbec645968]*/
4410 : : {
4411 : 6858 : PyObject *result = NULL;
4412 : 6858 : PyObject *dict = PyDict_New();
4413 : :
4414 [ + - + - ]: 6858 : if (dict != NULL && merge_class_dict(dict, (PyObject *)self) == 0)
4415 : 6858 : result = PyDict_Keys(dict);
4416 : :
4417 : 6858 : Py_XDECREF(dict);
4418 : 6858 : return result;
4419 : : }
4420 : :
4421 : : /*[clinic input]
4422 : : type.__sizeof__
4423 : :
4424 : : Return memory consumption of the type object.
4425 : : [clinic start generated code]*/
4426 : :
4427 : : static PyObject *
4428 : 3 : type___sizeof___impl(PyTypeObject *self)
4429 : : /*[clinic end generated code: output=766f4f16cd3b1854 input=99398f24b9cf45d6]*/
4430 : : {
4431 : : Py_ssize_t size;
4432 [ + + ]: 3 : if (self->tp_flags & Py_TPFLAGS_HEAPTYPE) {
4433 : 2 : PyHeapTypeObject* et = (PyHeapTypeObject*)self;
4434 : 2 : size = sizeof(PyHeapTypeObject);
4435 [ + - ]: 2 : if (et->ht_cached_keys)
4436 : 2 : size += _PyDict_KeysSize(et->ht_cached_keys);
4437 : : }
4438 : : else
4439 : 1 : size = sizeof(PyTypeObject);
4440 : 3 : return PyLong_FromSsize_t(size);
4441 : : }
4442 : :
4443 : : static PyMethodDef type_methods[] = {
4444 : : TYPE_MRO_METHODDEF
4445 : : TYPE___SUBCLASSES___METHODDEF
4446 : : {"__prepare__", _PyCFunction_CAST(type_prepare),
4447 : : METH_FASTCALL | METH_KEYWORDS | METH_CLASS,
4448 : : PyDoc_STR("__prepare__() -> dict\n"
4449 : : "used to create the namespace for the class statement")},
4450 : : TYPE___INSTANCECHECK___METHODDEF
4451 : : TYPE___SUBCLASSCHECK___METHODDEF
4452 : : TYPE___DIR___METHODDEF
4453 : : TYPE___SIZEOF___METHODDEF
4454 : : {0}
4455 : : };
4456 : :
4457 : : PyDoc_STRVAR(type_doc,
4458 : : "type(object) -> the object's type\n"
4459 : : "type(name, bases, dict, **kwds) -> a new type");
4460 : :
4461 : : static int
4462 : 35612027 : type_traverse(PyTypeObject *type, visitproc visit, void *arg)
4463 : : {
4464 : : /* Because of type_is_gc(), the collector only calls this
4465 : : for heaptypes. */
4466 [ - + ]: 35612027 : if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
4467 : : char msg[200];
4468 : 0 : sprintf(msg, "type_traverse() called on non-heap type '%.100s'",
4469 : : type->tp_name);
4470 : 0 : _PyObject_ASSERT_FAILED_MSG((PyObject *)type, msg);
4471 : : }
4472 : :
4473 [ + + + + ]: 35612027 : Py_VISIT(type->tp_dict);
4474 [ - + - - ]: 35612004 : Py_VISIT(type->tp_cache);
4475 [ + + - + ]: 35612004 : Py_VISIT(type->tp_mro);
4476 [ + - - + ]: 35612004 : Py_VISIT(type->tp_bases);
4477 [ + - - + ]: 35612004 : Py_VISIT(type->tp_base);
4478 [ + + - + ]: 35612004 : Py_VISIT(((PyHeapTypeObject *)type)->ht_module);
4479 : :
4480 : : /* There's no need to visit others because they can't be involved
4481 : : in cycles:
4482 : : type->tp_subclasses is a list of weak references,
4483 : : ((PyHeapTypeObject *)type)->ht_slots is a tuple of strings,
4484 : : ((PyHeapTypeObject *)type)->ht_*name are strings.
4485 : : */
4486 : :
4487 : 35612004 : return 0;
4488 : : }
4489 : :
4490 : : static int
4491 : 1303023 : type_clear(PyTypeObject *type)
4492 : : {
4493 : : /* Because of type_is_gc(), the collector only calls this
4494 : : for heaptypes. */
4495 : : _PyObject_ASSERT((PyObject *)type, type->tp_flags & Py_TPFLAGS_HEAPTYPE);
4496 : :
4497 : : /* We need to invalidate the method cache carefully before clearing
4498 : : the dict, so that other objects caught in a reference cycle
4499 : : don't start calling destroyed methods.
4500 : :
4501 : : Otherwise, the we need to clear tp_mro, which is
4502 : : part of a hard cycle (its first element is the class itself) that
4503 : : won't be broken otherwise (it's a tuple and tuples don't have a
4504 : : tp_clear handler).
4505 : : We also need to clear ht_module, if present: the module usually holds a
4506 : : reference to its class. None of the other fields need to be
4507 : :
4508 : : cleared, and here's why:
4509 : :
4510 : : tp_cache:
4511 : : Not used; if it were, it would be a dict.
4512 : :
4513 : : tp_bases, tp_base:
4514 : : If these are involved in a cycle, there must be at least
4515 : : one other, mutable object in the cycle, e.g. a base
4516 : : class's dict; the cycle will be broken that way.
4517 : :
4518 : : tp_subclasses:
4519 : : A dict of weak references can't be part of a cycle; and
4520 : : dicts have their own tp_clear.
4521 : :
4522 : : slots (in PyHeapTypeObject):
4523 : : A tuple of strings can't be part of a cycle.
4524 : : */
4525 : :
4526 : 1303023 : PyType_Modified(type);
4527 [ + - ]: 1303023 : if (type->tp_dict) {
4528 : 1303023 : PyDict_Clear(type->tp_dict);
4529 : : }
4530 [ + + ]: 1303023 : Py_CLEAR(((PyHeapTypeObject *)type)->ht_module);
4531 : :
4532 [ + - ]: 1303023 : Py_CLEAR(type->tp_mro);
4533 : :
4534 : 1303023 : return 0;
4535 : : }
4536 : :
4537 : : static int
4538 : 699199055 : type_is_gc(PyTypeObject *type)
4539 : : {
4540 : 699199055 : return type->tp_flags & Py_TPFLAGS_HEAPTYPE;
4541 : : }
4542 : :
4543 : :
4544 : : static PyNumberMethods type_as_number = {
4545 : : .nb_or = _Py_union_type_or, // Add __or__ function
4546 : : };
4547 : :
4548 : : PyTypeObject PyType_Type = {
4549 : : PyVarObject_HEAD_INIT(&PyType_Type, 0)
4550 : : "type", /* tp_name */
4551 : : sizeof(PyHeapTypeObject), /* tp_basicsize */
4552 : : sizeof(PyMemberDef), /* tp_itemsize */
4553 : : (destructor)type_dealloc, /* tp_dealloc */
4554 : : offsetof(PyTypeObject, tp_vectorcall), /* tp_vectorcall_offset */
4555 : : 0, /* tp_getattr */
4556 : : 0, /* tp_setattr */
4557 : : 0, /* tp_as_async */
4558 : : (reprfunc)type_repr, /* tp_repr */
4559 : : &type_as_number, /* tp_as_number */
4560 : : 0, /* tp_as_sequence */
4561 : : 0, /* tp_as_mapping */
4562 : : 0, /* tp_hash */
4563 : : (ternaryfunc)type_call, /* tp_call */
4564 : : 0, /* tp_str */
4565 : : (getattrofunc)type_getattro, /* tp_getattro */
4566 : : (setattrofunc)type_setattro, /* tp_setattro */
4567 : : 0, /* tp_as_buffer */
4568 : : Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
4569 : : Py_TPFLAGS_BASETYPE | Py_TPFLAGS_TYPE_SUBCLASS |
4570 : : Py_TPFLAGS_HAVE_VECTORCALL, /* tp_flags */
4571 : : type_doc, /* tp_doc */
4572 : : (traverseproc)type_traverse, /* tp_traverse */
4573 : : (inquiry)type_clear, /* tp_clear */
4574 : : 0, /* tp_richcompare */
4575 : : offsetof(PyTypeObject, tp_weaklist), /* tp_weaklistoffset */
4576 : : 0, /* tp_iter */
4577 : : 0, /* tp_iternext */
4578 : : type_methods, /* tp_methods */
4579 : : type_members, /* tp_members */
4580 : : type_getsets, /* tp_getset */
4581 : : 0, /* tp_base */
4582 : : 0, /* tp_dict */
4583 : : 0, /* tp_descr_get */
4584 : : 0, /* tp_descr_set */
4585 : : offsetof(PyTypeObject, tp_dict), /* tp_dictoffset */
4586 : : type_init, /* tp_init */
4587 : : 0, /* tp_alloc */
4588 : : type_new, /* tp_new */
4589 : : PyObject_GC_Del, /* tp_free */
4590 : : (inquiry)type_is_gc, /* tp_is_gc */
4591 : : .tp_vectorcall = type_vectorcall,
4592 : : };
4593 : :
4594 : :
4595 : : /* The base type of all types (eventually)... except itself. */
4596 : :
4597 : : /* You may wonder why object.__new__() only complains about arguments
4598 : : when object.__init__() is not overridden, and vice versa.
4599 : :
4600 : : Consider the use cases:
4601 : :
4602 : : 1. When neither is overridden, we want to hear complaints about
4603 : : excess (i.e., any) arguments, since their presence could
4604 : : indicate there's a bug.
4605 : :
4606 : : 2. When defining an Immutable type, we are likely to override only
4607 : : __new__(), since __init__() is called too late to initialize an
4608 : : Immutable object. Since __new__() defines the signature for the
4609 : : type, it would be a pain to have to override __init__() just to
4610 : : stop it from complaining about excess arguments.
4611 : :
4612 : : 3. When defining a Mutable type, we are likely to override only
4613 : : __init__(). So here the converse reasoning applies: we don't
4614 : : want to have to override __new__() just to stop it from
4615 : : complaining.
4616 : :
4617 : : 4. When __init__() is overridden, and the subclass __init__() calls
4618 : : object.__init__(), the latter should complain about excess
4619 : : arguments; ditto for __new__().
4620 : :
4621 : : Use cases 2 and 3 make it unattractive to unconditionally check for
4622 : : excess arguments. The best solution that addresses all four use
4623 : : cases is as follows: __init__() complains about excess arguments
4624 : : unless __new__() is overridden and __init__() is not overridden
4625 : : (IOW, if __init__() is overridden or __new__() is not overridden);
4626 : : symmetrically, __new__() complains about excess arguments unless
4627 : : __init__() is overridden and __new__() is not overridden
4628 : : (IOW, if __new__() is overridden or __init__() is not overridden).
4629 : :
4630 : : However, for backwards compatibility, this breaks too much code.
4631 : : Therefore, in 2.6, we'll *warn* about excess arguments when both
4632 : : methods are overridden; for all other cases we'll use the above
4633 : : rules.
4634 : :
4635 : : */
4636 : :
4637 : : /* Forward */
4638 : : static PyObject *
4639 : : object_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
4640 : :
4641 : : static int
4642 : 29679672 : excess_args(PyObject *args, PyObject *kwds)
4643 : : {
4644 [ + + + + ]: 29889394 : return PyTuple_GET_SIZE(args) ||
4645 [ + - + + ]: 209722 : (kwds && PyDict_Check(kwds) && PyDict_GET_SIZE(kwds));
4646 : : }
4647 : :
4648 : : static int
4649 : 19177108 : object_init(PyObject *self, PyObject *args, PyObject *kwds)
4650 : : {
4651 : 19177108 : PyTypeObject *type = Py_TYPE(self);
4652 [ + + ]: 19177108 : if (excess_args(args, kwds)) {
4653 [ + + ]: 17427132 : if (type->tp_init != object_init) {
4654 : 5 : PyErr_SetString(PyExc_TypeError,
4655 : : "object.__init__() takes exactly one argument (the instance to initialize)");
4656 : 5 : return -1;
4657 : : }
4658 [ + + ]: 17427127 : if (type->tp_new == object_new) {
4659 : 3 : PyErr_Format(PyExc_TypeError,
4660 : : "%.200s.__init__() takes exactly one argument (the instance to initialize)",
4661 : : type->tp_name);
4662 : 3 : return -1;
4663 : : }
4664 : : }
4665 : 19177100 : return 0;
4666 : : }
4667 : :
4668 : : static PyObject *
4669 : 10502564 : object_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
4670 : : {
4671 [ + + ]: 10502564 : if (excess_args(args, kwds)) {
4672 [ + + ]: 5812860 : if (type->tp_new != object_new) {
4673 : 9 : PyErr_SetString(PyExc_TypeError,
4674 : : "object.__new__() takes exactly one argument (the type to instantiate)");
4675 : 9 : return NULL;
4676 : : }
4677 [ + + ]: 5812851 : if (type->tp_init == object_init) {
4678 : 12667 : PyErr_Format(PyExc_TypeError, "%.200s() takes no arguments",
4679 : : type->tp_name);
4680 : 12667 : return NULL;
4681 : : }
4682 : : }
4683 : :
4684 [ + + ]: 10489888 : if (type->tp_flags & Py_TPFLAGS_IS_ABSTRACT) {
4685 : : PyObject *abstract_methods;
4686 : : PyObject *sorted_methods;
4687 : : PyObject *joined;
4688 : : Py_ssize_t method_count;
4689 : :
4690 : : /* Compute ", ".join(sorted(type.__abstractmethods__))
4691 : : into joined. */
4692 : 80 : abstract_methods = type_abstractmethods(type, NULL);
4693 [ - + ]: 80 : if (abstract_methods == NULL)
4694 : 0 : return NULL;
4695 : 80 : sorted_methods = PySequence_List(abstract_methods);
4696 : 80 : Py_DECREF(abstract_methods);
4697 [ - + ]: 80 : if (sorted_methods == NULL)
4698 : 0 : return NULL;
4699 [ - + ]: 80 : if (PyList_Sort(sorted_methods)) {
4700 : 0 : Py_DECREF(sorted_methods);
4701 : 0 : return NULL;
4702 : : }
4703 : : _Py_DECLARE_STR(comma_sep, ", ");
4704 : 80 : joined = PyUnicode_Join(&_Py_STR(comma_sep), sorted_methods);
4705 : 80 : method_count = PyObject_Length(sorted_methods);
4706 : 80 : Py_DECREF(sorted_methods);
4707 [ - + ]: 80 : if (joined == NULL)
4708 : 0 : return NULL;
4709 [ - + ]: 80 : if (method_count == -1)
4710 : 0 : return NULL;
4711 : :
4712 [ + + ]: 80 : PyErr_Format(PyExc_TypeError,
4713 : : "Can't instantiate abstract class %s "
4714 : : "without an implementation for abstract method%s %U",
4715 : : type->tp_name,
4716 : : method_count > 1 ? "s" : "",
4717 : : joined);
4718 : 80 : Py_DECREF(joined);
4719 : 80 : return NULL;
4720 : : }
4721 : 10489808 : PyObject *obj = type->tp_alloc(type, 0);
4722 [ + + ]: 10489808 : if (obj == NULL) {
4723 : 23 : return NULL;
4724 : : }
4725 [ - + ]: 10489785 : if (_PyObject_InitializeDict(obj)) {
4726 : 0 : Py_DECREF(obj);
4727 : 0 : return NULL;
4728 : : }
4729 : 10489785 : return obj;
4730 : : }
4731 : :
4732 : : static void
4733 : 215458956 : object_dealloc(PyObject *self)
4734 : : {
4735 : 215458956 : Py_TYPE(self)->tp_free(self);
4736 : 215458956 : }
4737 : :
4738 : : static PyObject *
4739 : 4005 : object_repr(PyObject *self)
4740 : : {
4741 : : PyTypeObject *type;
4742 : : PyObject *mod, *name, *rtn;
4743 : :
4744 : 4005 : type = Py_TYPE(self);
4745 : 4005 : mod = type_module(type, NULL);
4746 [ - + ]: 4005 : if (mod == NULL)
4747 : 0 : PyErr_Clear();
4748 [ - + ]: 4005 : else if (!PyUnicode_Check(mod)) {
4749 : 0 : Py_DECREF(mod);
4750 : 0 : mod = NULL;
4751 : : }
4752 : 4005 : name = type_qualname(type, NULL);
4753 [ - + ]: 4005 : if (name == NULL) {
4754 : 0 : Py_XDECREF(mod);
4755 : 0 : return NULL;
4756 : : }
4757 [ + - + + ]: 4005 : if (mod != NULL && !_PyUnicode_Equal(mod, &_Py_ID(builtins)))
4758 : 3879 : rtn = PyUnicode_FromFormat("<%U.%U object at %p>", mod, name, self);
4759 : : else
4760 : 126 : rtn = PyUnicode_FromFormat("<%s object at %p>",
4761 : : type->tp_name, self);
4762 : 4005 : Py_XDECREF(mod);
4763 : 4005 : Py_DECREF(name);
4764 : 4005 : return rtn;
4765 : : }
4766 : :
4767 : : static PyObject *
4768 : 3829940 : object_str(PyObject *self)
4769 : : {
4770 : : unaryfunc f;
4771 : :
4772 : 3829940 : f = Py_TYPE(self)->tp_repr;
4773 [ - + ]: 3829940 : if (f == NULL)
4774 : 0 : f = object_repr;
4775 : 3829940 : return f(self);
4776 : : }
4777 : :
4778 : : static PyObject *
4779 : 11726380 : object_richcompare(PyObject *self, PyObject *other, int op)
4780 : : {
4781 : : PyObject *res;
4782 : :
4783 [ + + + ]: 11726380 : switch (op) {
4784 : :
4785 : 11685079 : case Py_EQ:
4786 : : /* Return NotImplemented instead of False, so if two
4787 : : objects are compared, both get a chance at the
4788 : : comparison. See issue #1393. */
4789 [ + + ]: 11685079 : res = (self == other) ? Py_True : Py_NotImplemented;
4790 : 11685079 : Py_INCREF(res);
4791 : 11685079 : break;
4792 : :
4793 : 39212 : case Py_NE:
4794 : : /* By default, __ne__() delegates to __eq__() and inverts the result,
4795 : : unless the latter returns NotImplemented. */
4796 [ - + ]: 39212 : if (Py_TYPE(self)->tp_richcompare == NULL) {
4797 : 0 : res = Py_NotImplemented;
4798 : 0 : Py_INCREF(res);
4799 : 0 : break;
4800 : : }
4801 : 39212 : res = (*Py_TYPE(self)->tp_richcompare)(self, other, Py_EQ);
4802 [ + + + + ]: 39212 : if (res != NULL && res != Py_NotImplemented) {
4803 : 14194 : int ok = PyObject_IsTrue(res);
4804 : 14194 : Py_DECREF(res);
4805 [ - + ]: 14194 : if (ok < 0)
4806 : 0 : res = NULL;
4807 : : else {
4808 [ + + ]: 14194 : if (ok)
4809 : 11437 : res = Py_False;
4810 : : else
4811 : 2757 : res = Py_True;
4812 : 14194 : Py_INCREF(res);
4813 : : }
4814 : : }
4815 : 39212 : break;
4816 : :
4817 : 2089 : default:
4818 : 2089 : res = Py_NotImplemented;
4819 : 2089 : Py_INCREF(res);
4820 : 2089 : break;
4821 : : }
4822 : :
4823 : 11726380 : return res;
4824 : : }
4825 : :
4826 : : static PyObject *
4827 : 26227758 : object_get_class(PyObject *self, void *closure)
4828 : : {
4829 : 26227758 : Py_INCREF(Py_TYPE(self));
4830 : 26227758 : return (PyObject *)(Py_TYPE(self));
4831 : : }
4832 : :
4833 : : static int
4834 : 4592 : compatible_with_tp_base(PyTypeObject *child)
4835 : : {
4836 : 4592 : PyTypeObject *parent = child->tp_base;
4837 : 4562 : return (parent != NULL &&
4838 [ + + ]: 4562 : child->tp_basicsize == parent->tp_basicsize &&
4839 [ + - ]: 1908 : child->tp_itemsize == parent->tp_itemsize &&
4840 [ + + ]: 1908 : child->tp_dictoffset == parent->tp_dictoffset &&
4841 [ + - ]: 1892 : child->tp_weaklistoffset == parent->tp_weaklistoffset &&
4842 : 1892 : ((child->tp_flags & Py_TPFLAGS_HAVE_GC) ==
4843 [ + + + + ]: 11030 : (parent->tp_flags & Py_TPFLAGS_HAVE_GC)) &&
4844 [ - + ]: 1876 : (child->tp_dealloc == subtype_dealloc ||
4845 [ # # ]: 0 : child->tp_dealloc == parent->tp_dealloc));
4846 : : }
4847 : :
4848 : : static int
4849 : 153 : same_slots_added(PyTypeObject *a, PyTypeObject *b)
4850 : : {
4851 : 153 : PyTypeObject *base = a->tp_base;
4852 : : Py_ssize_t size;
4853 : : PyObject *slots_a, *slots_b;
4854 : :
4855 : : assert(base == b->tp_base);
4856 : 153 : size = base->tp_basicsize;
4857 [ - + - - ]: 153 : if (a->tp_dictoffset == size && b->tp_dictoffset == size)
4858 : 0 : size += sizeof(PyObject *);
4859 [ + + + + ]: 153 : if (a->tp_weaklistoffset == size && b->tp_weaklistoffset == size)
4860 : 135 : size += sizeof(PyObject *);
4861 : :
4862 : : /* Check slots compliance */
4863 [ + + ]: 153 : if (!(a->tp_flags & Py_TPFLAGS_HEAPTYPE) ||
4864 [ - + ]: 151 : !(b->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
4865 : 2 : return 0;
4866 : : }
4867 : 151 : slots_a = ((PyHeapTypeObject *)a)->ht_slots;
4868 : 151 : slots_b = ((PyHeapTypeObject *)b)->ht_slots;
4869 [ + + + + ]: 151 : if (slots_a && slots_b) {
4870 [ + + ]: 18 : if (PyObject_RichCompareBool(slots_a, slots_b, Py_EQ) != 1)
4871 : 6 : return 0;
4872 : 12 : size += sizeof(PyObject *) * PyTuple_GET_SIZE(slots_a);
4873 : : }
4874 [ + + + + ]: 145 : return size == a->tp_basicsize && size == b->tp_basicsize;
4875 : : }
4876 : :
4877 : : static int
4878 : 1358 : compatible_for_assignment(PyTypeObject* oldto, PyTypeObject* newto, const char* attr)
4879 : : {
4880 : : PyTypeObject *newbase, *oldbase;
4881 : :
4882 [ - + ]: 1358 : if (newto->tp_free != oldto->tp_free) {
4883 : 0 : PyErr_Format(PyExc_TypeError,
4884 : : "%s assignment: "
4885 : : "'%s' deallocator differs from '%s'",
4886 : : attr,
4887 : : newto->tp_name,
4888 : : oldto->tp_name);
4889 : 0 : return 0;
4890 : : }
4891 : : /*
4892 : : It's tricky to tell if two arbitrary types are sufficiently compatible as
4893 : : to be interchangeable; e.g., even if they have the same tp_basicsize, they
4894 : : might have totally different struct fields. It's much easier to tell if a
4895 : : type and its supertype are compatible; e.g., if they have the same
4896 : : tp_basicsize, then that means they have identical fields. So to check
4897 : : whether two arbitrary types are compatible, we first find the highest
4898 : : supertype that each is compatible with, and then if those supertypes are
4899 : : compatible then the original types must also be compatible.
4900 : : */
4901 : 1358 : newbase = newto;
4902 : 1358 : oldbase = oldto;
4903 [ + + ]: 2505 : while (compatible_with_tp_base(newbase))
4904 : 1147 : newbase = newbase->tp_base;
4905 [ + + ]: 2087 : while (compatible_with_tp_base(oldbase))
4906 : 729 : oldbase = oldbase->tp_base;
4907 [ + + ]: 1358 : if (newbase != oldbase &&
4908 [ + + + + ]: 366 : (newbase->tp_base != oldbase->tp_base ||
4909 : 153 : !same_slots_added(newbase, oldbase))) {
4910 : 72 : goto differs;
4911 : : }
4912 : : /* The above does not check for managed __dicts__ */
4913 : 1286 : if ((oldto->tp_flags & Py_TPFLAGS_MANAGED_DICT) ==
4914 [ + + ]: 1286 : ((newto->tp_flags & Py_TPFLAGS_MANAGED_DICT)))
4915 : : {
4916 : 1284 : return 1;
4917 : : }
4918 : 2 : differs:
4919 : 74 : PyErr_Format(PyExc_TypeError,
4920 : : "%s assignment: "
4921 : : "'%s' object layout differs from '%s'",
4922 : : attr,
4923 : : newto->tp_name,
4924 : : oldto->tp_name);
4925 : 74 : return 0;
4926 : : }
4927 : :
4928 : : static int
4929 : 810 : object_set_class(PyObject *self, PyObject *value, void *closure)
4930 : : {
4931 : 810 : PyTypeObject *oldto = Py_TYPE(self);
4932 : :
4933 [ + + ]: 810 : if (value == NULL) {
4934 : 101 : PyErr_SetString(PyExc_TypeError,
4935 : : "can't delete __class__ attribute");
4936 : 101 : return -1;
4937 : : }
4938 [ + + ]: 709 : if (!PyType_Check(value)) {
4939 : 1 : PyErr_Format(PyExc_TypeError,
4940 : : "__class__ must be set to a class, not '%s' object",
4941 : 1 : Py_TYPE(value)->tp_name);
4942 : 1 : return -1;
4943 : : }
4944 : 708 : PyTypeObject *newto = (PyTypeObject *)value;
4945 : :
4946 [ - + ]: 708 : if (PySys_Audit("object.__setattr__", "OsO",
4947 : : self, "__class__", value) < 0) {
4948 : 0 : return -1;
4949 : : }
4950 : :
4951 : : /* In versions of CPython prior to 3.5, the code in
4952 : : compatible_for_assignment was not set up to correctly check for memory
4953 : : layout / slot / etc. compatibility for non-HEAPTYPE classes, so we just
4954 : : disallowed __class__ assignment in any case that wasn't HEAPTYPE ->
4955 : : HEAPTYPE.
4956 : :
4957 : : During the 3.5 development cycle, we fixed the code in
4958 : : compatible_for_assignment to correctly check compatibility between
4959 : : arbitrary types, and started allowing __class__ assignment in all cases
4960 : : where the old and new types did in fact have compatible slots and
4961 : : memory layout (regardless of whether they were implemented as HEAPTYPEs
4962 : : or not).
4963 : :
4964 : : Just before 3.5 was released, though, we discovered that this led to
4965 : : problems with immutable types like int, where the interpreter assumes
4966 : : they are immutable and interns some values. Formerly this wasn't a
4967 : : problem, because they really were immutable -- in particular, all the
4968 : : types where the interpreter applied this interning trick happened to
4969 : : also be statically allocated, so the old HEAPTYPE rules were
4970 : : "accidentally" stopping them from allowing __class__ assignment. But
4971 : : with the changes to __class__ assignment, we started allowing code like
4972 : :
4973 : : class MyInt(int):
4974 : : ...
4975 : : # Modifies the type of *all* instances of 1 in the whole program,
4976 : : # including future instances (!), because the 1 object is interned.
4977 : : (1).__class__ = MyInt
4978 : :
4979 : : (see https://bugs.python.org/issue24912).
4980 : :
4981 : : In theory the proper fix would be to identify which classes rely on
4982 : : this invariant and somehow disallow __class__ assignment only for them,
4983 : : perhaps via some mechanism like a new Py_TPFLAGS_IMMUTABLE flag (a
4984 : : "denylisting" approach). But in practice, since this problem wasn't
4985 : : noticed late in the 3.5 RC cycle, we're taking the conservative
4986 : : approach and reinstating the same HEAPTYPE->HEAPTYPE check that we used
4987 : : to have, plus an "allowlist". For now, the allowlist consists only of
4988 : : ModuleType subtypes, since those are the cases that motivated the patch
4989 : : in the first place -- see https://bugs.python.org/issue22986 -- and
4990 : : since module objects are mutable we can be sure that they are
4991 : : definitely not being interned. So now we allow HEAPTYPE->HEAPTYPE *or*
4992 : : ModuleType subtype -> ModuleType subtype.
4993 : :
4994 : : So far as we know, all the code beyond the following 'if' statement
4995 : : will correctly handle non-HEAPTYPE classes, and the HEAPTYPE check is
4996 : : needed only to protect that subset of non-HEAPTYPE classes for which
4997 : : the interpreter has baked in the assumption that all instances are
4998 : : truly immutable.
4999 : : */
5000 [ + + - + ]: 728 : if (!(PyType_IsSubtype(newto, &PyModule_Type) &&
5001 [ + + ]: 708 : PyType_IsSubtype(oldto, &PyModule_Type)) &&
5002 [ + + ]: 1359 : (_PyType_HasFeature(newto, Py_TPFLAGS_IMMUTABLETYPE) ||
5003 : 671 : _PyType_HasFeature(oldto, Py_TPFLAGS_IMMUTABLETYPE))) {
5004 : 35 : PyErr_Format(PyExc_TypeError,
5005 : : "__class__ assignment only supported for mutable types "
5006 : : "or ModuleType subclasses");
5007 : 35 : return -1;
5008 : : }
5009 : :
5010 [ + + ]: 673 : if (compatible_for_assignment(oldto, newto, "__class__")) {
5011 : : /* Changing the class will change the implicit dict keys,
5012 : : * so we must materialize the dictionary first. */
5013 : : assert((oldto->tp_flags & Py_TPFLAGS_MANAGED_DICT) == (newto->tp_flags & Py_TPFLAGS_MANAGED_DICT));
5014 : 601 : _PyObject_GetDictPtr(self);
5015 [ + + - + ]: 601 : if (oldto->tp_flags & Py_TPFLAGS_MANAGED_DICT && *_PyObject_ValuesPointer(self)) {
5016 : : /* Was unable to convert to dict */
5017 : : PyErr_NoMemory();
5018 : 0 : return -1;
5019 : : }
5020 [ + + ]: 601 : if (newto->tp_flags & Py_TPFLAGS_HEAPTYPE) {
5021 : 591 : Py_INCREF(newto);
5022 : : }
5023 : 601 : Py_SET_TYPE(self, newto);
5024 [ + + ]: 601 : if (oldto->tp_flags & Py_TPFLAGS_HEAPTYPE)
5025 : 591 : Py_DECREF(oldto);
5026 : 601 : return 0;
5027 : : }
5028 : : else {
5029 : 72 : return -1;
5030 : : }
5031 : : }
5032 : :
5033 : : static PyGetSetDef object_getsets[] = {
5034 : : {"__class__", object_get_class, object_set_class,
5035 : : PyDoc_STR("the object's class")},
5036 : : {0}
5037 : : };
5038 : :
5039 : :
5040 : : /* Stuff to implement __reduce_ex__ for pickle protocols >= 2.
5041 : : We fall back to helpers in copyreg for:
5042 : : - pickle protocols < 2
5043 : : - calculating the list of slot names (done only once per class)
5044 : : - the __newobj__ function (which is used as a token but never called)
5045 : : */
5046 : :
5047 : : static PyObject *
5048 : 51790 : import_copyreg(void)
5049 : : {
5050 : : /* Try to fetch cached copy of copyreg from sys.modules first in an
5051 : : attempt to avoid the import overhead. Previously this was implemented
5052 : : by storing a reference to the cached module in a static variable, but
5053 : : this broke when multiple embedded interpreters were in use (see issue
5054 : : #17408 and #19088). */
5055 : 51790 : PyObject *copyreg_module = PyImport_GetModule(&_Py_ID(copyreg));
5056 [ + - ]: 51790 : if (copyreg_module != NULL) {
5057 : 51790 : return copyreg_module;
5058 : : }
5059 [ # # ]: 0 : if (PyErr_Occurred()) {
5060 : 0 : return NULL;
5061 : : }
5062 : 0 : return PyImport_Import(&_Py_ID(copyreg));
5063 : : }
5064 : :
5065 : : static PyObject *
5066 : 44904 : _PyType_GetSlotNames(PyTypeObject *cls)
5067 : : {
5068 : : PyObject *copyreg;
5069 : : PyObject *slotnames;
5070 : :
5071 : : assert(PyType_Check(cls));
5072 : :
5073 : : /* Get the slot names from the cache in the class if possible. */
5074 : 44904 : slotnames = PyDict_GetItemWithError(cls->tp_dict, &_Py_ID(__slotnames__));
5075 [ + + ]: 44904 : if (slotnames != NULL) {
5076 [ + - - + ]: 43647 : if (slotnames != Py_None && !PyList_Check(slotnames)) {
5077 : 0 : PyErr_Format(PyExc_TypeError,
5078 : : "%.200s.__slotnames__ should be a list or None, "
5079 : : "not %.200s",
5080 : 0 : cls->tp_name, Py_TYPE(slotnames)->tp_name);
5081 : 0 : return NULL;
5082 : : }
5083 : 43647 : Py_INCREF(slotnames);
5084 : 43647 : return slotnames;
5085 : : }
5086 : : else {
5087 [ - + ]: 1257 : if (PyErr_Occurred()) {
5088 : 0 : return NULL;
5089 : : }
5090 : : /* The class does not have the slot names cached yet. */
5091 : : }
5092 : :
5093 : 1257 : copyreg = import_copyreg();
5094 [ - + ]: 1257 : if (copyreg == NULL)
5095 : 0 : return NULL;
5096 : :
5097 : : /* Use _slotnames function from the copyreg module to find the slots
5098 : : by this class and its bases. This function will cache the result
5099 : : in __slotnames__. */
5100 : 1257 : slotnames = PyObject_CallMethodOneArg(
5101 : : copyreg, &_Py_ID(_slotnames), (PyObject *)cls);
5102 : 1257 : Py_DECREF(copyreg);
5103 [ - + ]: 1257 : if (slotnames == NULL)
5104 : 0 : return NULL;
5105 : :
5106 [ + - - + ]: 1257 : if (slotnames != Py_None && !PyList_Check(slotnames)) {
5107 : 0 : PyErr_SetString(PyExc_TypeError,
5108 : : "copyreg._slotnames didn't return a list or None");
5109 : 0 : Py_DECREF(slotnames);
5110 : 0 : return NULL;
5111 : : }
5112 : :
5113 : 1257 : return slotnames;
5114 : : }
5115 : :
5116 : : static PyObject *
5117 : 44913 : object_getstate_default(PyObject *obj, int required)
5118 : : {
5119 : : PyObject *state;
5120 : : PyObject *slotnames;
5121 : :
5122 [ + + + + ]: 44913 : if (required && Py_TYPE(obj)->tp_itemsize) {
5123 : 9 : PyErr_Format(PyExc_TypeError,
5124 : : "cannot pickle %.200s objects",
5125 : 9 : Py_TYPE(obj)->tp_name);
5126 : 9 : return NULL;
5127 : : }
5128 : :
5129 [ + + ]: 44904 : if (_PyObject_IsInstanceDictEmpty(obj)) {
5130 : 3311 : state = Py_None;
5131 : 3311 : Py_INCREF(state);
5132 : : }
5133 : : else {
5134 : 41593 : state = PyObject_GenericGetDict(obj, NULL);
5135 [ - + ]: 41593 : if (state == NULL) {
5136 : 0 : return NULL;
5137 : : }
5138 : : }
5139 : :
5140 : 44904 : slotnames = _PyType_GetSlotNames(Py_TYPE(obj));
5141 [ - + ]: 44904 : if (slotnames == NULL) {
5142 : 0 : Py_DECREF(state);
5143 : 0 : return NULL;
5144 : : }
5145 : :
5146 : : assert(slotnames == Py_None || PyList_Check(slotnames));
5147 [ + + ]: 44904 : if (required) {
5148 : 40056 : Py_ssize_t basicsize = PyBaseObject_Type.tp_basicsize;
5149 [ + + ]: 40056 : if (Py_TYPE(obj)->tp_dictoffset &&
5150 [ + + ]: 38963 : (Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT) == 0)
5151 : : {
5152 : 36 : basicsize += sizeof(PyObject *);
5153 : : }
5154 [ + + ]: 40056 : if (Py_TYPE(obj)->tp_weaklistoffset) {
5155 : 38972 : basicsize += sizeof(PyObject *);
5156 : : }
5157 [ + - ]: 40056 : if (slotnames != Py_None) {
5158 : 40056 : basicsize += sizeof(PyObject *) * PyList_GET_SIZE(slotnames);
5159 : : }
5160 [ + + ]: 40056 : if (Py_TYPE(obj)->tp_basicsize > basicsize) {
5161 : 281 : Py_DECREF(slotnames);
5162 : 281 : Py_DECREF(state);
5163 : 281 : PyErr_Format(PyExc_TypeError,
5164 : : "cannot pickle '%.200s' object",
5165 : 281 : Py_TYPE(obj)->tp_name);
5166 : 281 : return NULL;
5167 : : }
5168 : : }
5169 : :
5170 [ + - + + ]: 44623 : if (slotnames != Py_None && PyList_GET_SIZE(slotnames) > 0) {
5171 : : PyObject *slots;
5172 : : Py_ssize_t slotnames_size, i;
5173 : :
5174 : 991 : slots = PyDict_New();
5175 [ - + ]: 991 : if (slots == NULL) {
5176 : 0 : Py_DECREF(slotnames);
5177 : 0 : Py_DECREF(state);
5178 : 0 : return NULL;
5179 : : }
5180 : :
5181 : 991 : slotnames_size = PyList_GET_SIZE(slotnames);
5182 [ + + ]: 17238 : for (i = 0; i < slotnames_size; i++) {
5183 : : PyObject *name, *value;
5184 : :
5185 : 16247 : name = PyList_GET_ITEM(slotnames, i);
5186 : 16247 : Py_INCREF(name);
5187 [ - + ]: 16247 : if (_PyObject_LookupAttr(obj, name, &value) < 0) {
5188 : 0 : Py_DECREF(name);
5189 : 0 : goto error;
5190 : : }
5191 [ + + ]: 16247 : if (value == NULL) {
5192 : 1901 : Py_DECREF(name);
5193 : : /* It is not an error if the attribute is not present. */
5194 : : }
5195 : : else {
5196 : 14346 : int err = PyDict_SetItem(slots, name, value);
5197 : 14346 : Py_DECREF(name);
5198 : 14346 : Py_DECREF(value);
5199 [ - + ]: 14346 : if (err) {
5200 : 0 : goto error;
5201 : : }
5202 : : }
5203 : :
5204 : : /* The list is stored on the class so it may mutate while we
5205 : : iterate over it */
5206 [ - + ]: 16247 : if (slotnames_size != PyList_GET_SIZE(slotnames)) {
5207 : 0 : PyErr_Format(PyExc_RuntimeError,
5208 : : "__slotsname__ changed size during iteration");
5209 : 0 : goto error;
5210 : : }
5211 : :
5212 : : /* We handle errors within the loop here. */
5213 : : if (0) {
5214 : 0 : error:
5215 : 0 : Py_DECREF(slotnames);
5216 : 0 : Py_DECREF(slots);
5217 : 0 : Py_DECREF(state);
5218 : 0 : return NULL;
5219 : : }
5220 : : }
5221 : :
5222 : : /* If we found some slot attributes, pack them in a tuple along
5223 : : the original attribute dictionary. */
5224 [ + + ]: 991 : if (PyDict_GET_SIZE(slots) > 0) {
5225 : : PyObject *state2;
5226 : :
5227 : 984 : state2 = PyTuple_Pack(2, state, slots);
5228 : 984 : Py_DECREF(state);
5229 [ - + ]: 984 : if (state2 == NULL) {
5230 : 0 : Py_DECREF(slotnames);
5231 : 0 : Py_DECREF(slots);
5232 : 0 : return NULL;
5233 : : }
5234 : 984 : state = state2;
5235 : : }
5236 : 991 : Py_DECREF(slots);
5237 : : }
5238 : 44623 : Py_DECREF(slotnames);
5239 : :
5240 : 44623 : return state;
5241 : : }
5242 : :
5243 : : static PyObject *
5244 : 49594 : object_getstate(PyObject *obj, int required)
5245 : : {
5246 : : PyObject *getstate, *state;
5247 : :
5248 : 49594 : getstate = PyObject_GetAttr(obj, &_Py_ID(__getstate__));
5249 [ - + ]: 49594 : if (getstate == NULL) {
5250 : 0 : return NULL;
5251 : : }
5252 [ + + + - ]: 92883 : if (PyCFunction_Check(getstate) &&
5253 [ + + ]: 86578 : PyCFunction_GET_SELF(getstate) == obj &&
5254 : 43289 : PyCFunction_GET_FUNCTION(getstate) == object___getstate__)
5255 : : {
5256 : : /* If __getstate__ is not overriden pass the required argument. */
5257 : 43183 : state = object_getstate_default(obj, required);
5258 : : }
5259 : : else {
5260 : 6411 : state = _PyObject_CallNoArgs(getstate);
5261 : : }
5262 : 49594 : Py_DECREF(getstate);
5263 : 49594 : return state;
5264 : : }
5265 : :
5266 : : PyObject *
5267 : 719 : _PyObject_GetState(PyObject *obj)
5268 : : {
5269 : 719 : return object_getstate(obj, 0);
5270 : : }
5271 : :
5272 : : /*[clinic input]
5273 : : object.__getstate__
5274 : :
5275 : : Helper for pickle.
5276 : : [clinic start generated code]*/
5277 : :
5278 : : static PyObject *
5279 : 1730 : object___getstate___impl(PyObject *self)
5280 : : /*[clinic end generated code: output=5a2500dcb6217e9e input=692314d8fbe194ee]*/
5281 : : {
5282 : 1730 : return object_getstate_default(self, 0);
5283 : : }
5284 : :
5285 : : static int
5286 : 48899 : _PyObject_GetNewArguments(PyObject *obj, PyObject **args, PyObject **kwargs)
5287 : : {
5288 : : PyObject *getnewargs, *getnewargs_ex;
5289 : :
5290 [ + - - + ]: 48899 : if (args == NULL || kwargs == NULL) {
5291 : 0 : PyErr_BadInternalCall();
5292 : 0 : return -1;
5293 : : }
5294 : :
5295 : : /* We first attempt to fetch the arguments for __new__ by calling
5296 : : __getnewargs_ex__ on the object. */
5297 : 48899 : getnewargs_ex = _PyObject_LookupSpecial(obj, &_Py_ID(__getnewargs_ex__));
5298 [ + + ]: 48899 : if (getnewargs_ex != NULL) {
5299 : 92 : PyObject *newargs = _PyObject_CallNoArgs(getnewargs_ex);
5300 : 92 : Py_DECREF(getnewargs_ex);
5301 [ + + ]: 92 : if (newargs == NULL) {
5302 : 4 : return -1;
5303 : : }
5304 [ + + ]: 88 : if (!PyTuple_Check(newargs)) {
5305 : 4 : PyErr_Format(PyExc_TypeError,
5306 : : "__getnewargs_ex__ should return a tuple, "
5307 : 4 : "not '%.200s'", Py_TYPE(newargs)->tp_name);
5308 : 4 : Py_DECREF(newargs);
5309 : 4 : return -1;
5310 : : }
5311 [ + + ]: 84 : if (PyTuple_GET_SIZE(newargs) != 2) {
5312 : 4 : PyErr_Format(PyExc_ValueError,
5313 : : "__getnewargs_ex__ should return a tuple of "
5314 : : "length 2, not %zd", PyTuple_GET_SIZE(newargs));
5315 : 4 : Py_DECREF(newargs);
5316 : 4 : return -1;
5317 : : }
5318 : 80 : *args = PyTuple_GET_ITEM(newargs, 0);
5319 : 80 : Py_INCREF(*args);
5320 : 80 : *kwargs = PyTuple_GET_ITEM(newargs, 1);
5321 : 80 : Py_INCREF(*kwargs);
5322 : 80 : Py_DECREF(newargs);
5323 : :
5324 : : /* XXX We should perhaps allow None to be passed here. */
5325 [ + + ]: 80 : if (!PyTuple_Check(*args)) {
5326 : 4 : PyErr_Format(PyExc_TypeError,
5327 : : "first item of the tuple returned by "
5328 : : "__getnewargs_ex__ must be a tuple, not '%.200s'",
5329 : 4 : Py_TYPE(*args)->tp_name);
5330 [ + - ]: 4 : Py_CLEAR(*args);
5331 [ + - ]: 4 : Py_CLEAR(*kwargs);
5332 : 4 : return -1;
5333 : : }
5334 [ + + ]: 76 : if (!PyDict_Check(*kwargs)) {
5335 : 4 : PyErr_Format(PyExc_TypeError,
5336 : : "second item of the tuple returned by "
5337 : : "__getnewargs_ex__ must be a dict, not '%.200s'",
5338 : 4 : Py_TYPE(*kwargs)->tp_name);
5339 [ + - ]: 4 : Py_CLEAR(*args);
5340 [ + - ]: 4 : Py_CLEAR(*kwargs);
5341 : 4 : return -1;
5342 : : }
5343 : 72 : return 0;
5344 [ - + ]: 48807 : } else if (PyErr_Occurred()) {
5345 : 0 : return -1;
5346 : : }
5347 : :
5348 : : /* The object does not have __getnewargs_ex__ so we fallback on using
5349 : : __getnewargs__ instead. */
5350 : 48807 : getnewargs = _PyObject_LookupSpecial(obj, &_Py_ID(__getnewargs__));
5351 [ + + ]: 48807 : if (getnewargs != NULL) {
5352 : 1222 : *args = _PyObject_CallNoArgs(getnewargs);
5353 : 1222 : Py_DECREF(getnewargs);
5354 [ - + ]: 1222 : if (*args == NULL) {
5355 : 0 : return -1;
5356 : : }
5357 [ + + ]: 1222 : if (!PyTuple_Check(*args)) {
5358 : 4 : PyErr_Format(PyExc_TypeError,
5359 : : "__getnewargs__ should return a tuple, "
5360 : 4 : "not '%.200s'", Py_TYPE(*args)->tp_name);
5361 [ + - ]: 4 : Py_CLEAR(*args);
5362 : 4 : return -1;
5363 : : }
5364 : 1218 : *kwargs = NULL;
5365 : 1218 : return 0;
5366 [ - + ]: 47585 : } else if (PyErr_Occurred()) {
5367 : 0 : return -1;
5368 : : }
5369 : :
5370 : : /* The object does not have __getnewargs_ex__ and __getnewargs__. This may
5371 : : mean __new__ does not takes any arguments on this object, or that the
5372 : : object does not implement the reduce protocol for pickling or
5373 : : copying. */
5374 : 47585 : *args = NULL;
5375 : 47585 : *kwargs = NULL;
5376 : 47585 : return 0;
5377 : : }
5378 : :
5379 : : static int
5380 : 48508 : _PyObject_GetItemsIter(PyObject *obj, PyObject **listitems,
5381 : : PyObject **dictitems)
5382 : : {
5383 [ + - - + ]: 48508 : if (listitems == NULL || dictitems == NULL) {
5384 : 0 : PyErr_BadInternalCall();
5385 : 0 : return -1;
5386 : : }
5387 : :
5388 [ + + ]: 48508 : if (!PyList_Check(obj)) {
5389 : 47602 : *listitems = Py_None;
5390 : 47602 : Py_INCREF(*listitems);
5391 : : }
5392 : : else {
5393 : 906 : *listitems = PyObject_GetIter(obj);
5394 [ - + ]: 906 : if (*listitems == NULL)
5395 : 0 : return -1;
5396 : : }
5397 : :
5398 [ + + ]: 48508 : if (!PyDict_Check(obj)) {
5399 : 48228 : *dictitems = Py_None;
5400 : 48228 : Py_INCREF(*dictitems);
5401 : : }
5402 : : else {
5403 : 280 : PyObject *items = PyObject_CallMethodNoArgs(obj, &_Py_ID(items));
5404 [ - + ]: 280 : if (items == NULL) {
5405 [ # # ]: 0 : Py_CLEAR(*listitems);
5406 : 0 : return -1;
5407 : : }
5408 : 280 : *dictitems = PyObject_GetIter(items);
5409 : 280 : Py_DECREF(items);
5410 [ - + ]: 280 : if (*dictitems == NULL) {
5411 [ # # ]: 0 : Py_CLEAR(*listitems);
5412 : 0 : return -1;
5413 : : }
5414 : : }
5415 : :
5416 : : assert(*listitems != NULL && *dictitems != NULL);
5417 : :
5418 : 48508 : return 0;
5419 : : }
5420 : :
5421 : : static PyObject *
5422 : 48948 : reduce_newobj(PyObject *obj)
5423 : : {
5424 : 48948 : PyObject *args = NULL, *kwargs = NULL;
5425 : : PyObject *copyreg;
5426 : : PyObject *newobj, *newargs, *state, *listitems, *dictitems;
5427 : : PyObject *result;
5428 : : int hasargs;
5429 : :
5430 [ + + ]: 48948 : if (Py_TYPE(obj)->tp_new == NULL) {
5431 : 49 : PyErr_Format(PyExc_TypeError,
5432 : : "cannot pickle '%.200s' object",
5433 : 49 : Py_TYPE(obj)->tp_name);
5434 : 49 : return NULL;
5435 : : }
5436 [ + + ]: 48899 : if (_PyObject_GetNewArguments(obj, &args, &kwargs) < 0)
5437 : 24 : return NULL;
5438 : :
5439 : 48875 : copyreg = import_copyreg();
5440 [ - + ]: 48875 : if (copyreg == NULL) {
5441 : 0 : Py_XDECREF(args);
5442 : 0 : Py_XDECREF(kwargs);
5443 : 0 : return NULL;
5444 : : }
5445 : 48875 : hasargs = (args != NULL);
5446 [ + + + + ]: 97686 : if (kwargs == NULL || PyDict_GET_SIZE(kwargs) == 0) {
5447 : : PyObject *cls;
5448 : : Py_ssize_t i, n;
5449 : :
5450 : 48811 : Py_XDECREF(kwargs);
5451 : 48811 : newobj = PyObject_GetAttr(copyreg, &_Py_ID(__newobj__));
5452 : 48811 : Py_DECREF(copyreg);
5453 [ - + ]: 48811 : if (newobj == NULL) {
5454 : 0 : Py_XDECREF(args);
5455 : 0 : return NULL;
5456 : : }
5457 [ + + ]: 48811 : n = args ? PyTuple_GET_SIZE(args) : 0;
5458 : 48811 : newargs = PyTuple_New(n+1);
5459 [ - + ]: 48811 : if (newargs == NULL) {
5460 : 0 : Py_XDECREF(args);
5461 : 0 : Py_DECREF(newobj);
5462 : 0 : return NULL;
5463 : : }
5464 : 48811 : cls = (PyObject *) Py_TYPE(obj);
5465 : 48811 : Py_INCREF(cls);
5466 : 48811 : PyTuple_SET_ITEM(newargs, 0, cls);
5467 [ + + ]: 51382 : for (i = 0; i < n; i++) {
5468 : 2571 : PyObject *v = PyTuple_GET_ITEM(args, i);
5469 : 2571 : Py_INCREF(v);
5470 : 2571 : PyTuple_SET_ITEM(newargs, i+1, v);
5471 : : }
5472 : 48811 : Py_XDECREF(args);
5473 : : }
5474 [ + - ]: 64 : else if (args != NULL) {
5475 : 64 : newobj = PyObject_GetAttr(copyreg, &_Py_ID(__newobj_ex__));
5476 : 64 : Py_DECREF(copyreg);
5477 [ - + ]: 64 : if (newobj == NULL) {
5478 : 0 : Py_DECREF(args);
5479 : 0 : Py_DECREF(kwargs);
5480 : 0 : return NULL;
5481 : : }
5482 : 64 : newargs = PyTuple_Pack(3, Py_TYPE(obj), args, kwargs);
5483 : 64 : Py_DECREF(args);
5484 : 64 : Py_DECREF(kwargs);
5485 [ - + ]: 64 : if (newargs == NULL) {
5486 : 0 : Py_DECREF(newobj);
5487 : 0 : return NULL;
5488 : : }
5489 : : }
5490 : : else {
5491 : : /* args == NULL */
5492 : 0 : Py_DECREF(kwargs);
5493 : 0 : PyErr_BadInternalCall();
5494 : 0 : return NULL;
5495 : : }
5496 : :
5497 [ + + + + : 48875 : state = object_getstate(obj, !(hasargs || PyList_Check(obj) || PyDict_Check(obj)));
+ + ]
5498 [ + + ]: 48875 : if (state == NULL) {
5499 : 367 : Py_DECREF(newobj);
5500 : 367 : Py_DECREF(newargs);
5501 : 367 : return NULL;
5502 : : }
5503 [ - + ]: 48508 : if (_PyObject_GetItemsIter(obj, &listitems, &dictitems) < 0) {
5504 : 0 : Py_DECREF(newobj);
5505 : 0 : Py_DECREF(newargs);
5506 : 0 : Py_DECREF(state);
5507 : 0 : return NULL;
5508 : : }
5509 : :
5510 : 48508 : result = PyTuple_Pack(5, newobj, newargs, state, listitems, dictitems);
5511 : 48508 : Py_DECREF(newobj);
5512 : 48508 : Py_DECREF(newargs);
5513 : 48508 : Py_DECREF(state);
5514 : 48508 : Py_DECREF(listitems);
5515 : 48508 : Py_DECREF(dictitems);
5516 : 48508 : return result;
5517 : : }
5518 : :
5519 : : /*
5520 : : * There were two problems when object.__reduce__ and object.__reduce_ex__
5521 : : * were implemented in the same function:
5522 : : * - trying to pickle an object with a custom __reduce__ method that
5523 : : * fell back to object.__reduce__ in certain circumstances led to
5524 : : * infinite recursion at Python level and eventual RecursionError.
5525 : : * - Pickling objects that lied about their type by overwriting the
5526 : : * __class__ descriptor could lead to infinite recursion at C level
5527 : : * and eventual segfault.
5528 : : *
5529 : : * Because of backwards compatibility, the two methods still have to
5530 : : * behave in the same way, even if this is not required by the pickle
5531 : : * protocol. This common functionality was moved to the _common_reduce
5532 : : * function.
5533 : : */
5534 : : static PyObject *
5535 : 50606 : _common_reduce(PyObject *self, int proto)
5536 : : {
5537 : : PyObject *copyreg, *res;
5538 : :
5539 [ + + ]: 50606 : if (proto >= 2)
5540 : 48948 : return reduce_newobj(self);
5541 : :
5542 : 1658 : copyreg = import_copyreg();
5543 [ - + ]: 1658 : if (!copyreg)
5544 : 0 : return NULL;
5545 : :
5546 : 1658 : res = PyObject_CallMethod(copyreg, "_reduce_ex", "Oi", self, proto);
5547 : 1658 : Py_DECREF(copyreg);
5548 : :
5549 : 1658 : return res;
5550 : : }
5551 : :
5552 : : /*[clinic input]
5553 : : object.__reduce__
5554 : :
5555 : : Helper for pickle.
5556 : : [clinic start generated code]*/
5557 : :
5558 : : static PyObject *
5559 : 57 : object___reduce___impl(PyObject *self)
5560 : : /*[clinic end generated code: output=d4ca691f891c6e2f input=11562e663947e18b]*/
5561 : : {
5562 : 57 : return _common_reduce(self, 0);
5563 : : }
5564 : :
5565 : : /*[clinic input]
5566 : : object.__reduce_ex__
5567 : :
5568 : : protocol: int
5569 : : /
5570 : :
5571 : : Helper for pickle.
5572 : : [clinic start generated code]*/
5573 : :
5574 : : static PyObject *
5575 : 136841 : object___reduce_ex___impl(PyObject *self, int protocol)
5576 : : /*[clinic end generated code: output=2e157766f6b50094 input=f326b43fb8a4c5ff]*/
5577 : : {
5578 : : static PyObject *objreduce;
5579 : : PyObject *reduce, *res;
5580 : :
5581 [ + + ]: 136841 : if (objreduce == NULL) {
5582 : 244 : objreduce = PyDict_GetItemWithError(
5583 : : PyBaseObject_Type.tp_dict, &_Py_ID(__reduce__));
5584 [ - + - - ]: 244 : if (objreduce == NULL && PyErr_Occurred()) {
5585 : 0 : return NULL;
5586 : : }
5587 : : }
5588 : :
5589 [ - + ]: 136841 : if (_PyObject_LookupAttr(self, &_Py_ID(__reduce__), &reduce) < 0) {
5590 : 0 : return NULL;
5591 : : }
5592 [ + - ]: 136841 : if (reduce != NULL) {
5593 : : PyObject *cls, *clsreduce;
5594 : : int override;
5595 : :
5596 : 136841 : cls = (PyObject *) Py_TYPE(self);
5597 : 136841 : clsreduce = PyObject_GetAttr(cls, &_Py_ID(__reduce__));
5598 [ - + ]: 136841 : if (clsreduce == NULL) {
5599 : 0 : Py_DECREF(reduce);
5600 : 0 : return NULL;
5601 : : }
5602 : 136841 : override = (clsreduce != objreduce);
5603 : 136841 : Py_DECREF(clsreduce);
5604 [ + + ]: 136841 : if (override) {
5605 : 86292 : res = _PyObject_CallNoArgs(reduce);
5606 : 86292 : Py_DECREF(reduce);
5607 : 86292 : return res;
5608 : : }
5609 : : else
5610 : 50549 : Py_DECREF(reduce);
5611 : : }
5612 : :
5613 : 50549 : return _common_reduce(self, protocol);
5614 : : }
5615 : :
5616 : : static PyObject *
5617 : 39923 : object_subclasshook(PyObject *cls, PyObject *args)
5618 : : {
5619 : 39923 : Py_RETURN_NOTIMPLEMENTED;
5620 : : }
5621 : :
5622 : : PyDoc_STRVAR(object_subclasshook_doc,
5623 : : "Abstract classes can override this to customize issubclass().\n"
5624 : : "\n"
5625 : : "This is invoked early on by abc.ABCMeta.__subclasscheck__().\n"
5626 : : "It should return True, False or NotImplemented. If it returns\n"
5627 : : "NotImplemented, the normal algorithm is used. Otherwise, it\n"
5628 : : "overrides the normal algorithm (and the outcome is cached).\n");
5629 : :
5630 : : static PyObject *
5631 : 1199036 : object_init_subclass(PyObject *cls, PyObject *arg)
5632 : : {
5633 : 1199036 : Py_RETURN_NONE;
5634 : : }
5635 : :
5636 : : PyDoc_STRVAR(object_init_subclass_doc,
5637 : : "This method is called when a class is subclassed.\n"
5638 : : "\n"
5639 : : "The default implementation does nothing. It may be\n"
5640 : : "overridden to extend subclasses.\n");
5641 : :
5642 : : /*[clinic input]
5643 : : object.__format__
5644 : :
5645 : : format_spec: unicode
5646 : : /
5647 : :
5648 : : Default object formatter.
5649 : : [clinic start generated code]*/
5650 : :
5651 : : static PyObject *
5652 : 15149 : object___format___impl(PyObject *self, PyObject *format_spec)
5653 : : /*[clinic end generated code: output=34897efb543a974b input=7c3b3bc53a6fb7fa]*/
5654 : : {
5655 : : /* Issue 7994: If we're converting to a string, we
5656 : : should reject format specifications */
5657 [ + + ]: 15149 : if (PyUnicode_GET_LENGTH(format_spec) > 0) {
5658 : 10 : PyErr_Format(PyExc_TypeError,
5659 : : "unsupported format string passed to %.200s.__format__",
5660 : 10 : Py_TYPE(self)->tp_name);
5661 : 10 : return NULL;
5662 : : }
5663 : 15139 : return PyObject_Str(self);
5664 : : }
5665 : :
5666 : : /*[clinic input]
5667 : : object.__sizeof__
5668 : :
5669 : : Size of object in memory, in bytes.
5670 : : [clinic start generated code]*/
5671 : :
5672 : : static PyObject *
5673 : 91 : object___sizeof___impl(PyObject *self)
5674 : : /*[clinic end generated code: output=73edab332f97d550 input=1200ff3dfe485306]*/
5675 : : {
5676 : : Py_ssize_t res, isize;
5677 : :
5678 : 91 : res = 0;
5679 : 91 : isize = Py_TYPE(self)->tp_itemsize;
5680 [ + + ]: 91 : if (isize > 0)
5681 : 14 : res = Py_SIZE(self) * isize;
5682 : 91 : res += Py_TYPE(self)->tp_basicsize;
5683 : :
5684 : 91 : return PyLong_FromSsize_t(res);
5685 : : }
5686 : :
5687 : : /* __dir__ for generic objects: returns __dict__, __class__,
5688 : : and recursively up the __class__.__bases__ chain.
5689 : : */
5690 : : /*[clinic input]
5691 : : object.__dir__
5692 : :
5693 : : Default dir() implementation.
5694 : : [clinic start generated code]*/
5695 : :
5696 : : static PyObject *
5697 : 12569 : object___dir___impl(PyObject *self)
5698 : : /*[clinic end generated code: output=66dd48ea62f26c90 input=0a89305bec669b10]*/
5699 : : {
5700 : 12569 : PyObject *result = NULL;
5701 : 12569 : PyObject *dict = NULL;
5702 : 12569 : PyObject *itsclass = NULL;
5703 : :
5704 : : /* Get __dict__ (which may or may not be a real dict...) */
5705 [ - + ]: 12569 : if (_PyObject_LookupAttr(self, &_Py_ID(__dict__), &dict) < 0) {
5706 : 0 : return NULL;
5707 : : }
5708 [ + + ]: 12569 : if (dict == NULL) {
5709 : 8990 : dict = PyDict_New();
5710 : : }
5711 [ - + ]: 3579 : else if (!PyDict_Check(dict)) {
5712 : 0 : Py_DECREF(dict);
5713 : 0 : dict = PyDict_New();
5714 : : }
5715 : : else {
5716 : : /* Copy __dict__ to avoid mutating it. */
5717 : 3579 : PyObject *temp = PyDict_Copy(dict);
5718 : 3579 : Py_DECREF(dict);
5719 : 3579 : dict = temp;
5720 : : }
5721 : :
5722 [ - + ]: 12569 : if (dict == NULL)
5723 : 0 : goto error;
5724 : :
5725 : : /* Merge in attrs reachable from its class. */
5726 [ - + ]: 12569 : if (_PyObject_LookupAttr(self, &_Py_ID(__class__), &itsclass) < 0) {
5727 : 0 : goto error;
5728 : : }
5729 : : /* XXX(tomer): Perhaps fall back to Py_TYPE(obj) if no
5730 : : __class__ exists? */
5731 [ + + - + ]: 12569 : if (itsclass != NULL && merge_class_dict(dict, itsclass) < 0)
5732 : 0 : goto error;
5733 : :
5734 : 12569 : result = PyDict_Keys(dict);
5735 : : /* fall through */
5736 : 12569 : error:
5737 : 12569 : Py_XDECREF(itsclass);
5738 : 12569 : Py_XDECREF(dict);
5739 : 12569 : return result;
5740 : : }
5741 : :
5742 : : static PyMethodDef object_methods[] = {
5743 : : OBJECT___REDUCE_EX___METHODDEF
5744 : : OBJECT___REDUCE___METHODDEF
5745 : : OBJECT___GETSTATE___METHODDEF
5746 : : {"__subclasshook__", object_subclasshook, METH_CLASS | METH_VARARGS,
5747 : : object_subclasshook_doc},
5748 : : {"__init_subclass__", object_init_subclass, METH_CLASS | METH_NOARGS,
5749 : : object_init_subclass_doc},
5750 : : OBJECT___FORMAT___METHODDEF
5751 : : OBJECT___SIZEOF___METHODDEF
5752 : : OBJECT___DIR___METHODDEF
5753 : : {0}
5754 : : };
5755 : :
5756 : : PyDoc_STRVAR(object_doc,
5757 : : "object()\n--\n\n"
5758 : : "The base class of the class hierarchy.\n\n"
5759 : : "When called, it accepts no arguments and returns a new featureless\n"
5760 : : "instance that has no instance attributes and cannot be given any.\n");
5761 : :
5762 : : PyTypeObject PyBaseObject_Type = {
5763 : : PyVarObject_HEAD_INIT(&PyType_Type, 0)
5764 : : "object", /* tp_name */
5765 : : sizeof(PyObject), /* tp_basicsize */
5766 : : 0, /* tp_itemsize */
5767 : : object_dealloc, /* tp_dealloc */
5768 : : 0, /* tp_vectorcall_offset */
5769 : : 0, /* tp_getattr */
5770 : : 0, /* tp_setattr */
5771 : : 0, /* tp_as_async */
5772 : : object_repr, /* tp_repr */
5773 : : 0, /* tp_as_number */
5774 : : 0, /* tp_as_sequence */
5775 : : 0, /* tp_as_mapping */
5776 : : (hashfunc)_Py_HashPointer, /* tp_hash */
5777 : : 0, /* tp_call */
5778 : : object_str, /* tp_str */
5779 : : PyObject_GenericGetAttr, /* tp_getattro */
5780 : : PyObject_GenericSetAttr, /* tp_setattro */
5781 : : 0, /* tp_as_buffer */
5782 : : Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
5783 : : object_doc, /* tp_doc */
5784 : : 0, /* tp_traverse */
5785 : : 0, /* tp_clear */
5786 : : object_richcompare, /* tp_richcompare */
5787 : : 0, /* tp_weaklistoffset */
5788 : : 0, /* tp_iter */
5789 : : 0, /* tp_iternext */
5790 : : object_methods, /* tp_methods */
5791 : : 0, /* tp_members */
5792 : : object_getsets, /* tp_getset */
5793 : : 0, /* tp_base */
5794 : : 0, /* tp_dict */
5795 : : 0, /* tp_descr_get */
5796 : : 0, /* tp_descr_set */
5797 : : 0, /* tp_dictoffset */
5798 : : object_init, /* tp_init */
5799 : : PyType_GenericAlloc, /* tp_alloc */
5800 : : object_new, /* tp_new */
5801 : : PyObject_Del, /* tp_free */
5802 : : };
5803 : :
5804 : :
5805 : : static int
5806 : 2379008 : type_add_method(PyTypeObject *type, PyMethodDef *meth)
5807 : : {
5808 : : PyObject *descr;
5809 : 2379008 : int isdescr = 1;
5810 [ + + ]: 2379008 : if (meth->ml_flags & METH_CLASS) {
5811 [ - + ]: 95990 : if (meth->ml_flags & METH_STATIC) {
5812 : 0 : PyErr_SetString(PyExc_ValueError,
5813 : : "method cannot be both class and static");
5814 : 0 : return -1;
5815 : : }
5816 : 95990 : descr = PyDescr_NewClassMethod(type, meth);
5817 : : }
5818 [ + + ]: 2283018 : else if (meth->ml_flags & METH_STATIC) {
5819 : 15923 : PyObject *cfunc = PyCFunction_NewEx(meth, (PyObject*)type, NULL);
5820 [ - + ]: 15923 : if (cfunc == NULL) {
5821 : 0 : return -1;
5822 : : }
5823 : 15923 : descr = PyStaticMethod_New(cfunc);
5824 : 15923 : isdescr = 0; // PyStaticMethod is not PyDescrObject
5825 : 15923 : Py_DECREF(cfunc);
5826 : : }
5827 : : else {
5828 : 2267095 : descr = PyDescr_NewMethod(type, meth);
5829 : : }
5830 [ - + ]: 2379008 : if (descr == NULL) {
5831 : 0 : return -1;
5832 : : }
5833 : :
5834 : : PyObject *name;
5835 [ + + ]: 2379008 : if (isdescr) {
5836 : 2363085 : name = PyDescr_NAME(descr);
5837 : : }
5838 : : else {
5839 : 15923 : name = PyUnicode_FromString(meth->ml_name);
5840 [ - + ]: 15923 : if (name == NULL) {
5841 : 0 : Py_DECREF(descr);
5842 : 0 : return -1;
5843 : : }
5844 : : }
5845 : :
5846 : : int err;
5847 [ + + ]: 2379008 : if (!(meth->ml_flags & METH_COEXIST)) {
5848 : 2364179 : err = PyDict_SetDefault(type->tp_dict, name, descr) == NULL;
5849 : : }
5850 : : else {
5851 : 14829 : err = PyDict_SetItem(type->tp_dict, name, descr) < 0;
5852 : : }
5853 [ + + ]: 2379008 : if (!isdescr) {
5854 : 15923 : Py_DECREF(name);
5855 : : }
5856 : 2379008 : Py_DECREF(descr);
5857 [ - + ]: 2379008 : if (err) {
5858 : 0 : return -1;
5859 : : }
5860 : 2379008 : return 0;
5861 : : }
5862 : :
5863 : :
5864 : : /* Add the methods from tp_methods to the __dict__ in a type object */
5865 : : static int
5866 : 2005280 : type_add_methods(PyTypeObject *type)
5867 : : {
5868 : 2005280 : PyMethodDef *meth = type->tp_methods;
5869 [ + + ]: 2005280 : if (meth == NULL) {
5870 : 1529387 : return 0;
5871 : : }
5872 : :
5873 [ + + ]: 2854901 : for (; meth->ml_name != NULL; meth++) {
5874 [ - + ]: 2379008 : if (type_add_method(type, meth) < 0) {
5875 : 0 : return -1;
5876 : : }
5877 : : }
5878 : 475893 : return 0;
5879 : : }
5880 : :
5881 : :
5882 : : static int
5883 : 2005280 : type_add_members(PyTypeObject *type)
5884 : : {
5885 : 2005280 : PyMemberDef *memb = type->tp_members;
5886 [ + + ]: 2005280 : if (memb == NULL) {
5887 : 529578 : return 0;
5888 : : }
5889 : :
5890 : 1475702 : PyObject *dict = type->tp_dict;
5891 [ + + ]: 2506010 : for (; memb->name != NULL; memb++) {
5892 : 1030308 : PyObject *descr = PyDescr_NewMember(type, memb);
5893 [ - + ]: 1030308 : if (descr == NULL)
5894 : 0 : return -1;
5895 : :
5896 [ - + ]: 1030308 : if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
5897 : 0 : Py_DECREF(descr);
5898 : 0 : return -1;
5899 : : }
5900 : 1030308 : Py_DECREF(descr);
5901 : : }
5902 : 1475702 : return 0;
5903 : : }
5904 : :
5905 : :
5906 : : static int
5907 : 2005280 : type_add_getset(PyTypeObject *type)
5908 : : {
5909 : 2005280 : PyGetSetDef *gsp = type->tp_getset;
5910 [ + + ]: 2005280 : if (gsp == NULL) {
5911 : 1305787 : return 0;
5912 : : }
5913 : :
5914 : 699493 : PyObject *dict = type->tp_dict;
5915 [ + + ]: 2102784 : for (; gsp->name != NULL; gsp++) {
5916 : 1403291 : PyObject *descr = PyDescr_NewGetSet(type, gsp);
5917 [ - + ]: 1403291 : if (descr == NULL) {
5918 : 0 : return -1;
5919 : : }
5920 : :
5921 [ - + ]: 1403291 : if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
5922 : 0 : Py_DECREF(descr);
5923 : 0 : return -1;
5924 : : }
5925 : 1403291 : Py_DECREF(descr);
5926 : : }
5927 : 699493 : return 0;
5928 : : }
5929 : :
5930 : :
5931 : : static void
5932 : 2002316 : inherit_special(PyTypeObject *type, PyTypeObject *base)
5933 : : {
5934 : : /* Copying tp_traverse and tp_clear is connected to the GC flags */
5935 [ + + ]: 2002316 : if (!(type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
5936 [ + + ]: 163909 : (base->tp_flags & Py_TPFLAGS_HAVE_GC) &&
5937 [ + - + - ]: 26788 : (!type->tp_traverse && !type->tp_clear)) {
5938 : 26788 : type->tp_flags |= Py_TPFLAGS_HAVE_GC;
5939 [ + - ]: 26788 : if (type->tp_traverse == NULL)
5940 : 26788 : type->tp_traverse = base->tp_traverse;
5941 [ + - ]: 26788 : if (type->tp_clear == NULL)
5942 : 26788 : type->tp_clear = base->tp_clear;
5943 : : }
5944 : 2002316 : type->tp_flags |= (base->tp_flags & Py_TPFLAGS_MANAGED_DICT);
5945 : :
5946 [ + + ]: 2002316 : if (type->tp_basicsize == 0)
5947 : 30731 : type->tp_basicsize = base->tp_basicsize;
5948 : :
5949 : : /* Copy other non-function slots */
5950 : :
5951 : : #define COPYVAL(SLOT) \
5952 : : if (type->SLOT == 0) { type->SLOT = base->SLOT; }
5953 : :
5954 [ + + ]: 2002316 : COPYVAL(tp_itemsize);
5955 [ + + ]: 2002316 : COPYVAL(tp_weaklistoffset);
5956 [ + + ]: 2002316 : COPYVAL(tp_dictoffset);
5957 : : #undef COPYVAL
5958 : :
5959 : : /* Setup fast subclass flags */
5960 [ + + ]: 2002316 : if (PyType_IsSubtype(base, (PyTypeObject*)PyExc_BaseException)) {
5961 : 298657 : type->tp_flags |= Py_TPFLAGS_BASE_EXC_SUBCLASS;
5962 : : }
5963 [ + + ]: 1703659 : else if (PyType_IsSubtype(base, &PyType_Type)) {
5964 : 16014 : type->tp_flags |= Py_TPFLAGS_TYPE_SUBCLASS;
5965 : : }
5966 [ + + ]: 1687645 : else if (PyType_IsSubtype(base, &PyLong_Type)) {
5967 : 26092 : type->tp_flags |= Py_TPFLAGS_LONG_SUBCLASS;
5968 : : }
5969 [ + + ]: 1661553 : else if (PyType_IsSubtype(base, &PyBytes_Type)) {
5970 : 715 : type->tp_flags |= Py_TPFLAGS_BYTES_SUBCLASS;
5971 : : }
5972 [ + + ]: 1660838 : else if (PyType_IsSubtype(base, &PyUnicode_Type)) {
5973 : 13588 : type->tp_flags |= Py_TPFLAGS_UNICODE_SUBCLASS;
5974 : : }
5975 [ + + ]: 1647250 : else if (PyType_IsSubtype(base, &PyTuple_Type)) {
5976 : 99847 : type->tp_flags |= Py_TPFLAGS_TUPLE_SUBCLASS;
5977 : : }
5978 [ + + ]: 1547403 : else if (PyType_IsSubtype(base, &PyList_Type)) {
5979 : 5742 : type->tp_flags |= Py_TPFLAGS_LIST_SUBCLASS;
5980 : : }
5981 [ + + ]: 1541661 : else if (PyType_IsSubtype(base, &PyDict_Type)) {
5982 : 12566 : type->tp_flags |= Py_TPFLAGS_DICT_SUBCLASS;
5983 : : }
5984 [ + + ]: 2002316 : if (PyType_HasFeature(base, _Py_TPFLAGS_MATCH_SELF)) {
5985 : 159510 : type->tp_flags |= _Py_TPFLAGS_MATCH_SELF;
5986 : : }
5987 : 2002316 : }
5988 : :
5989 : : static int
5990 : 1959158 : overrides_hash(PyTypeObject *type)
5991 : : {
5992 : 1959158 : PyObject *dict = type->tp_dict;
5993 : :
5994 : : assert(dict != NULL);
5995 : 1959158 : int r = PyDict_Contains(dict, &_Py_ID(__eq__));
5996 [ + + ]: 1959158 : if (r == 0) {
5997 : 1809844 : r = PyDict_Contains(dict, &_Py_ID(__hash__));
5998 : : }
5999 : 1959158 : return r;
6000 : : }
6001 : :
6002 : : static int
6003 : 4629456 : inherit_slots(PyTypeObject *type, PyTypeObject *base)
6004 : : {
6005 : : PyTypeObject *basebase;
6006 : :
6007 : : #undef SLOTDEFINED
6008 : : #undef COPYSLOT
6009 : : #undef COPYNUM
6010 : : #undef COPYSEQ
6011 : : #undef COPYMAP
6012 : : #undef COPYBUF
6013 : :
6014 : : #define SLOTDEFINED(SLOT) \
6015 : : (base->SLOT != 0 && \
6016 : : (basebase == NULL || base->SLOT != basebase->SLOT))
6017 : :
6018 : : #define COPYSLOT(SLOT) \
6019 : : if (!type->SLOT && SLOTDEFINED(SLOT)) type->SLOT = base->SLOT
6020 : :
6021 : : #define COPYASYNC(SLOT) COPYSLOT(tp_as_async->SLOT)
6022 : : #define COPYNUM(SLOT) COPYSLOT(tp_as_number->SLOT)
6023 : : #define COPYSEQ(SLOT) COPYSLOT(tp_as_sequence->SLOT)
6024 : : #define COPYMAP(SLOT) COPYSLOT(tp_as_mapping->SLOT)
6025 : : #define COPYBUF(SLOT) COPYSLOT(tp_as_buffer->SLOT)
6026 : :
6027 : : /* This won't inherit indirect slots (from tp_as_number etc.)
6028 : : if type doesn't provide the space. */
6029 : :
6030 [ + + + + ]: 4629456 : if (type->tp_as_number != NULL && base->tp_as_number != NULL) {
6031 : 1597484 : basebase = base->tp_base;
6032 [ + + ]: 1597484 : if (basebase->tp_as_number == NULL)
6033 : 959862 : basebase = NULL;
6034 [ + + + + : 1597484 : COPYNUM(nb_add);
+ + + + ]
6035 [ + + + + : 1597484 : COPYNUM(nb_subtract);
+ + + + ]
6036 [ + + + + : 1597484 : COPYNUM(nb_multiply);
+ + + + ]
6037 [ + + + + : 1597484 : COPYNUM(nb_remainder);
+ + + + ]
6038 [ + + + + : 1597484 : COPYNUM(nb_divmod);
+ + + + ]
6039 [ + + + + : 1597484 : COPYNUM(nb_power);
+ + + + ]
6040 [ + + + + : 1597484 : COPYNUM(nb_negative);
+ + + + ]
6041 [ + + + + : 1597484 : COPYNUM(nb_positive);
+ + + + ]
6042 [ + + + + : 1597484 : COPYNUM(nb_absolute);
+ + + + ]
6043 [ + + + + : 1597484 : COPYNUM(nb_bool);
+ + + + ]
6044 [ + + + + : 1597484 : COPYNUM(nb_invert);
+ + + + ]
6045 [ + + + + : 1597484 : COPYNUM(nb_lshift);
+ + + + ]
6046 [ + + + + : 1597484 : COPYNUM(nb_rshift);
+ + - + ]
6047 [ + + + + : 1597484 : COPYNUM(nb_and);
+ + + + ]
6048 [ + + + + : 1597484 : COPYNUM(nb_xor);
+ + + + ]
6049 [ + + + + : 1597484 : COPYNUM(nb_or);
+ + + + ]
6050 [ + + + + : 1597484 : COPYNUM(nb_int);
+ + + + ]
6051 [ + + + + : 1597484 : COPYNUM(nb_float);
+ + + + ]
6052 [ + + + + : 1597484 : COPYNUM(nb_inplace_add);
+ + + + ]
6053 [ + + + + : 1597484 : COPYNUM(nb_inplace_subtract);
+ + + + ]
6054 [ + + + + : 1597484 : COPYNUM(nb_inplace_multiply);
+ - + - ]
6055 [ + - - + : 1597484 : COPYNUM(nb_inplace_remainder);
- - - - ]
6056 [ + - + + : 1597484 : COPYNUM(nb_inplace_power);
- + - - ]
6057 [ + + + + : 1597484 : COPYNUM(nb_inplace_lshift);
+ - + - ]
6058 [ + - - + : 1597484 : COPYNUM(nb_inplace_rshift);
- - - - ]
6059 [ + + + + : 1597484 : COPYNUM(nb_inplace_and);
+ + + + ]
6060 [ + + + + : 1597484 : COPYNUM(nb_inplace_xor);
+ + + + ]
6061 [ + + + + : 1597484 : COPYNUM(nb_inplace_or);
+ + + + ]
6062 [ + + + + : 1597484 : COPYNUM(nb_true_divide);
+ + + + ]
6063 [ + + + + : 1597484 : COPYNUM(nb_floor_divide);
+ + + + ]
6064 [ + - - + : 1597484 : COPYNUM(nb_inplace_true_divide);
- - - - ]
6065 [ + - - + : 1597484 : COPYNUM(nb_inplace_floor_divide);
- - - - ]
6066 [ + + + + : 1597484 : COPYNUM(nb_index);
+ + - + ]
6067 [ + - + + : 1597484 : COPYNUM(nb_matrix_multiply);
- + - - ]
6068 [ + - - + : 1597484 : COPYNUM(nb_inplace_matrix_multiply);
- - - - ]
6069 : : }
6070 : :
6071 [ + + + + ]: 4629456 : if (type->tp_as_async != NULL && base->tp_as_async != NULL) {
6072 : 1514675 : basebase = base->tp_base;
6073 [ + + ]: 1514675 : if (basebase->tp_as_async == NULL)
6074 : 908045 : basebase = NULL;
6075 [ + + + + : 1514675 : COPYASYNC(am_await);
+ + - + ]
6076 [ + + + + : 1514675 : COPYASYNC(am_aiter);
+ + - + ]
6077 [ + + + + : 1514675 : COPYASYNC(am_anext);
+ - + + ]
6078 : : }
6079 : :
6080 [ + + + + ]: 4629456 : if (type->tp_as_sequence != NULL && base->tp_as_sequence != NULL) {
6081 : 1618400 : basebase = base->tp_base;
6082 [ + + ]: 1618400 : if (basebase->tp_as_sequence == NULL)
6083 : 988875 : basebase = NULL;
6084 [ + + + + : 1618400 : COPYSEQ(sq_length);
+ + + + ]
6085 [ + + + + : 1618400 : COPYSEQ(sq_concat);
+ + - + ]
6086 [ + + + + : 1618400 : COPYSEQ(sq_repeat);
+ + - + ]
6087 [ + + + + : 1618400 : COPYSEQ(sq_item);
+ + + + ]
6088 [ + + + + : 1618400 : COPYSEQ(sq_ass_item);
+ + + + ]
6089 [ + + + + : 1618400 : COPYSEQ(sq_contains);
+ + + + ]
6090 [ + + + + : 1618400 : COPYSEQ(sq_inplace_concat);
+ + - + ]
6091 [ + + + + : 1618400 : COPYSEQ(sq_inplace_repeat);
+ + - + ]
6092 : : }
6093 : :
6094 [ + + + + ]: 4629456 : if (type->tp_as_mapping != NULL && base->tp_as_mapping != NULL) {
6095 : 1623354 : basebase = base->tp_base;
6096 [ + + ]: 1623354 : if (basebase->tp_as_mapping == NULL)
6097 : 993833 : basebase = NULL;
6098 [ + + + + : 1623354 : COPYMAP(mp_length);
+ + + + ]
6099 [ + + + + : 1623354 : COPYMAP(mp_subscript);
+ + + + ]
6100 [ + + + + : 1623354 : COPYMAP(mp_ass_subscript);
+ + + + ]
6101 : : }
6102 : :
6103 [ + + + + ]: 4629456 : if (type->tp_as_buffer != NULL && base->tp_as_buffer != NULL) {
6104 : 1541864 : basebase = base->tp_base;
6105 [ + + ]: 1541864 : if (basebase->tp_as_buffer == NULL)
6106 : 922497 : basebase = NULL;
6107 [ + + + + : 1541864 : COPYBUF(bf_getbuffer);
+ + - + ]
6108 [ + - + + : 1541864 : COPYBUF(bf_releasebuffer);
- + - - ]
6109 : : }
6110 : :
6111 : 4629456 : basebase = base->tp_base;
6112 : :
6113 [ + + + - : 4629456 : COPYSLOT(tp_dealloc);
+ + + + ]
6114 [ + - + + ]: 4629456 : if (type->tp_getattr == NULL && type->tp_getattro == NULL) {
6115 : 1661112 : type->tp_getattr = base->tp_getattr;
6116 : 1661112 : type->tp_getattro = base->tp_getattro;
6117 : : }
6118 [ + + + + ]: 4629456 : if (type->tp_setattr == NULL && type->tp_setattro == NULL) {
6119 : 1955758 : type->tp_setattr = base->tp_setattr;
6120 : 1955758 : type->tp_setattro = base->tp_setattro;
6121 : : }
6122 [ + + + + : 4629456 : COPYSLOT(tp_repr);
+ + + + ]
6123 : : /* tp_hash see tp_richcompare */
6124 : : {
6125 : : /* Always inherit tp_vectorcall_offset to support PyVectorcall_Call().
6126 : : * If Py_TPFLAGS_HAVE_VECTORCALL is not inherited, then vectorcall
6127 : : * won't be used automatically. */
6128 [ + + + + : 4629456 : COPYSLOT(tp_vectorcall_offset);
+ - + + ]
6129 : :
6130 : : /* Inherit Py_TPFLAGS_HAVE_VECTORCALL for non-heap types
6131 : : * if tp_call is not overridden */
6132 [ + + + + ]: 9021098 : if (!type->tp_call &&
6133 [ + + ]: 4418396 : _PyType_HasFeature(base, Py_TPFLAGS_HAVE_VECTORCALL) &&
6134 : 26754 : _PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE))
6135 : : {
6136 : 6065 : type->tp_flags |= Py_TPFLAGS_HAVE_VECTORCALL;
6137 : : }
6138 [ + + + + : 4629456 : COPYSLOT(tp_call);
+ - + + ]
6139 : : }
6140 [ + + + + : 4629456 : COPYSLOT(tp_str);
+ + + + ]
6141 : : {
6142 : : /* Copy comparison-related slots only when
6143 : : not overriding them anywhere */
6144 [ + + ]: 4629456 : if (type->tp_richcompare == NULL &&
6145 [ + + ]: 2002918 : type->tp_hash == NULL)
6146 : : {
6147 : 1959158 : int r = overrides_hash(type);
6148 [ - + ]: 1959158 : if (r < 0) {
6149 : 0 : return -1;
6150 : : }
6151 [ + + ]: 1959158 : if (!r) {
6152 : 1800689 : type->tp_richcompare = base->tp_richcompare;
6153 : 1800689 : type->tp_hash = base->tp_hash;
6154 : : }
6155 : : }
6156 : : }
6157 : : {
6158 [ + + + + : 4629456 : COPYSLOT(tp_iter);
+ - + + ]
6159 [ + + + + : 4629456 : COPYSLOT(tp_iternext);
+ - + + ]
6160 : : }
6161 : : {
6162 [ + + + + : 4629456 : COPYSLOT(tp_descr_get);
+ - + - ]
6163 : : /* Inherit Py_TPFLAGS_METHOD_DESCRIPTOR if tp_descr_get was inherited,
6164 : : * but only for extension types */
6165 [ + + ]: 4629456 : if (base->tp_descr_get &&
6166 [ + + + + ]: 28544 : type->tp_descr_get == base->tp_descr_get &&
6167 [ + - ]: 16027 : _PyType_HasFeature(type, Py_TPFLAGS_IMMUTABLETYPE) &&
6168 : 2340 : _PyType_HasFeature(base, Py_TPFLAGS_METHOD_DESCRIPTOR))
6169 : : {
6170 : 2340 : type->tp_flags |= Py_TPFLAGS_METHOD_DESCRIPTOR;
6171 : : }
6172 [ + + + + : 4629456 : COPYSLOT(tp_descr_set);
+ - + - ]
6173 [ + + - + : 4629456 : COPYSLOT(tp_dictoffset);
- - - - ]
6174 [ + + + + : 4629456 : COPYSLOT(tp_init);
+ + + + ]
6175 [ + + + - : 4629456 : COPYSLOT(tp_alloc);
+ + + + ]
6176 [ + + + + : 4629456 : COPYSLOT(tp_is_gc);
+ - + + ]
6177 [ + + + + : 4629456 : COPYSLOT(tp_finalize);
+ - + + ]
6178 : 4629456 : if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) ==
6179 [ + + ]: 4629456 : (base->tp_flags & Py_TPFLAGS_HAVE_GC)) {
6180 : : /* They agree about gc. */
6181 [ + + + - : 2696682 : COPYSLOT(tp_free);
+ + + + ]
6182 : : }
6183 [ + - ]: 1932774 : else if ((type->tp_flags & Py_TPFLAGS_HAVE_GC) &&
6184 [ + + ]: 1932774 : type->tp_free == NULL &&
6185 [ + - ]: 217996 : base->tp_free == PyObject_Free) {
6186 : : /* A bit of magic to plug in the correct default
6187 : : * tp_free function when a derived class adds gc,
6188 : : * didn't define tp_free, and the base uses the
6189 : : * default non-gc tp_free.
6190 : : */
6191 : 217996 : type->tp_free = PyObject_GC_Del;
6192 : : }
6193 : : /* else they didn't agree about gc, and there isn't something
6194 : : * obvious to be done -- the type is on its own.
6195 : : */
6196 : : }
6197 : 4629456 : return 0;
6198 : : }
6199 : :
6200 : : static int add_operators(PyTypeObject *);
6201 : : static int add_tp_new_wrapper(PyTypeObject *type);
6202 : :
6203 : : #define COLLECTION_FLAGS (Py_TPFLAGS_SEQUENCE | Py_TPFLAGS_MAPPING)
6204 : :
6205 : : static int
6206 : 2005296 : type_ready_pre_checks(PyTypeObject *type)
6207 : : {
6208 : : /* Consistency checks for PEP 590:
6209 : : * - Py_TPFLAGS_METHOD_DESCRIPTOR requires tp_descr_get
6210 : : * - Py_TPFLAGS_HAVE_VECTORCALL requires tp_call and
6211 : : * tp_vectorcall_offset > 0
6212 : : * To avoid mistakes, we require this before inheriting.
6213 : : */
6214 : 2005296 : if (type->tp_flags & Py_TPFLAGS_METHOD_DESCRIPTOR) {
6215 : : _PyObject_ASSERT((PyObject *)type, type->tp_descr_get != NULL);
6216 : : }
6217 : 2005296 : if (type->tp_flags & Py_TPFLAGS_HAVE_VECTORCALL) {
6218 : : _PyObject_ASSERT((PyObject *)type, type->tp_vectorcall_offset > 0);
6219 : : _PyObject_ASSERT((PyObject *)type, type->tp_call != NULL);
6220 : : }
6221 : :
6222 : : /* Consistency checks for pattern matching
6223 : : * Py_TPFLAGS_SEQUENCE and Py_TPFLAGS_MAPPING are mutually exclusive */
6224 : : _PyObject_ASSERT((PyObject *)type, (type->tp_flags & COLLECTION_FLAGS) != COLLECTION_FLAGS);
6225 : :
6226 [ - + ]: 2005296 : if (type->tp_name == NULL) {
6227 : 0 : PyErr_Format(PyExc_SystemError,
6228 : : "Type does not define the tp_name field.");
6229 : 0 : return -1;
6230 : : }
6231 : 2005296 : return 0;
6232 : : }
6233 : :
6234 : :
6235 : : static int
6236 : 2005296 : type_ready_set_bases(PyTypeObject *type)
6237 : : {
6238 : : /* Initialize tp_base (defaults to BaseObject unless that's us) */
6239 : 2005296 : PyTypeObject *base = type->tp_base;
6240 [ + + + + ]: 2005296 : if (base == NULL && type != &PyBaseObject_Type) {
6241 : 386206 : base = &PyBaseObject_Type;
6242 [ - + ]: 386206 : if (type->tp_flags & Py_TPFLAGS_HEAPTYPE) {
6243 : 0 : type->tp_base = (PyTypeObject*)Py_NewRef((PyObject*)base);
6244 : : }
6245 : : else {
6246 : 386206 : type->tp_base = base;
6247 : : }
6248 : : }
6249 : : assert(type->tp_base != NULL || type == &PyBaseObject_Type);
6250 : :
6251 : : /* Now the only way base can still be NULL is if type is
6252 : : * &PyBaseObject_Type. */
6253 : :
6254 : : /* Initialize the base class */
6255 [ + + - + ]: 2005296 : if (base != NULL && !_PyType_IsReady(base)) {
6256 [ # # ]: 0 : if (PyType_Ready(base) < 0) {
6257 : 0 : return -1;
6258 : : }
6259 : : }
6260 : :
6261 : : /* Initialize ob_type if NULL. This means extensions that want to be
6262 : : compilable separately on Windows can call PyType_Ready() instead of
6263 : : initializing the ob_type field of their type objects. */
6264 : : /* The test for base != NULL is really unnecessary, since base is only
6265 : : NULL when type is &PyBaseObject_Type, and we know its ob_type is
6266 : : not NULL (it's initialized to &PyType_Type). But coverity doesn't
6267 : : know that. */
6268 [ + + + - ]: 2005296 : if (Py_IS_TYPE(type, NULL) && base != NULL) {
6269 : 348631 : Py_SET_TYPE(type, Py_TYPE(base));
6270 : : }
6271 : :
6272 : : /* Initialize tp_bases */
6273 : 2005296 : PyObject *bases = type->tp_bases;
6274 [ + + ]: 2005296 : if (bases == NULL) {
6275 : 672918 : PyTypeObject *base = type->tp_base;
6276 [ + + ]: 672918 : if (base == NULL) {
6277 : 2964 : bases = PyTuple_New(0);
6278 : : }
6279 : : else {
6280 : 669954 : bases = PyTuple_Pack(1, base);
6281 : : }
6282 [ - + ]: 672918 : if (bases == NULL) {
6283 : 0 : return -1;
6284 : : }
6285 : 672918 : type->tp_bases = bases;
6286 : : }
6287 : 2005296 : return 0;
6288 : : }
6289 : :
6290 : :
6291 : : static int
6292 : 2005296 : type_ready_set_dict(PyTypeObject *type)
6293 : : {
6294 [ + + ]: 2005296 : if (type->tp_dict != NULL) {
6295 : 1216589 : return 0;
6296 : : }
6297 : :
6298 : 788707 : PyObject *dict = PyDict_New();
6299 [ - + ]: 788707 : if (dict == NULL) {
6300 : 0 : return -1;
6301 : : }
6302 : 788707 : type->tp_dict = dict;
6303 : 788707 : return 0;
6304 : : }
6305 : :
6306 : :
6307 : : /* If the type dictionary doesn't contain a __doc__, set it from
6308 : : the tp_doc slot. */
6309 : : static int
6310 : 2005280 : type_dict_set_doc(PyTypeObject *type)
6311 : : {
6312 : 2005280 : int r = PyDict_Contains(type->tp_dict, &_Py_ID(__doc__));
6313 [ - + ]: 2005280 : if (r < 0) {
6314 : 0 : return -1;
6315 : : }
6316 [ + + ]: 2005280 : if (r > 0) {
6317 : 784693 : return 0;
6318 : : }
6319 : :
6320 [ + + ]: 1220587 : if (type->tp_doc != NULL) {
6321 : : const char *doc_str;
6322 : 505943 : doc_str = _PyType_DocWithoutSignature(type->tp_name, type->tp_doc);
6323 : 505943 : PyObject *doc = PyUnicode_FromString(doc_str);
6324 [ - + ]: 505943 : if (doc == NULL) {
6325 : 0 : return -1;
6326 : : }
6327 : :
6328 [ - + ]: 505943 : if (PyDict_SetItem(type->tp_dict, &_Py_ID(__doc__), doc) < 0) {
6329 : 0 : Py_DECREF(doc);
6330 : 0 : return -1;
6331 : : }
6332 : 505943 : Py_DECREF(doc);
6333 : : }
6334 : : else {
6335 [ - + ]: 714644 : if (PyDict_SetItem(type->tp_dict, &_Py_ID(__doc__), Py_None) < 0) {
6336 : 0 : return -1;
6337 : : }
6338 : : }
6339 : 1220587 : return 0;
6340 : : }
6341 : :
6342 : :
6343 : : static int
6344 : 2005280 : type_ready_fill_dict(PyTypeObject *type)
6345 : : {
6346 : : /* Add type-specific descriptors to tp_dict */
6347 [ - + ]: 2005280 : if (add_operators(type) < 0) {
6348 : 0 : return -1;
6349 : : }
6350 [ - + ]: 2005280 : if (type_add_methods(type) < 0) {
6351 : 0 : return -1;
6352 : : }
6353 [ - + ]: 2005280 : if (type_add_members(type) < 0) {
6354 : 0 : return -1;
6355 : : }
6356 [ - + ]: 2005280 : if (type_add_getset(type) < 0) {
6357 : 0 : return -1;
6358 : : }
6359 [ - + ]: 2005280 : if (type_dict_set_doc(type) < 0) {
6360 : 0 : return -1;
6361 : : }
6362 : 2005280 : return 0;
6363 : : }
6364 : :
6365 : :
6366 : : static int
6367 : 2005296 : type_ready_mro(PyTypeObject *type)
6368 : : {
6369 : : /* Calculate method resolution order */
6370 [ + + ]: 2005296 : if (mro_internal(type, NULL) < 0) {
6371 : 16 : return -1;
6372 : : }
6373 : : assert(type->tp_mro != NULL);
6374 : : assert(PyTuple_Check(type->tp_mro));
6375 : :
6376 : : /* All bases of statically allocated type should be statically allocated */
6377 [ + + ]: 2005280 : if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
6378 : 672918 : PyObject *mro = type->tp_mro;
6379 : 672918 : Py_ssize_t n = PyTuple_GET_SIZE(mro);
6380 [ + + ]: 2643945 : for (Py_ssize_t i = 0; i < n; i++) {
6381 : 1971027 : PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(mro, i));
6382 [ - + ]: 1971027 : if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
6383 : 0 : PyErr_Format(PyExc_TypeError,
6384 : : "type '%.100s' is not dynamically allocated but "
6385 : : "its base type '%.100s' is dynamically allocated",
6386 : : type->tp_name, base->tp_name);
6387 : 0 : return -1;
6388 : : }
6389 : : }
6390 : : }
6391 : 2005280 : return 0;
6392 : : }
6393 : :
6394 : :
6395 : : // For static types, inherit tp_as_xxx structures from the base class
6396 : : // if it's NULL.
6397 : : //
6398 : : // For heap types, tp_as_xxx structures are not NULL: they are set to the
6399 : : // PyHeapTypeObject.as_xxx fields by type_new_alloc().
6400 : : static void
6401 : 2002316 : type_ready_inherit_as_structs(PyTypeObject *type, PyTypeObject *base)
6402 : : {
6403 [ + + ]: 2002316 : if (type->tp_as_async == NULL) {
6404 : 649797 : type->tp_as_async = base->tp_as_async;
6405 : : }
6406 [ + + ]: 2002316 : if (type->tp_as_number == NULL) {
6407 : 595885 : type->tp_as_number = base->tp_as_number;
6408 : : }
6409 [ + + ]: 2002316 : if (type->tp_as_sequence == NULL) {
6410 : 611575 : type->tp_as_sequence = base->tp_as_sequence;
6411 : : }
6412 [ + + ]: 2002316 : if (type->tp_as_mapping == NULL) {
6413 : 612591 : type->tp_as_mapping = base->tp_as_mapping;
6414 : : }
6415 [ + + ]: 2002316 : if (type->tp_as_buffer == NULL) {
6416 : 652829 : type->tp_as_buffer = base->tp_as_buffer;
6417 : : }
6418 : 2002316 : }
6419 : :
6420 : : static void
6421 : 4629456 : inherit_patma_flags(PyTypeObject *type, PyTypeObject *base) {
6422 [ + + ]: 4629456 : if ((type->tp_flags & COLLECTION_FLAGS) == 0) {
6423 : 4303925 : type->tp_flags |= base->tp_flags & COLLECTION_FLAGS;
6424 : : }
6425 : 4629456 : }
6426 : :
6427 : : static int
6428 : 2005280 : type_ready_inherit(PyTypeObject *type)
6429 : : {
6430 : : /* Inherit special flags from dominant base */
6431 : 2005280 : PyTypeObject *base = type->tp_base;
6432 [ + + ]: 2005280 : if (base != NULL) {
6433 : 2002316 : inherit_special(type, base);
6434 : : }
6435 : :
6436 : : // Inherit slots
6437 : 2005280 : PyObject *mro = type->tp_mro;
6438 : 2005280 : Py_ssize_t n = PyTuple_GET_SIZE(type->tp_mro);
6439 [ + + ]: 6634736 : for (Py_ssize_t i = 1; i < n; i++) {
6440 : 4629456 : PyObject *b = PyTuple_GET_ITEM(mro, i);
6441 [ + - ]: 4629456 : if (PyType_Check(b)) {
6442 [ - + ]: 4629456 : if (inherit_slots(type, (PyTypeObject *)b) < 0) {
6443 : 0 : return -1;
6444 : : }
6445 : 4629456 : inherit_patma_flags(type, (PyTypeObject *)b);
6446 : : }
6447 : : }
6448 : :
6449 [ + + ]: 2005280 : if (base != NULL) {
6450 : 2002316 : type_ready_inherit_as_structs(type, base);
6451 : : }
6452 : :
6453 : : /* Sanity check for tp_free. */
6454 [ + + + + ]: 2005280 : if (_PyType_IS_GC(type) && (type->tp_flags & Py_TPFLAGS_BASETYPE) &&
6455 [ + - - + ]: 1569675 : (type->tp_free == NULL || type->tp_free == PyObject_Del))
6456 : : {
6457 : : /* This base class needs to call tp_free, but doesn't have
6458 : : * one, or its tp_free is for non-gc'ed objects.
6459 : : */
6460 : 0 : PyErr_Format(PyExc_TypeError, "type '%.100s' participates in "
6461 : : "gc and is a base type but has inappropriate "
6462 : : "tp_free slot",
6463 : : type->tp_name);
6464 : 0 : return -1;
6465 : : }
6466 : :
6467 : 2005280 : return 0;
6468 : : }
6469 : :
6470 : :
6471 : : /* Hack for tp_hash and __hash__.
6472 : : If after all that, tp_hash is still NULL, and __hash__ is not in
6473 : : tp_dict, set tp_hash to PyObject_HashNotImplemented and
6474 : : tp_dict['__hash__'] equal to None.
6475 : : This signals that __hash__ is not inherited. */
6476 : : static int
6477 : 2005280 : type_ready_set_hash(PyTypeObject *type)
6478 : : {
6479 [ + + ]: 2005280 : if (type->tp_hash != NULL) {
6480 : 1902345 : return 0;
6481 : : }
6482 : :
6483 : 102935 : int r = PyDict_Contains(type->tp_dict, &_Py_ID(__hash__));
6484 [ - + ]: 102935 : if (r < 0) {
6485 : 0 : return -1;
6486 : : }
6487 [ + + ]: 102935 : if (r > 0) {
6488 : 43249 : return 0;
6489 : : }
6490 : :
6491 [ - + ]: 59686 : if (PyDict_SetItem(type->tp_dict, &_Py_ID(__hash__), Py_None) < 0) {
6492 : 0 : return -1;
6493 : : }
6494 : 59686 : type->tp_hash = PyObject_HashNotImplemented;
6495 : 59686 : return 0;
6496 : : }
6497 : :
6498 : :
6499 : : /* Link into each base class's list of subclasses */
6500 : : static int
6501 : 2005280 : type_ready_add_subclasses(PyTypeObject *type)
6502 : : {
6503 : 2005280 : PyObject *bases = type->tp_bases;
6504 : 2005280 : Py_ssize_t nbase = PyTuple_GET_SIZE(bases);
6505 [ + + ]: 4147573 : for (Py_ssize_t i = 0; i < nbase; i++) {
6506 : 2142293 : PyObject *b = PyTuple_GET_ITEM(bases, i);
6507 [ + - - + ]: 2142293 : if (PyType_Check(b) && add_subclass((PyTypeObject *)b, type) < 0) {
6508 : 0 : return -1;
6509 : : }
6510 : : }
6511 : 2005280 : return 0;
6512 : : }
6513 : :
6514 : :
6515 : : // Set tp_new and the "__new__" key in the type dictionary.
6516 : : // Use the Py_TPFLAGS_DISALLOW_INSTANTIATION flag.
6517 : : static int
6518 : 2005280 : type_ready_set_new(PyTypeObject *type)
6519 : : {
6520 : 2005280 : PyTypeObject *base = type->tp_base;
6521 : : /* The condition below could use some explanation.
6522 : :
6523 : : It appears that tp_new is not inherited for static types whose base
6524 : : class is 'object'; this seems to be a precaution so that old extension
6525 : : types don't suddenly become callable (object.__new__ wouldn't insure the
6526 : : invariants that the extension type's own factory function ensures).
6527 : :
6528 : : Heap types, of course, are under our control, so they do inherit tp_new;
6529 : : static extension types that specify some other built-in type as the
6530 : : default also inherit object.__new__. */
6531 [ + + ]: 2005280 : if (type->tp_new == NULL
6532 [ + + ]: 1556866 : && base == &PyBaseObject_Type
6533 [ + + ]: 601008 : && !(type->tp_flags & Py_TPFLAGS_HEAPTYPE))
6534 : : {
6535 : 188125 : type->tp_flags |= Py_TPFLAGS_DISALLOW_INSTANTIATION;
6536 : : }
6537 : :
6538 [ + + ]: 2005280 : if (!(type->tp_flags & Py_TPFLAGS_DISALLOW_INSTANTIATION)) {
6539 [ + + ]: 1779712 : if (type->tp_new != NULL) {
6540 : : // If "__new__" key does not exists in the type dictionary,
6541 : : // set it to tp_new_wrapper().
6542 [ - + ]: 442476 : if (add_tp_new_wrapper(type) < 0) {
6543 : 0 : return -1;
6544 : : }
6545 : : }
6546 : : else {
6547 : : // tp_new is NULL: inherit tp_new from base
6548 : 1337236 : type->tp_new = base->tp_new;
6549 : : }
6550 : : }
6551 : : else {
6552 : : // Py_TPFLAGS_DISALLOW_INSTANTIATION sets tp_new to NULL
6553 : 225568 : type->tp_new = NULL;
6554 : : }
6555 : 2005280 : return 0;
6556 : : }
6557 : :
6558 : :
6559 : : static int
6560 : 2005280 : type_ready_post_checks(PyTypeObject *type)
6561 : : {
6562 : : // bpo-44263: tp_traverse is required if Py_TPFLAGS_HAVE_GC is set.
6563 : : // Note: tp_clear is optional.
6564 [ + + ]: 2005280 : if (type->tp_flags & Py_TPFLAGS_HAVE_GC
6565 [ - + ]: 1865195 : && type->tp_traverse == NULL)
6566 : : {
6567 : 0 : PyErr_Format(PyExc_SystemError,
6568 : : "type %s has the Py_TPFLAGS_HAVE_GC flag "
6569 : : "but has no traverse function",
6570 : : type->tp_name);
6571 : 0 : return -1;
6572 : : }
6573 : 2005280 : return 0;
6574 : : }
6575 : :
6576 : :
6577 : : static int
6578 : 2005296 : type_ready(PyTypeObject *type)
6579 : : {
6580 [ - + ]: 2005296 : if (type_ready_pre_checks(type) < 0) {
6581 : 0 : return -1;
6582 : : }
6583 : :
6584 : : #ifdef Py_TRACE_REFS
6585 : : /* PyType_Ready is the closest thing we have to a choke point
6586 : : * for type objects, so is the best place I can think of to try
6587 : : * to get type objects into the doubly-linked list of all objects.
6588 : : * Still, not all type objects go through PyType_Ready.
6589 : : */
6590 : : _Py_AddToAllObjects((PyObject *)type, 0);
6591 : : #endif
6592 : :
6593 : : /* Initialize tp_dict: _PyType_IsReady() tests if tp_dict != NULL */
6594 [ - + ]: 2005296 : if (type_ready_set_dict(type) < 0) {
6595 : 0 : return -1;
6596 : : }
6597 [ - + ]: 2005296 : if (type_ready_set_bases(type) < 0) {
6598 : 0 : return -1;
6599 : : }
6600 [ + + ]: 2005296 : if (type_ready_mro(type) < 0) {
6601 : 16 : return -1;
6602 : : }
6603 [ - + ]: 2005280 : if (type_ready_set_new(type) < 0) {
6604 : 0 : return -1;
6605 : : }
6606 [ - + ]: 2005280 : if (type_ready_fill_dict(type) < 0) {
6607 : 0 : return -1;
6608 : : }
6609 [ - + ]: 2005280 : if (type_ready_inherit(type) < 0) {
6610 : 0 : return -1;
6611 : : }
6612 [ - + ]: 2005280 : if (type_ready_set_hash(type) < 0) {
6613 : 0 : return -1;
6614 : : }
6615 [ - + ]: 2005280 : if (type_ready_add_subclasses(type) < 0) {
6616 : 0 : return -1;
6617 : : }
6618 [ - + ]: 2005280 : if (type_ready_post_checks(type) < 0) {
6619 : 0 : return -1;
6620 : : }
6621 : 2005280 : return 0;
6622 : : }
6623 : :
6624 : :
6625 : : int
6626 : 2081225 : PyType_Ready(PyTypeObject *type)
6627 : : {
6628 [ + + ]: 2081225 : if (type->tp_flags & Py_TPFLAGS_READY) {
6629 : : assert(_PyType_CheckConsistency(type));
6630 : 75929 : return 0;
6631 : : }
6632 : : _PyObject_ASSERT((PyObject *)type,
6633 : : (type->tp_flags & Py_TPFLAGS_READYING) == 0);
6634 : :
6635 : 2005296 : type->tp_flags |= Py_TPFLAGS_READYING;
6636 : :
6637 : : /* Historically, all static types were immutable. See bpo-43908 */
6638 [ + + ]: 2005296 : if (!(type->tp_flags & Py_TPFLAGS_HEAPTYPE)) {
6639 : 672918 : type->tp_flags |= Py_TPFLAGS_IMMUTABLETYPE;
6640 : : }
6641 : :
6642 [ + + ]: 2005296 : if (type_ready(type) < 0) {
6643 : 16 : type->tp_flags &= ~Py_TPFLAGS_READYING;
6644 : 16 : return -1;
6645 : : }
6646 : :
6647 : : /* All done -- set the ready flag */
6648 : 2005280 : type->tp_flags = (type->tp_flags & ~Py_TPFLAGS_READYING) | Py_TPFLAGS_READY;
6649 : : assert(_PyType_CheckConsistency(type));
6650 : 2005280 : return 0;
6651 : : }
6652 : :
6653 : :
6654 : : static int
6655 : 2142974 : add_subclass(PyTypeObject *base, PyTypeObject *type)
6656 : : {
6657 : 2142974 : PyObject *key = PyLong_FromVoidPtr((void *) type);
6658 [ - + ]: 2142974 : if (key == NULL)
6659 : 0 : return -1;
6660 : :
6661 : 2142974 : PyObject *ref = PyWeakref_NewRef((PyObject *)type, NULL);
6662 [ - + ]: 2142974 : if (ref == NULL) {
6663 : 0 : Py_DECREF(key);
6664 : 0 : return -1;
6665 : : }
6666 : :
6667 : : // Only get tp_subclasses after creating the key and value.
6668 : : // PyWeakref_NewRef() can trigger a garbage collection which can execute
6669 : : // arbitrary Python code and so modify base->tp_subclasses.
6670 : 2142974 : PyObject *subclasses = base->tp_subclasses;
6671 [ + + ]: 2142974 : if (subclasses == NULL) {
6672 : 385216 : base->tp_subclasses = subclasses = PyDict_New();
6673 [ - + ]: 385216 : if (subclasses == NULL) {
6674 : 0 : Py_DECREF(key);
6675 : 0 : Py_DECREF(ref);
6676 : 0 : return -1;
6677 : : }
6678 : : }
6679 : : assert(PyDict_CheckExact(subclasses));
6680 : :
6681 : 2142974 : int result = PyDict_SetItem(subclasses, key, ref);
6682 : 2142974 : Py_DECREF(ref);
6683 : 2142974 : Py_DECREF(key);
6684 : 2142974 : return result;
6685 : : }
6686 : :
6687 : : static int
6688 : 675 : add_all_subclasses(PyTypeObject *type, PyObject *bases)
6689 : : {
6690 : 675 : Py_ssize_t n = PyTuple_GET_SIZE(bases);
6691 : 675 : int res = 0;
6692 [ + + ]: 1356 : for (Py_ssize_t i = 0; i < n; i++) {
6693 : 681 : PyObject *obj = PyTuple_GET_ITEM(bases, i);
6694 : : // bases tuple must only contain types
6695 : 681 : PyTypeObject *base = _PyType_CAST(obj);
6696 [ - + ]: 681 : if (add_subclass(base, type) < 0) {
6697 : 0 : res = -1;
6698 : : }
6699 : : }
6700 : 675 : return res;
6701 : : }
6702 : :
6703 : : static void
6704 : 2019341 : remove_subclass(PyTypeObject *base, PyTypeObject *type)
6705 : : {
6706 : 2019341 : PyObject *subclasses = base->tp_subclasses; // borrowed ref
6707 [ + + ]: 2019341 : if (subclasses == NULL) {
6708 : 12 : return;
6709 : : }
6710 : : assert(PyDict_CheckExact(subclasses));
6711 : :
6712 : 2019329 : PyObject *key = PyLong_FromVoidPtr((void *) type);
6713 [ + + + + ]: 2019329 : if (key == NULL || PyDict_DelItem(subclasses, key)) {
6714 : : /* This can happen if the type initialization errored out before
6715 : : the base subclasses were updated (e.g. a non-str __qualname__
6716 : : was passed in the type dict). */
6717 : 859 : PyErr_Clear();
6718 : : }
6719 : 2019329 : Py_XDECREF(key);
6720 : :
6721 [ + + ]: 2019329 : if (PyDict_Size(subclasses) == 0) {
6722 : : // Delete the dictionary to save memory. _PyStaticType_Dealloc()
6723 : : // callers also test if tp_subclasses is NULL to check if a static type
6724 : : // has no subclass.
6725 [ + - ]: 366534 : Py_CLEAR(base->tp_subclasses);
6726 : : }
6727 : : }
6728 : :
6729 : : static void
6730 : 1882266 : remove_all_subclasses(PyTypeObject *type, PyObject *bases)
6731 : : {
6732 : : assert(bases != NULL);
6733 : : // remove_subclass() can clear the current exception
6734 : : assert(!PyErr_Occurred());
6735 : :
6736 [ + + ]: 3901607 : for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(bases); i++) {
6737 : 2019341 : PyObject *base = PyTuple_GET_ITEM(bases, i);
6738 [ + - ]: 2019341 : if (PyType_Check(base)) {
6739 : 2019341 : remove_subclass((PyTypeObject*) base, type);
6740 : : }
6741 : : }
6742 : : assert(!PyErr_Occurred());
6743 : 1882266 : }
6744 : :
6745 : : static int
6746 : 7705064 : check_num_args(PyObject *ob, int n)
6747 : : {
6748 [ - + ]: 7705064 : if (!PyTuple_CheckExact(ob)) {
6749 : 0 : PyErr_SetString(PyExc_SystemError,
6750 : : "PyArg_UnpackTuple() argument list is not a tuple");
6751 : 0 : return 0;
6752 : : }
6753 [ + + ]: 7705064 : if (n == PyTuple_GET_SIZE(ob))
6754 : 7705029 : return 1;
6755 [ + + ]: 35 : PyErr_Format(
6756 : : PyExc_TypeError,
6757 : : "expected %d argument%s, got %zd", n, n == 1 ? "" : "s", PyTuple_GET_SIZE(ob));
6758 : 35 : return 0;
6759 : : }
6760 : :
6761 : : /* Generic wrappers for overloadable 'operators' such as __getitem__ */
6762 : :
6763 : : /* There's a wrapper *function* for each distinct function typedef used
6764 : : for type object slots (e.g. binaryfunc, ternaryfunc, etc.). There's a
6765 : : wrapper *table* for each distinct operation (e.g. __len__, __add__).
6766 : : Most tables have only one entry; the tables for binary operators have two
6767 : : entries, one regular and one with reversed arguments. */
6768 : :
6769 : : static PyObject *
6770 : 4689 : wrap_lenfunc(PyObject *self, PyObject *args, void *wrapped)
6771 : : {
6772 : 4689 : lenfunc func = (lenfunc)wrapped;
6773 : : Py_ssize_t res;
6774 : :
6775 [ - + ]: 4689 : if (!check_num_args(args, 0))
6776 : 0 : return NULL;
6777 : 4689 : res = (*func)(self);
6778 [ - + - - ]: 4689 : if (res == -1 && PyErr_Occurred())
6779 : 0 : return NULL;
6780 : 4689 : return PyLong_FromSsize_t(res);
6781 : : }
6782 : :
6783 : : static PyObject *
6784 : 2 : wrap_inquirypred(PyObject *self, PyObject *args, void *wrapped)
6785 : : {
6786 : 2 : inquiry func = (inquiry)wrapped;
6787 : : int res;
6788 : :
6789 [ - + ]: 2 : if (!check_num_args(args, 0))
6790 : 0 : return NULL;
6791 : 2 : res = (*func)(self);
6792 [ - + - - ]: 2 : if (res == -1 && PyErr_Occurred())
6793 : 0 : return NULL;
6794 : 2 : return PyBool_FromLong((long)res);
6795 : : }
6796 : :
6797 : : static PyObject *
6798 : 4608425 : wrap_binaryfunc(PyObject *self, PyObject *args, void *wrapped)
6799 : : {
6800 : 4608425 : binaryfunc func = (binaryfunc)wrapped;
6801 : : PyObject *other;
6802 : :
6803 [ + + ]: 4608425 : if (!check_num_args(args, 1))
6804 : 14 : return NULL;
6805 : 4608411 : other = PyTuple_GET_ITEM(args, 0);
6806 : 4608411 : return (*func)(self, other);
6807 : : }
6808 : :
6809 : : static PyObject *
6810 : 45707 : wrap_binaryfunc_l(PyObject *self, PyObject *args, void *wrapped)
6811 : : {
6812 : 45707 : binaryfunc func = (binaryfunc)wrapped;
6813 : : PyObject *other;
6814 : :
6815 [ + + ]: 45707 : if (!check_num_args(args, 1))
6816 : 1 : return NULL;
6817 : 45706 : other = PyTuple_GET_ITEM(args, 0);
6818 : 45706 : return (*func)(self, other);
6819 : : }
6820 : :
6821 : : static PyObject *
6822 : 30 : wrap_binaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
6823 : : {
6824 : 30 : binaryfunc func = (binaryfunc)wrapped;
6825 : : PyObject *other;
6826 : :
6827 [ - + ]: 30 : if (!check_num_args(args, 1))
6828 : 0 : return NULL;
6829 : 30 : other = PyTuple_GET_ITEM(args, 0);
6830 : 30 : return (*func)(other, self);
6831 : : }
6832 : :
6833 : : static PyObject *
6834 : 8 : wrap_ternaryfunc(PyObject *self, PyObject *args, void *wrapped)
6835 : : {
6836 : 8 : ternaryfunc func = (ternaryfunc)wrapped;
6837 : : PyObject *other;
6838 : 8 : PyObject *third = Py_None;
6839 : :
6840 : : /* Note: This wrapper only works for __pow__() */
6841 : :
6842 [ - + ]: 8 : if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
6843 : 0 : return NULL;
6844 : 8 : return (*func)(self, other, third);
6845 : : }
6846 : :
6847 : : static PyObject *
6848 : 1 : wrap_ternaryfunc_r(PyObject *self, PyObject *args, void *wrapped)
6849 : : {
6850 : 1 : ternaryfunc func = (ternaryfunc)wrapped;
6851 : : PyObject *other;
6852 : 1 : PyObject *third = Py_None;
6853 : :
6854 : : /* Note: This wrapper only works for __pow__() */
6855 : :
6856 [ - + ]: 1 : if (!PyArg_UnpackTuple(args, "", 1, 2, &other, &third))
6857 : 0 : return NULL;
6858 : 1 : return (*func)(other, self, third);
6859 : : }
6860 : :
6861 : : static PyObject *
6862 : 49810 : wrap_unaryfunc(PyObject *self, PyObject *args, void *wrapped)
6863 : : {
6864 : 49810 : unaryfunc func = (unaryfunc)wrapped;
6865 : :
6866 [ + + ]: 49810 : if (!check_num_args(args, 0))
6867 : 1 : return NULL;
6868 : 49809 : return (*func)(self);
6869 : : }
6870 : :
6871 : : static PyObject *
6872 : 67 : wrap_indexargfunc(PyObject *self, PyObject *args, void *wrapped)
6873 : : {
6874 : 67 : ssizeargfunc func = (ssizeargfunc)wrapped;
6875 : : PyObject* o;
6876 : : Py_ssize_t i;
6877 : :
6878 [ + + ]: 67 : if (!PyArg_UnpackTuple(args, "", 1, 1, &o))
6879 : 1 : return NULL;
6880 : 66 : i = PyNumber_AsSsize_t(o, PyExc_OverflowError);
6881 [ + + + + ]: 66 : if (i == -1 && PyErr_Occurred())
6882 : 27 : return NULL;
6883 : 39 : return (*func)(self, i);
6884 : : }
6885 : :
6886 : : static Py_ssize_t
6887 : 4 : getindex(PyObject *self, PyObject *arg)
6888 : : {
6889 : : Py_ssize_t i;
6890 : :
6891 : 4 : i = PyNumber_AsSsize_t(arg, PyExc_OverflowError);
6892 [ + + - + ]: 4 : if (i == -1 && PyErr_Occurred())
6893 : 0 : return -1;
6894 [ + + ]: 4 : if (i < 0) {
6895 : 2 : PySequenceMethods *sq = Py_TYPE(self)->tp_as_sequence;
6896 [ + - + - ]: 2 : if (sq && sq->sq_length) {
6897 : 2 : Py_ssize_t n = (*sq->sq_length)(self);
6898 [ - + ]: 2 : if (n < 0) {
6899 : : assert(PyErr_Occurred());
6900 : 0 : return -1;
6901 : : }
6902 : 2 : i += n;
6903 : : }
6904 : : }
6905 : 4 : return i;
6906 : : }
6907 : :
6908 : : static PyObject *
6909 : 2 : wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
6910 : : {
6911 : 2 : ssizeargfunc func = (ssizeargfunc)wrapped;
6912 : : PyObject *arg;
6913 : : Py_ssize_t i;
6914 : :
6915 [ + - ]: 2 : if (PyTuple_GET_SIZE(args) == 1) {
6916 : 2 : arg = PyTuple_GET_ITEM(args, 0);
6917 : 2 : i = getindex(self, arg);
6918 [ + + - + ]: 2 : if (i == -1 && PyErr_Occurred())
6919 : 0 : return NULL;
6920 : 2 : return (*func)(self, i);
6921 : : }
6922 : 0 : check_num_args(args, 1);
6923 : : assert(PyErr_Occurred());
6924 : 0 : return NULL;
6925 : : }
6926 : :
6927 : : static PyObject *
6928 : 0 : wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
6929 : : {
6930 : 0 : ssizeobjargproc func = (ssizeobjargproc)wrapped;
6931 : : Py_ssize_t i;
6932 : : int res;
6933 : : PyObject *arg, *value;
6934 : :
6935 [ # # ]: 0 : if (!PyArg_UnpackTuple(args, "", 2, 2, &arg, &value))
6936 : 0 : return NULL;
6937 : 0 : i = getindex(self, arg);
6938 [ # # # # ]: 0 : if (i == -1 && PyErr_Occurred())
6939 : 0 : return NULL;
6940 : 0 : res = (*func)(self, i, value);
6941 [ # # # # ]: 0 : if (res == -1 && PyErr_Occurred())
6942 : 0 : return NULL;
6943 : 0 : Py_RETURN_NONE;
6944 : : }
6945 : :
6946 : : static PyObject *
6947 : 2 : wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
6948 : : {
6949 : 2 : ssizeobjargproc func = (ssizeobjargproc)wrapped;
6950 : : Py_ssize_t i;
6951 : : int res;
6952 : : PyObject *arg;
6953 : :
6954 [ - + ]: 2 : if (!check_num_args(args, 1))
6955 : 0 : return NULL;
6956 : 2 : arg = PyTuple_GET_ITEM(args, 0);
6957 : 2 : i = getindex(self, arg);
6958 [ + + - + ]: 2 : if (i == -1 && PyErr_Occurred())
6959 : 0 : return NULL;
6960 : 2 : res = (*func)(self, i, NULL);
6961 [ + - + - ]: 2 : if (res == -1 && PyErr_Occurred())
6962 : 2 : return NULL;
6963 : 0 : Py_RETURN_NONE;
6964 : : }
6965 : :
6966 : : /* XXX objobjproc is a misnomer; should be objargpred */
6967 : : static PyObject *
6968 : 68 : wrap_objobjproc(PyObject *self, PyObject *args, void *wrapped)
6969 : : {
6970 : 68 : objobjproc func = (objobjproc)wrapped;
6971 : : int res;
6972 : : PyObject *value;
6973 : :
6974 [ + + ]: 68 : if (!check_num_args(args, 1))
6975 : 4 : return NULL;
6976 : 64 : value = PyTuple_GET_ITEM(args, 0);
6977 : 64 : res = (*func)(self, value);
6978 [ + + + - ]: 64 : if (res == -1 && PyErr_Occurred())
6979 : 6 : return NULL;
6980 : : else
6981 : 58 : return PyBool_FromLong(res);
6982 : : }
6983 : :
6984 : : static PyObject *
6985 : 273611 : wrap_objobjargproc(PyObject *self, PyObject *args, void *wrapped)
6986 : : {
6987 : 273611 : objobjargproc func = (objobjargproc)wrapped;
6988 : : int res;
6989 : : PyObject *key, *value;
6990 : :
6991 [ + + ]: 273611 : if (!PyArg_UnpackTuple(args, "", 2, 2, &key, &value))
6992 : 29 : return NULL;
6993 : 273582 : res = (*func)(self, key, value);
6994 [ + + + - ]: 273582 : if (res == -1 && PyErr_Occurred())
6995 : 452 : return NULL;
6996 : 273130 : Py_RETURN_NONE;
6997 : : }
6998 : :
6999 : : static PyObject *
7000 : 21757 : wrap_delitem(PyObject *self, PyObject *args, void *wrapped)
7001 : : {
7002 : 21757 : objobjargproc func = (objobjargproc)wrapped;
7003 : : int res;
7004 : : PyObject *key;
7005 : :
7006 [ + + ]: 21757 : if (!check_num_args(args, 1))
7007 : 14 : return NULL;
7008 : 21743 : key = PyTuple_GET_ITEM(args, 0);
7009 : 21743 : res = (*func)(self, key, NULL);
7010 [ + + + - ]: 21743 : if (res == -1 && PyErr_Occurred())
7011 : 50 : return NULL;
7012 : 21693 : Py_RETURN_NONE;
7013 : : }
7014 : :
7015 : : /* Helper to check for object.__setattr__ or __delattr__ applied to a type.
7016 : : This is called the Carlo Verre hack after its discoverer. See
7017 : : https://mail.python.org/pipermail/python-dev/2003-April/034535.html
7018 : : */
7019 : : static int
7020 : 1151010 : hackcheck(PyObject *self, setattrofunc func, const char *what)
7021 : : {
7022 : 1151010 : PyTypeObject *type = Py_TYPE(self);
7023 : 1151010 : PyObject *mro = type->tp_mro;
7024 [ - + ]: 1151010 : if (!mro) {
7025 : : /* Probably ok not to check the call in this case. */
7026 : 0 : return 1;
7027 : : }
7028 : : assert(PyTuple_Check(mro));
7029 : :
7030 : : /* Find the (base) type that defined the type's slot function. */
7031 : 1151010 : PyTypeObject *defining_type = type;
7032 : : Py_ssize_t i;
7033 [ + + ]: 5371919 : for (i = PyTuple_GET_SIZE(mro) - 1; i >= 0; i--) {
7034 : 4220932 : PyTypeObject *base = _PyType_CAST(PyTuple_GET_ITEM(mro, i));
7035 [ + + ]: 4220932 : if (base->tp_setattro == slot_tp_setattro) {
7036 : : /* Ignore Python classes:
7037 : : they never define their own C-level setattro. */
7038 : : }
7039 [ + + ]: 2453987 : else if (base->tp_setattro == type->tp_setattro) {
7040 : 23 : defining_type = base;
7041 : 23 : break;
7042 : : }
7043 : : }
7044 : :
7045 : : /* Reject calls that jump over intermediate C-level overrides. */
7046 [ + - ]: 2463672 : for (PyTypeObject *base = defining_type; base; base = base->tp_base) {
7047 [ + + ]: 2463672 : if (base->tp_setattro == func) {
7048 : : /* 'func' is the right slot function to call. */
7049 : 1151007 : break;
7050 : : }
7051 [ + + ]: 1312665 : else if (base->tp_setattro != slot_tp_setattro) {
7052 : : /* 'base' is not a Python class and overrides 'func'.
7053 : : Its tp_setattro should be called instead. */
7054 : 3 : PyErr_Format(PyExc_TypeError,
7055 : : "can't apply this %s to %s object",
7056 : : what,
7057 : : type->tp_name);
7058 : 3 : return 0;
7059 : : }
7060 : : }
7061 : 1151007 : return 1;
7062 : : }
7063 : :
7064 : : static PyObject *
7065 : 1051230 : wrap_setattr(PyObject *self, PyObject *args, void *wrapped)
7066 : : {
7067 : 1051230 : setattrofunc func = (setattrofunc)wrapped;
7068 : : int res;
7069 : : PyObject *name, *value;
7070 : :
7071 [ - + ]: 1051230 : if (!PyArg_UnpackTuple(args, "", 2, 2, &name, &value))
7072 : 0 : return NULL;
7073 [ + + ]: 1051230 : if (!hackcheck(self, func, "__setattr__"))
7074 : 2 : return NULL;
7075 : 1051228 : res = (*func)(self, name, value);
7076 [ + + ]: 1051228 : if (res < 0)
7077 : 3 : return NULL;
7078 : 1051225 : Py_RETURN_NONE;
7079 : : }
7080 : :
7081 : : static PyObject *
7082 : 99781 : wrap_delattr(PyObject *self, PyObject *args, void *wrapped)
7083 : : {
7084 : 99781 : setattrofunc func = (setattrofunc)wrapped;
7085 : : int res;
7086 : : PyObject *name;
7087 : :
7088 [ + + ]: 99781 : if (!check_num_args(args, 1))
7089 : 1 : return NULL;
7090 : 99780 : name = PyTuple_GET_ITEM(args, 0);
7091 [ + + ]: 99780 : if (!hackcheck(self, func, "__delattr__"))
7092 : 1 : return NULL;
7093 : 99779 : res = (*func)(self, name, NULL);
7094 [ + + ]: 99779 : if (res < 0)
7095 : 20 : return NULL;
7096 : 99759 : Py_RETURN_NONE;
7097 : : }
7098 : :
7099 : : static PyObject *
7100 : 606648 : wrap_hashfunc(PyObject *self, PyObject *args, void *wrapped)
7101 : : {
7102 : 606648 : hashfunc func = (hashfunc)wrapped;
7103 : : Py_hash_t res;
7104 : :
7105 [ - + ]: 606648 : if (!check_num_args(args, 0))
7106 : 0 : return NULL;
7107 : 606648 : res = (*func)(self);
7108 [ + + + - ]: 606648 : if (res == -1 && PyErr_Occurred())
7109 : 4 : return NULL;
7110 : 606644 : return PyLong_FromSsize_t(res);
7111 : : }
7112 : :
7113 : : static PyObject *
7114 : 24 : wrap_call(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
7115 : : {
7116 : 24 : ternaryfunc func = (ternaryfunc)wrapped;
7117 : :
7118 : 24 : return (*func)(self, args, kwds);
7119 : : }
7120 : :
7121 : : static PyObject *
7122 : 9 : wrap_del(PyObject *self, PyObject *args, void *wrapped)
7123 : : {
7124 : 9 : destructor func = (destructor)wrapped;
7125 : :
7126 [ - + ]: 9 : if (!check_num_args(args, 0))
7127 : 0 : return NULL;
7128 : :
7129 : 9 : (*func)(self);
7130 : 9 : Py_RETURN_NONE;
7131 : : }
7132 : :
7133 : : static PyObject *
7134 : 126623 : wrap_richcmpfunc(PyObject *self, PyObject *args, void *wrapped, int op)
7135 : : {
7136 : 126623 : richcmpfunc func = (richcmpfunc)wrapped;
7137 : : PyObject *other;
7138 : :
7139 [ - + ]: 126623 : if (!check_num_args(args, 1))
7140 : 0 : return NULL;
7141 : 126623 : other = PyTuple_GET_ITEM(args, 0);
7142 : 126623 : return (*func)(self, other, op);
7143 : : }
7144 : :
7145 : : #undef RICHCMP_WRAPPER
7146 : : #define RICHCMP_WRAPPER(NAME, OP) \
7147 : : static PyObject * \
7148 : : richcmp_##NAME(PyObject *self, PyObject *args, void *wrapped) \
7149 : : { \
7150 : : return wrap_richcmpfunc(self, args, wrapped, OP); \
7151 : : }
7152 : :
7153 : 54 : RICHCMP_WRAPPER(lt, Py_LT)
7154 : 29 : RICHCMP_WRAPPER(le, Py_LE)
7155 : 117546 : RICHCMP_WRAPPER(eq, Py_EQ)
7156 : 8930 : RICHCMP_WRAPPER(ne, Py_NE)
7157 : 37 : RICHCMP_WRAPPER(gt, Py_GT)
7158 : 27 : RICHCMP_WRAPPER(ge, Py_GE)
7159 : :
7160 : : static PyObject *
7161 : 2141510 : wrap_next(PyObject *self, PyObject *args, void *wrapped)
7162 : : {
7163 : 2141510 : unaryfunc func = (unaryfunc)wrapped;
7164 : : PyObject *res;
7165 : :
7166 [ - + ]: 2141510 : if (!check_num_args(args, 0))
7167 : 0 : return NULL;
7168 : 2141510 : res = (*func)(self);
7169 [ + + + + ]: 2141510 : if (res == NULL && !PyErr_Occurred())
7170 : 7165 : PyErr_SetNone(PyExc_StopIteration);
7171 : 2141510 : return res;
7172 : : }
7173 : :
7174 : : static PyObject *
7175 : 1172 : wrap_descr_get(PyObject *self, PyObject *args, void *wrapped)
7176 : : {
7177 : 1172 : descrgetfunc func = (descrgetfunc)wrapped;
7178 : : PyObject *obj;
7179 : 1172 : PyObject *type = NULL;
7180 : :
7181 [ - + ]: 1172 : if (!PyArg_UnpackTuple(args, "", 1, 2, &obj, &type))
7182 : 0 : return NULL;
7183 [ + + ]: 1172 : if (obj == Py_None)
7184 : 68 : obj = NULL;
7185 [ + + ]: 1172 : if (type == Py_None)
7186 : 1 : type = NULL;
7187 [ + + + + ]: 1172 : if (type == NULL && obj == NULL) {
7188 : 1 : PyErr_SetString(PyExc_TypeError,
7189 : : "__get__(None, None) is invalid");
7190 : 1 : return NULL;
7191 : : }
7192 : 1171 : return (*func)(self, obj, type);
7193 : : }
7194 : :
7195 : : static PyObject *
7196 : 634 : wrap_descr_set(PyObject *self, PyObject *args, void *wrapped)
7197 : : {
7198 : 634 : descrsetfunc func = (descrsetfunc)wrapped;
7199 : : PyObject *obj, *value;
7200 : : int ret;
7201 : :
7202 [ - + ]: 634 : if (!PyArg_UnpackTuple(args, "", 2, 2, &obj, &value))
7203 : 0 : return NULL;
7204 : 634 : ret = (*func)(self, obj, value);
7205 [ + + ]: 634 : if (ret < 0)
7206 : 16 : return NULL;
7207 : 618 : Py_RETURN_NONE;
7208 : : }
7209 : :
7210 : : static PyObject *
7211 : 3 : wrap_descr_delete(PyObject *self, PyObject *args, void *wrapped)
7212 : : {
7213 : 3 : descrsetfunc func = (descrsetfunc)wrapped;
7214 : : PyObject *obj;
7215 : : int ret;
7216 : :
7217 [ - + ]: 3 : if (!check_num_args(args, 1))
7218 : 0 : return NULL;
7219 : 3 : obj = PyTuple_GET_ITEM(args, 0);
7220 : 3 : ret = (*func)(self, obj, NULL);
7221 [ + + ]: 3 : if (ret < 0)
7222 : 2 : return NULL;
7223 : 1 : Py_RETURN_NONE;
7224 : : }
7225 : :
7226 : : static PyObject *
7227 : 5030238 : wrap_init(PyObject *self, PyObject *args, void *wrapped, PyObject *kwds)
7228 : : {
7229 : 5030238 : initproc func = (initproc)wrapped;
7230 : :
7231 [ + + ]: 5030238 : if (func(self, args, kwds) < 0)
7232 : 63 : return NULL;
7233 : 5030175 : Py_RETURN_NONE;
7234 : : }
7235 : :
7236 : : static PyObject *
7237 : 10995367 : tp_new_wrapper(PyObject *self, PyObject *args, PyObject *kwds)
7238 : : {
7239 : : PyTypeObject *staticbase;
7240 : : PyObject *arg0, *res;
7241 : :
7242 [ + - - + ]: 10995367 : if (self == NULL || !PyType_Check(self)) {
7243 : 0 : PyErr_Format(PyExc_SystemError,
7244 : : "__new__() called with non-type 'self'");
7245 : 0 : return NULL;
7246 : : }
7247 : 10995367 : PyTypeObject *type = (PyTypeObject *)self;
7248 : :
7249 [ + - + + ]: 10995367 : if (!PyTuple_Check(args) || PyTuple_GET_SIZE(args) < 1) {
7250 : 3 : PyErr_Format(PyExc_TypeError,
7251 : : "%s.__new__(): not enough arguments",
7252 : : type->tp_name);
7253 : 3 : return NULL;
7254 : : }
7255 : 10995364 : arg0 = PyTuple_GET_ITEM(args, 0);
7256 [ + + ]: 10995364 : if (!PyType_Check(arg0)) {
7257 : 5 : PyErr_Format(PyExc_TypeError,
7258 : : "%s.__new__(X): X is not a type object (%s)",
7259 : : type->tp_name,
7260 : 5 : Py_TYPE(arg0)->tp_name);
7261 : 5 : return NULL;
7262 : : }
7263 : 10995359 : PyTypeObject *subtype = (PyTypeObject *)arg0;
7264 : :
7265 [ + + ]: 10995359 : if (!PyType_IsSubtype(subtype, type)) {
7266 : 1 : PyErr_Format(PyExc_TypeError,
7267 : : "%s.__new__(%s): %s is not a subtype of %s",
7268 : : type->tp_name,
7269 : : subtype->tp_name,
7270 : : subtype->tp_name,
7271 : : type->tp_name);
7272 : 1 : return NULL;
7273 : : }
7274 : :
7275 : : /* Check that the use doesn't do something silly and unsafe like
7276 : : object.__new__(dict). To do this, we check that the
7277 : : most derived base that's not a heap type is this type. */
7278 : 10995358 : staticbase = subtype;
7279 [ + - + + ]: 30604879 : while (staticbase && (staticbase->tp_new == slot_tp_new))
7280 : 19609521 : staticbase = staticbase->tp_base;
7281 : : /* If staticbase is NULL now, it is a really weird type.
7282 : : In the spirit of backwards compatibility (?), just shut up. */
7283 [ + - + + ]: 10995358 : if (staticbase && staticbase->tp_new != type->tp_new) {
7284 : 4 : PyErr_Format(PyExc_TypeError,
7285 : : "%s.__new__(%s) is not safe, use %s.__new__()",
7286 : : type->tp_name,
7287 : : subtype->tp_name,
7288 : : staticbase->tp_name);
7289 : 4 : return NULL;
7290 : : }
7291 : :
7292 : 10995354 : args = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));
7293 [ - + ]: 10995354 : if (args == NULL)
7294 : 0 : return NULL;
7295 : 10995354 : res = type->tp_new(subtype, args, kwds);
7296 : 10995354 : Py_DECREF(args);
7297 : 10995354 : return res;
7298 : : }
7299 : :
7300 : : static struct PyMethodDef tp_new_methoddef[] = {
7301 : : {"__new__", _PyCFunction_CAST(tp_new_wrapper), METH_VARARGS|METH_KEYWORDS,
7302 : : PyDoc_STR("__new__($type, *args, **kwargs)\n--\n\n"
7303 : : "Create and return a new object. "
7304 : : "See help(type) for accurate signature.")},
7305 : : {0}
7306 : : };
7307 : :
7308 : : static int
7309 : 442476 : add_tp_new_wrapper(PyTypeObject *type)
7310 : : {
7311 : 442476 : int r = PyDict_Contains(type->tp_dict, &_Py_ID(__new__));
7312 [ - + ]: 442476 : if (r > 0) {
7313 : 0 : return 0;
7314 : : }
7315 [ - + ]: 442476 : if (r < 0) {
7316 : 0 : return -1;
7317 : : }
7318 : :
7319 : 442476 : PyObject *func = PyCFunction_NewEx(tp_new_methoddef, (PyObject *)type, NULL);
7320 [ - + ]: 442476 : if (func == NULL) {
7321 : 0 : return -1;
7322 : : }
7323 : 442476 : r = PyDict_SetItem(type->tp_dict, &_Py_ID(__new__), func);
7324 : 442476 : Py_DECREF(func);
7325 : 442476 : return r;
7326 : : }
7327 : :
7328 : : /* Slot wrappers that call the corresponding __foo__ slot. See comments
7329 : : below at override_slots() for more explanation. */
7330 : :
7331 : : #define SLOT0(FUNCNAME, DUNDER) \
7332 : : static PyObject * \
7333 : : FUNCNAME(PyObject *self) \
7334 : : { \
7335 : : PyObject* stack[1] = {self}; \
7336 : : return vectorcall_method(&_Py_ID(DUNDER), stack, 1); \
7337 : : }
7338 : :
7339 : : #define SLOT1(FUNCNAME, DUNDER, ARG1TYPE) \
7340 : : static PyObject * \
7341 : : FUNCNAME(PyObject *self, ARG1TYPE arg1) \
7342 : : { \
7343 : : PyObject* stack[2] = {self, arg1}; \
7344 : : return vectorcall_method(&_Py_ID(DUNDER), stack, 2); \
7345 : : }
7346 : :
7347 : : /* Boolean helper for SLOT1BINFULL().
7348 : : right.__class__ is a nontrivial subclass of left.__class__. */
7349 : : static int
7350 : 10 : method_is_overloaded(PyObject *left, PyObject *right, PyObject *name)
7351 : : {
7352 : : PyObject *a, *b;
7353 : : int ok;
7354 : :
7355 [ - + ]: 10 : if (_PyObject_LookupAttr((PyObject *)(Py_TYPE(right)), name, &b) < 0) {
7356 : 0 : return -1;
7357 : : }
7358 [ - + ]: 10 : if (b == NULL) {
7359 : : /* If right doesn't have it, it's not overloaded */
7360 : 0 : return 0;
7361 : : }
7362 : :
7363 [ - + ]: 10 : if (_PyObject_LookupAttr((PyObject *)(Py_TYPE(left)), name, &a) < 0) {
7364 : 0 : Py_DECREF(b);
7365 : 0 : return -1;
7366 : : }
7367 [ - + ]: 10 : if (a == NULL) {
7368 : 0 : Py_DECREF(b);
7369 : : /* If right has it but left doesn't, it's overloaded */
7370 : 0 : return 1;
7371 : : }
7372 : :
7373 : 10 : ok = PyObject_RichCompareBool(a, b, Py_NE);
7374 : 10 : Py_DECREF(a);
7375 : 10 : Py_DECREF(b);
7376 : 10 : return ok;
7377 : : }
7378 : :
7379 : :
7380 : : #define SLOT1BINFULL(FUNCNAME, TESTFUNC, SLOTNAME, DUNDER, RDUNDER) \
7381 : : static PyObject * \
7382 : : FUNCNAME(PyObject *self, PyObject *other) \
7383 : : { \
7384 : : PyObject* stack[2]; \
7385 : : PyThreadState *tstate = _PyThreadState_GET(); \
7386 : : int do_other = !Py_IS_TYPE(self, Py_TYPE(other)) && \
7387 : : Py_TYPE(other)->tp_as_number != NULL && \
7388 : : Py_TYPE(other)->tp_as_number->SLOTNAME == TESTFUNC; \
7389 : : if (Py_TYPE(self)->tp_as_number != NULL && \
7390 : : Py_TYPE(self)->tp_as_number->SLOTNAME == TESTFUNC) { \
7391 : : PyObject *r; \
7392 : : if (do_other && PyType_IsSubtype(Py_TYPE(other), Py_TYPE(self))) { \
7393 : : int ok = method_is_overloaded(self, other, &_Py_ID(RDUNDER)); \
7394 : : if (ok < 0) { \
7395 : : return NULL; \
7396 : : } \
7397 : : if (ok) { \
7398 : : stack[0] = other; \
7399 : : stack[1] = self; \
7400 : : r = vectorcall_maybe(tstate, &_Py_ID(RDUNDER), stack, 2); \
7401 : : if (r != Py_NotImplemented) \
7402 : : return r; \
7403 : : Py_DECREF(r); \
7404 : : do_other = 0; \
7405 : : } \
7406 : : } \
7407 : : stack[0] = self; \
7408 : : stack[1] = other; \
7409 : : r = vectorcall_maybe(tstate, &_Py_ID(DUNDER), stack, 2); \
7410 : : if (r != Py_NotImplemented || \
7411 : : Py_IS_TYPE(other, Py_TYPE(self))) \
7412 : : return r; \
7413 : : Py_DECREF(r); \
7414 : : } \
7415 : : if (do_other) { \
7416 : : stack[0] = other; \
7417 : : stack[1] = self; \
7418 : : return vectorcall_maybe(tstate, &_Py_ID(RDUNDER), stack, 2); \
7419 : : } \
7420 : : Py_RETURN_NOTIMPLEMENTED; \
7421 : : }
7422 : :
7423 : : #define SLOT1BIN(FUNCNAME, SLOTNAME, DUNDER, RDUNDER) \
7424 : : SLOT1BINFULL(FUNCNAME, FUNCNAME, SLOTNAME, DUNDER, RDUNDER)
7425 : :
7426 : : static Py_ssize_t
7427 : 1250589 : slot_sq_length(PyObject *self)
7428 : : {
7429 : 1250589 : PyObject* stack[1] = {self};
7430 : 1250589 : PyObject *res = vectorcall_method(&_Py_ID(__len__), stack, 1);
7431 : : Py_ssize_t len;
7432 : :
7433 [ + + ]: 1250589 : if (res == NULL)
7434 : 11 : return -1;
7435 : :
7436 : 1250578 : Py_SETREF(res, _PyNumber_Index(res));
7437 [ + + ]: 1250578 : if (res == NULL)
7438 : 4 : return -1;
7439 : :
7440 : : assert(PyLong_Check(res));
7441 [ + + ]: 1250574 : if (Py_SIZE(res) < 0) {
7442 : 5 : Py_DECREF(res);
7443 : 5 : PyErr_SetString(PyExc_ValueError,
7444 : : "__len__() should return >= 0");
7445 : 5 : return -1;
7446 : : }
7447 : :
7448 : 1250569 : len = PyNumber_AsSsize_t(res, PyExc_OverflowError);
7449 : : assert(len >= 0 || PyErr_ExceptionMatches(PyExc_OverflowError));
7450 : 1250569 : Py_DECREF(res);
7451 : 1250569 : return len;
7452 : : }
7453 : :
7454 : : static PyObject *
7455 : 1123603 : slot_sq_item(PyObject *self, Py_ssize_t i)
7456 : : {
7457 : 1123603 : PyObject *ival = PyLong_FromSsize_t(i);
7458 [ - + ]: 1123603 : if (ival == NULL) {
7459 : 0 : return NULL;
7460 : : }
7461 : 1123603 : PyObject *stack[2] = {self, ival};
7462 : 1123603 : PyObject *retval = vectorcall_method(&_Py_ID(__getitem__), stack, 2);
7463 : 1123603 : Py_DECREF(ival);
7464 : 1123603 : return retval;
7465 : : }
7466 : :
7467 : : static int
7468 : 863 : slot_sq_ass_item(PyObject *self, Py_ssize_t index, PyObject *value)
7469 : : {
7470 : : PyObject *stack[3];
7471 : : PyObject *res;
7472 : : PyObject *index_obj;
7473 : :
7474 : 863 : index_obj = PyLong_FromSsize_t(index);
7475 [ - + ]: 863 : if (index_obj == NULL) {
7476 : 0 : return -1;
7477 : : }
7478 : :
7479 : 863 : stack[0] = self;
7480 : 863 : stack[1] = index_obj;
7481 [ - + ]: 863 : if (value == NULL) {
7482 : 0 : res = vectorcall_method(&_Py_ID(__delitem__), stack, 2);
7483 : : }
7484 : : else {
7485 : 863 : stack[2] = value;
7486 : 863 : res = vectorcall_method(&_Py_ID(__setitem__), stack, 3);
7487 : : }
7488 : 863 : Py_DECREF(index_obj);
7489 : :
7490 [ + + ]: 863 : if (res == NULL) {
7491 : 15 : return -1;
7492 : : }
7493 : 848 : Py_DECREF(res);
7494 : 848 : return 0;
7495 : : }
7496 : :
7497 : : static int
7498 : 423956 : slot_sq_contains(PyObject *self, PyObject *value)
7499 : : {
7500 : 423956 : PyThreadState *tstate = _PyThreadState_GET();
7501 : : PyObject *func, *res;
7502 : 423956 : int result = -1, unbound;
7503 : :
7504 : 423956 : func = lookup_maybe_method(self, &_Py_ID(__contains__), &unbound);
7505 [ + + ]: 423956 : if (func == Py_None) {
7506 : 1 : Py_DECREF(func);
7507 : 1 : PyErr_Format(PyExc_TypeError,
7508 : : "'%.200s' object is not a container",
7509 : 1 : Py_TYPE(self)->tp_name);
7510 : 1 : return -1;
7511 : : }
7512 [ + - ]: 423955 : if (func != NULL) {
7513 : 423955 : PyObject *args[2] = {self, value};
7514 : 423955 : res = vectorcall_unbound(tstate, unbound, func, args, 2);
7515 : 423955 : Py_DECREF(func);
7516 [ + + ]: 423955 : if (res != NULL) {
7517 : 423952 : result = PyObject_IsTrue(res);
7518 : 423952 : Py_DECREF(res);
7519 : : }
7520 : : }
7521 [ # # ]: 0 : else if (! PyErr_Occurred()) {
7522 : : /* Possible results: -1 and 1 */
7523 : 0 : result = (int)_PySequence_IterSearch(self, value,
7524 : : PY_ITERSEARCH_CONTAINS);
7525 : : }
7526 : 423955 : return result;
7527 : : }
7528 : :
7529 : : #define slot_mp_length slot_sq_length
7530 : :
7531 : 1264013 : SLOT1(slot_mp_subscript, __getitem__, PyObject *)
7532 : :
7533 : : static int
7534 : 1260759 : slot_mp_ass_subscript(PyObject *self, PyObject *key, PyObject *value)
7535 : : {
7536 : : PyObject *stack[3];
7537 : : PyObject *res;
7538 : :
7539 : 1260759 : stack[0] = self;
7540 : 1260759 : stack[1] = key;
7541 [ + + ]: 1260759 : if (value == NULL) {
7542 : 57721 : res = vectorcall_method(&_Py_ID(__delitem__), stack, 2);
7543 : : }
7544 : : else {
7545 : 1203038 : stack[2] = value;
7546 : 1203038 : res = vectorcall_method(&_Py_ID(__setitem__), stack, 3);
7547 : : }
7548 : :
7549 [ + + ]: 1260759 : if (res == NULL)
7550 : 251 : return -1;
7551 : 1260508 : Py_DECREF(res);
7552 : 1260508 : return 0;
7553 : : }
7554 : :
7555 [ + + + + : 157334 : SLOT1BIN(slot_nb_add, nb_add, __add__, __radd__)
+ + + + +
+ + + - +
- - - - -
- + + + +
+ + ]
7556 [ + + + + : 23076 : SLOT1BIN(slot_nb_subtract, nb_subtract, __sub__, __rsub__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7557 [ + + + + : 2630 : SLOT1BIN(slot_nb_multiply, nb_multiply, __mul__, __rmul__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7558 [ + + + - : 19 : SLOT1BIN(slot_nb_matrix_multiply, nb_matrix_multiply, __matmul__, __rmatmul__)
+ + + - +
+ - + - -
- - - - -
- + + + +
+ + ]
7559 [ + + + - : 49 : SLOT1BIN(slot_nb_remainder, nb_remainder, __mod__, __rmod__)
+ + + - +
+ + + + +
- + + - +
- + + + +
+ + ]
7560 [ + + + - : 2599 : SLOT1BIN(slot_nb_divmod, nb_divmod, __divmod__, __rdivmod__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7561 : :
7562 : : static PyObject *slot_nb_power(PyObject *, PyObject *, PyObject *);
7563 : :
7564 [ + + + - : 117450 : SLOT1BINFULL(slot_nb_power_binary, slot_nb_power, nb_power, __pow__, __rpow__)
+ + + + +
+ + + - +
- - - - -
- + + + +
+ + ]
7565 : :
7566 : : static PyObject *
7567 : 117453 : slot_nb_power(PyObject *self, PyObject *other, PyObject *modulus)
7568 : : {
7569 [ + + ]: 117453 : if (modulus == Py_None)
7570 : 117450 : return slot_nb_power_binary(self, other);
7571 : : /* Three-arg power doesn't use __rpow__. But ternary_op
7572 : : can call this when the second argument's type uses
7573 : : slot_nb_power, so check before calling self.__pow__. */
7574 [ + - ]: 3 : if (Py_TYPE(self)->tp_as_number != NULL &&
7575 [ + + ]: 3 : Py_TYPE(self)->tp_as_number->nb_power == slot_nb_power) {
7576 : 2 : PyObject* stack[3] = {self, other, modulus};
7577 : 2 : return vectorcall_method(&_Py_ID(__pow__), stack, 3);
7578 : : }
7579 : 1 : Py_RETURN_NOTIMPLEMENTED;
7580 : : }
7581 : :
7582 : 11861 : SLOT0(slot_nb_negative, __neg__)
7583 : 11 : SLOT0(slot_nb_positive, __pos__)
7584 : 39989 : SLOT0(slot_nb_absolute, __abs__)
7585 : :
7586 : : static int
7587 : 361282 : slot_nb_bool(PyObject *self)
7588 : : {
7589 : : PyObject *func, *value;
7590 : : int result, unbound;
7591 : 361282 : int using_len = 0;
7592 : :
7593 : 361282 : func = lookup_maybe_method(self, &_Py_ID(__bool__), &unbound);
7594 [ - + ]: 361282 : if (func == NULL) {
7595 [ # # ]: 0 : if (PyErr_Occurred()) {
7596 : 0 : return -1;
7597 : : }
7598 : :
7599 : 0 : func = lookup_maybe_method(self, &_Py_ID(__len__), &unbound);
7600 [ # # ]: 0 : if (func == NULL) {
7601 [ # # ]: 0 : if (PyErr_Occurred()) {
7602 : 0 : return -1;
7603 : : }
7604 : 0 : return 1;
7605 : : }
7606 : 0 : using_len = 1;
7607 : : }
7608 : :
7609 : 361282 : value = call_unbound_noarg(unbound, func, self);
7610 [ + + ]: 361282 : if (value == NULL) {
7611 : 85 : goto error;
7612 : : }
7613 : :
7614 [ - + ]: 361197 : if (using_len) {
7615 : : /* bool type enforced by slot_nb_len */
7616 : 0 : result = PyObject_IsTrue(value);
7617 : : }
7618 [ + + ]: 361197 : else if (PyBool_Check(value)) {
7619 : 361192 : result = PyObject_IsTrue(value);
7620 : : }
7621 : : else {
7622 : 5 : PyErr_Format(PyExc_TypeError,
7623 : : "__bool__ should return "
7624 : : "bool, returned %s",
7625 : 5 : Py_TYPE(value)->tp_name);
7626 : 5 : result = -1;
7627 : : }
7628 : :
7629 : 361197 : Py_DECREF(value);
7630 : 361197 : Py_DECREF(func);
7631 : 361197 : return result;
7632 : :
7633 : 85 : error:
7634 : 85 : Py_DECREF(func);
7635 : 85 : return -1;
7636 : : }
7637 : :
7638 : :
7639 : : static PyObject *
7640 : 3337 : slot_nb_index(PyObject *self)
7641 : : {
7642 : 3337 : PyObject *stack[1] = {self};
7643 : 3337 : return vectorcall_method(&_Py_ID(__index__), stack, 1);
7644 : : }
7645 : :
7646 : :
7647 : 310 : SLOT0(slot_nb_invert, __invert__)
7648 [ + + + - : 23 : SLOT1BIN(slot_nb_lshift, nb_lshift, __lshift__, __rlshift__)
+ + + - +
+ - + - -
- - - - -
- + + + +
+ + ]
7649 [ + + + - : 12 : SLOT1BIN(slot_nb_rshift, nb_rshift, __rshift__, __rrshift__)
+ + + + +
+ - + - -
- - - - -
- + + + +
+ + ]
7650 [ + + + + : 107296 : SLOT1BIN(slot_nb_and, nb_and, __and__, __rand__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7651 [ + + + + : 236 : SLOT1BIN(slot_nb_xor, nb_xor, __xor__, __rxor__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7652 [ + + + + : 12367 : SLOT1BIN(slot_nb_or, nb_or, __or__, __ror__)
+ + + - +
+ + + + +
- + + + +
- + + + +
+ + ]
7653 : :
7654 : 25456 : SLOT0(slot_nb_int, __int__)
7655 : 1988 : SLOT0(slot_nb_float, __float__)
7656 : 5754 : SLOT1(slot_nb_inplace_add, __iadd__, PyObject *)
7657 : 11 : SLOT1(slot_nb_inplace_subtract, __isub__, PyObject *)
7658 : 18 : SLOT1(slot_nb_inplace_multiply, __imul__, PyObject *)
7659 : 9 : SLOT1(slot_nb_inplace_matrix_multiply, __imatmul__, PyObject *)
7660 : 6 : SLOT1(slot_nb_inplace_remainder, __imod__, PyObject *)
7661 : : /* Can't use SLOT1 here, because nb_inplace_power is ternary */
7662 : : static PyObject *
7663 : 9 : slot_nb_inplace_power(PyObject *self, PyObject * arg1, PyObject *arg2)
7664 : : {
7665 : 9 : PyObject *stack[2] = {self, arg1};
7666 : 9 : return vectorcall_method(&_Py_ID(__ipow__), stack, 2);
7667 : : }
7668 : 6 : SLOT1(slot_nb_inplace_lshift, __ilshift__, PyObject *)
7669 : 6 : SLOT1(slot_nb_inplace_rshift, __irshift__, PyObject *)
7670 : 14 : SLOT1(slot_nb_inplace_and, __iand__, PyObject *)
7671 : 10 : SLOT1(slot_nb_inplace_xor, __ixor__, PyObject *)
7672 : 36 : SLOT1(slot_nb_inplace_or, __ior__, PyObject *)
7673 [ + + + - : 1744 : SLOT1BIN(slot_nb_floor_divide, nb_floor_divide,
+ + + - +
+ + + + +
- + + + +
- + + + +
+ + ]
7674 : : __floordiv__, __rfloordiv__)
7675 [ + + + - : 163777 : SLOT1BIN(slot_nb_true_divide, nb_true_divide, __truediv__, __rtruediv__)
+ + + - +
+ + + - +
- - - - -
- + + + +
+ + ]
7676 : 7 : SLOT1(slot_nb_inplace_floor_divide, __ifloordiv__, PyObject *)
7677 : 7 : SLOT1(slot_nb_inplace_true_divide, __itruediv__, PyObject *)
7678 : :
7679 : : static PyObject *
7680 : 32637 : slot_tp_repr(PyObject *self)
7681 : : {
7682 : : PyObject *func, *res;
7683 : : int unbound;
7684 : :
7685 : 32637 : func = lookup_maybe_method(self, &_Py_ID(__repr__), &unbound);
7686 [ + - ]: 32637 : if (func != NULL) {
7687 : 32637 : res = call_unbound_noarg(unbound, func, self);
7688 : 32637 : Py_DECREF(func);
7689 : 32637 : return res;
7690 : : }
7691 : 0 : PyErr_Clear();
7692 : 0 : return PyUnicode_FromFormat("<%s object at %p>",
7693 : 0 : Py_TYPE(self)->tp_name, self);
7694 : : }
7695 : :
7696 : 528652 : SLOT0(slot_tp_str, __str__)
7697 : :
7698 : : static Py_hash_t
7699 : 1346669 : slot_tp_hash(PyObject *self)
7700 : : {
7701 : : PyObject *func, *res;
7702 : : Py_ssize_t h;
7703 : : int unbound;
7704 : :
7705 : 1346669 : func = lookup_maybe_method(self, &_Py_ID(__hash__), &unbound);
7706 : :
7707 [ - + ]: 1346669 : if (func == Py_None) {
7708 : 0 : Py_DECREF(func);
7709 : 0 : func = NULL;
7710 : : }
7711 : :
7712 [ - + ]: 1346669 : if (func == NULL) {
7713 : 0 : return PyObject_HashNotImplemented(self);
7714 : : }
7715 : :
7716 : 1346669 : res = call_unbound_noarg(unbound, func, self);
7717 : 1346669 : Py_DECREF(func);
7718 [ + + ]: 1346669 : if (res == NULL)
7719 : 452 : return -1;
7720 : :
7721 [ - + ]: 1346217 : if (!PyLong_Check(res)) {
7722 : 0 : PyErr_SetString(PyExc_TypeError,
7723 : : "__hash__ method should return an integer");
7724 : 0 : return -1;
7725 : : }
7726 : : /* Transform the PyLong `res` to a Py_hash_t `h`. For an existing
7727 : : hashable Python object x, hash(x) will always lie within the range of
7728 : : Py_hash_t. Therefore our transformation must preserve values that
7729 : : already lie within this range, to ensure that if x.__hash__() returns
7730 : : hash(y) then hash(x) == hash(y). */
7731 : 1346217 : h = PyLong_AsSsize_t(res);
7732 [ + + + - ]: 1346217 : if (h == -1 && PyErr_Occurred()) {
7733 : : /* res was not within the range of a Py_hash_t, so we're free to
7734 : : use any sufficiently bit-mixing transformation;
7735 : : long.__hash__ will do nicely. */
7736 : 1 : PyErr_Clear();
7737 : 1 : h = PyLong_Type.tp_hash(res);
7738 : : }
7739 : : /* -1 is reserved for errors. */
7740 [ - + ]: 1346217 : if (h == -1)
7741 : 0 : h = -2;
7742 : 1346217 : Py_DECREF(res);
7743 : 1346217 : return h;
7744 : : }
7745 : :
7746 : : static PyObject *
7747 : 473657 : slot_tp_call(PyObject *self, PyObject *args, PyObject *kwds)
7748 : : {
7749 : 473657 : PyThreadState *tstate = _PyThreadState_GET();
7750 : : int unbound;
7751 : :
7752 : 473657 : PyObject *meth = lookup_method(self, &_Py_ID(__call__), &unbound);
7753 [ - + ]: 473657 : if (meth == NULL) {
7754 : 0 : return NULL;
7755 : : }
7756 : :
7757 : : PyObject *res;
7758 [ + + ]: 473657 : if (unbound) {
7759 : 471690 : res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds);
7760 : : }
7761 : : else {
7762 : 1967 : res = _PyObject_Call(tstate, meth, args, kwds);
7763 : : }
7764 : :
7765 : 473657 : Py_DECREF(meth);
7766 : 473657 : return res;
7767 : : }
7768 : :
7769 : : /* There are two slot dispatch functions for tp_getattro.
7770 : :
7771 : : - slot_tp_getattro() is used when __getattribute__ is overridden
7772 : : but no __getattr__ hook is present;
7773 : :
7774 : : - slot_tp_getattr_hook() is used when a __getattr__ hook is present.
7775 : :
7776 : : The code in update_one_slot() always installs slot_tp_getattr_hook(); this
7777 : : detects the absence of __getattr__ and then installs the simpler slot if
7778 : : necessary. */
7779 : :
7780 : : static PyObject *
7781 : 20006 : slot_tp_getattro(PyObject *self, PyObject *name)
7782 : : {
7783 : 20006 : PyObject *stack[2] = {self, name};
7784 : 20006 : return vectorcall_method(&_Py_ID(__getattribute__), stack, 2);
7785 : : }
7786 : :
7787 : : static inline PyObject *
7788 : 4642521 : call_attribute(PyObject *self, PyObject *attr, PyObject *name)
7789 : : {
7790 : 4642521 : PyObject *res, *descr = NULL;
7791 : :
7792 [ + + ]: 4642521 : if (_PyType_HasFeature(Py_TYPE(attr), Py_TPFLAGS_METHOD_DESCRIPTOR)) {
7793 : 4642518 : PyObject *args[] = { self, name };
7794 : 4642518 : res = PyObject_Vectorcall(attr, args, 2, NULL);
7795 : 4642518 : return res;
7796 : : }
7797 : :
7798 : 3 : descrgetfunc f = Py_TYPE(attr)->tp_descr_get;
7799 : :
7800 [ + - ]: 3 : if (f != NULL) {
7801 : 3 : descr = f(attr, self, (PyObject *)(Py_TYPE(self)));
7802 [ - + ]: 3 : if (descr == NULL)
7803 : 0 : return NULL;
7804 : : else
7805 : 3 : attr = descr;
7806 : : }
7807 : 3 : res = PyObject_CallOneArg(attr, name);
7808 : 3 : Py_XDECREF(descr);
7809 : 3 : return res;
7810 : : }
7811 : :
7812 : : static PyObject *
7813 : 9681932 : slot_tp_getattr_hook(PyObject *self, PyObject *name)
7814 : : {
7815 : 9681932 : PyTypeObject *tp = Py_TYPE(self);
7816 : : PyObject *getattr, *getattribute, *res;
7817 : :
7818 : : /* speed hack: we could use lookup_maybe, but that would resolve the
7819 : : method fully for each attribute lookup for classes with
7820 : : __getattr__, even when the attribute is present. So we use
7821 : : _PyType_Lookup and create the method only when needed, with
7822 : : call_attribute. */
7823 : 9681932 : getattr = _PyType_Lookup(tp, &_Py_ID(__getattr__));
7824 [ + + ]: 9681932 : if (getattr == NULL) {
7825 : : /* No __getattr__ hook: use a simpler dispatcher */
7826 : 921 : tp->tp_getattro = slot_tp_getattro;
7827 : 921 : return slot_tp_getattro(self, name);
7828 : : }
7829 : 9681011 : Py_INCREF(getattr);
7830 : : /* speed hack: we could use lookup_maybe, but that would resolve the
7831 : : method fully for each attribute lookup for classes with
7832 : : __getattr__, even when self has the default __getattribute__
7833 : : method. So we use _PyType_Lookup and create the method only when
7834 : : needed, with call_attribute. */
7835 : 9681011 : getattribute = _PyType_Lookup(tp, &_Py_ID(__getattribute__));
7836 [ + - + + ]: 19362022 : if (getattribute == NULL ||
7837 : 9681011 : (Py_IS_TYPE(getattribute, &PyWrapperDescr_Type) &&
7838 [ + + ]: 9670172 : ((PyWrapperDescrObject *)getattribute)->d_wrapped ==
7839 : : (void *)PyObject_GenericGetAttr))
7840 : 5135566 : res = PyObject_GenericGetAttr(self, name);
7841 : : else {
7842 : 4545445 : Py_INCREF(getattribute);
7843 : 4545445 : res = call_attribute(self, getattribute, name);
7844 : 4545445 : Py_DECREF(getattribute);
7845 : : }
7846 [ + + + - ]: 9681011 : if (res == NULL && PyErr_ExceptionMatches(PyExc_AttributeError)) {
7847 : 97076 : PyErr_Clear();
7848 : 97076 : res = call_attribute(self, getattr, name);
7849 : : }
7850 : 9681011 : Py_DECREF(getattr);
7851 : 9681011 : return res;
7852 : : }
7853 : :
7854 : : static int
7855 : 1195752 : slot_tp_setattro(PyObject *self, PyObject *name, PyObject *value)
7856 : : {
7857 : : PyObject *stack[3];
7858 : : PyObject *res;
7859 : :
7860 : 1195752 : stack[0] = self;
7861 : 1195752 : stack[1] = name;
7862 [ + + ]: 1195752 : if (value == NULL) {
7863 : 157379 : res = vectorcall_method(&_Py_ID(__delattr__), stack, 2);
7864 : : }
7865 : : else {
7866 : 1038373 : stack[2] = value;
7867 : 1038373 : res = vectorcall_method(&_Py_ID(__setattr__), stack, 3);
7868 : : }
7869 [ + + ]: 1195752 : if (res == NULL)
7870 : 329 : return -1;
7871 : 1195423 : Py_DECREF(res);
7872 : 1195423 : return 0;
7873 : : }
7874 : :
7875 : : static PyObject *name_op[] = {
7876 : : &_Py_ID(__lt__),
7877 : : &_Py_ID(__le__),
7878 : : &_Py_ID(__eq__),
7879 : : &_Py_ID(__ne__),
7880 : : &_Py_ID(__gt__),
7881 : : &_Py_ID(__ge__),
7882 : : };
7883 : :
7884 : : static PyObject *
7885 : 9857592 : slot_tp_richcompare(PyObject *self, PyObject *other, int op)
7886 : : {
7887 : 9857592 : PyThreadState *tstate = _PyThreadState_GET();
7888 : :
7889 : : int unbound;
7890 : 9857592 : PyObject *func = lookup_maybe_method(self, name_op[op], &unbound);
7891 [ + + ]: 9857592 : if (func == NULL) {
7892 : 2 : PyErr_Clear();
7893 : 2 : Py_RETURN_NOTIMPLEMENTED;
7894 : : }
7895 : :
7896 : 9857590 : PyObject *stack[2] = {self, other};
7897 : 9857590 : PyObject *res = vectorcall_unbound(tstate, unbound, func, stack, 2);
7898 : 9857590 : Py_DECREF(func);
7899 : 9857590 : return res;
7900 : : }
7901 : :
7902 : : static PyObject *
7903 : 103115 : slot_tp_iter(PyObject *self)
7904 : : {
7905 : : int unbound;
7906 : : PyObject *func, *res;
7907 : :
7908 : 103115 : func = lookup_maybe_method(self, &_Py_ID(__iter__), &unbound);
7909 [ + + ]: 103115 : if (func == Py_None) {
7910 : 28 : Py_DECREF(func);
7911 : 28 : PyErr_Format(PyExc_TypeError,
7912 : : "'%.200s' object is not iterable",
7913 : 28 : Py_TYPE(self)->tp_name);
7914 : 28 : return NULL;
7915 : : }
7916 : :
7917 [ + - ]: 103087 : if (func != NULL) {
7918 : 103087 : res = call_unbound_noarg(unbound, func, self);
7919 : 103087 : Py_DECREF(func);
7920 : 103087 : return res;
7921 : : }
7922 : :
7923 : 0 : PyErr_Clear();
7924 : 0 : func = lookup_maybe_method(self, &_Py_ID(__getitem__), &unbound);
7925 [ # # ]: 0 : if (func == NULL) {
7926 : 0 : PyErr_Format(PyExc_TypeError,
7927 : : "'%.200s' object is not iterable",
7928 : 0 : Py_TYPE(self)->tp_name);
7929 : 0 : return NULL;
7930 : : }
7931 : 0 : Py_DECREF(func);
7932 : 0 : return PySeqIter_New(self);
7933 : : }
7934 : :
7935 : : static PyObject *
7936 : 242391 : slot_tp_iternext(PyObject *self)
7937 : : {
7938 : 242391 : PyObject *stack[1] = {self};
7939 : 242391 : return vectorcall_method(&_Py_ID(__next__), stack, 1);
7940 : : }
7941 : :
7942 : : static PyObject *
7943 : 893443 : slot_tp_descr_get(PyObject *self, PyObject *obj, PyObject *type)
7944 : : {
7945 : 893443 : PyTypeObject *tp = Py_TYPE(self);
7946 : : PyObject *get;
7947 : :
7948 : 893443 : get = _PyType_Lookup(tp, &_Py_ID(__get__));
7949 [ - + ]: 893443 : if (get == NULL) {
7950 : : /* Avoid further slowdowns */
7951 [ # # ]: 0 : if (tp->tp_descr_get == slot_tp_descr_get)
7952 : 0 : tp->tp_descr_get = NULL;
7953 : 0 : Py_INCREF(self);
7954 : 0 : return self;
7955 : : }
7956 [ + + ]: 893443 : if (obj == NULL)
7957 : 851332 : obj = Py_None;
7958 [ - + ]: 893443 : if (type == NULL)
7959 : 0 : type = Py_None;
7960 : 893443 : return PyObject_CallFunctionObjArgs(get, self, obj, type, NULL);
7961 : : }
7962 : :
7963 : : static int
7964 : 31 : slot_tp_descr_set(PyObject *self, PyObject *target, PyObject *value)
7965 : : {
7966 : : PyObject* stack[3];
7967 : : PyObject *res;
7968 : :
7969 : 31 : stack[0] = self;
7970 : 31 : stack[1] = target;
7971 [ + + ]: 31 : if (value == NULL) {
7972 : 15 : res = vectorcall_method(&_Py_ID(__delete__), stack, 2);
7973 : : }
7974 : : else {
7975 : 16 : stack[2] = value;
7976 : 16 : res = vectorcall_method(&_Py_ID(__set__), stack, 3);
7977 : : }
7978 [ + + ]: 31 : if (res == NULL)
7979 : 14 : return -1;
7980 : 17 : Py_DECREF(res);
7981 : 17 : return 0;
7982 : : }
7983 : :
7984 : : static int
7985 : 12704199 : slot_tp_init(PyObject *self, PyObject *args, PyObject *kwds)
7986 : : {
7987 : 12704199 : PyThreadState *tstate = _PyThreadState_GET();
7988 : :
7989 : : int unbound;
7990 : 12704199 : PyObject *meth = lookup_method(self, &_Py_ID(__init__), &unbound);
7991 [ + + ]: 12704199 : if (meth == NULL) {
7992 : 1 : return -1;
7993 : : }
7994 : :
7995 : : PyObject *res;
7996 [ + + ]: 12704198 : if (unbound) {
7997 : 12704196 : res = _PyObject_Call_Prepend(tstate, meth, self, args, kwds);
7998 : : }
7999 : : else {
8000 : 2 : res = _PyObject_Call(tstate, meth, args, kwds);
8001 : : }
8002 : 12704190 : Py_DECREF(meth);
8003 [ + + ]: 12704190 : if (res == NULL)
8004 : 40775 : return -1;
8005 [ + + ]: 12663415 : if (res != Py_None) {
8006 : 1 : PyErr_Format(PyExc_TypeError,
8007 : : "__init__() should return None, not '%.200s'",
8008 : 1 : Py_TYPE(res)->tp_name);
8009 : 1 : Py_DECREF(res);
8010 : 1 : return -1;
8011 : : }
8012 : 12663414 : Py_DECREF(res);
8013 : 12663414 : return 0;
8014 : : }
8015 : :
8016 : : static PyObject *
8017 : 10604812 : slot_tp_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
8018 : : {
8019 : 10604812 : PyThreadState *tstate = _PyThreadState_GET();
8020 : : PyObject *func, *result;
8021 : :
8022 : 10604812 : func = PyObject_GetAttr((PyObject *)type, &_Py_ID(__new__));
8023 [ - + ]: 10604812 : if (func == NULL) {
8024 : 0 : return NULL;
8025 : : }
8026 : :
8027 : 10604812 : result = _PyObject_Call_Prepend(tstate, func, (PyObject *)type, args, kwds);
8028 : 10604812 : Py_DECREF(func);
8029 : 10604812 : return result;
8030 : : }
8031 : :
8032 : : static void
8033 : 4256295 : slot_tp_finalize(PyObject *self)
8034 : : {
8035 : : int unbound;
8036 : : PyObject *del, *res;
8037 : : PyObject *error_type, *error_value, *error_traceback;
8038 : :
8039 : : /* Save the current exception, if any. */
8040 : 4256295 : PyErr_Fetch(&error_type, &error_value, &error_traceback);
8041 : :
8042 : : /* Execute __del__ method, if any. */
8043 : 4256295 : del = lookup_maybe_method(self, &_Py_ID(__del__), &unbound);
8044 [ + - ]: 4256295 : if (del != NULL) {
8045 : 4256295 : res = call_unbound_noarg(unbound, del, self);
8046 [ + + ]: 4256295 : if (res == NULL)
8047 : 16 : PyErr_WriteUnraisable(del);
8048 : : else
8049 : 4256279 : Py_DECREF(res);
8050 : 4256295 : Py_DECREF(del);
8051 : : }
8052 : :
8053 : : /* Restore the saved exception. */
8054 : 4256295 : PyErr_Restore(error_type, error_value, error_traceback);
8055 : 4256295 : }
8056 : :
8057 : : static PyObject *
8058 : 226 : slot_am_await(PyObject *self)
8059 : : {
8060 : : int unbound;
8061 : : PyObject *func, *res;
8062 : :
8063 : 226 : func = lookup_maybe_method(self, &_Py_ID(__await__), &unbound);
8064 [ + - ]: 226 : if (func != NULL) {
8065 : 226 : res = call_unbound_noarg(unbound, func, self);
8066 : 226 : Py_DECREF(func);
8067 : 226 : return res;
8068 : : }
8069 : 0 : PyErr_Format(PyExc_AttributeError,
8070 : : "object %.50s does not have __await__ method",
8071 : 0 : Py_TYPE(self)->tp_name);
8072 : 0 : return NULL;
8073 : : }
8074 : :
8075 : : static PyObject *
8076 : 31 : slot_am_aiter(PyObject *self)
8077 : : {
8078 : : int unbound;
8079 : : PyObject *func, *res;
8080 : :
8081 : 31 : func = lookup_maybe_method(self, &_Py_ID(__aiter__), &unbound);
8082 [ + - ]: 31 : if (func != NULL) {
8083 : 31 : res = call_unbound_noarg(unbound, func, self);
8084 : 31 : Py_DECREF(func);
8085 : 31 : return res;
8086 : : }
8087 : 0 : PyErr_Format(PyExc_AttributeError,
8088 : : "object %.50s does not have __aiter__ method",
8089 : 0 : Py_TYPE(self)->tp_name);
8090 : 0 : return NULL;
8091 : : }
8092 : :
8093 : : static PyObject *
8094 : 365 : slot_am_anext(PyObject *self)
8095 : : {
8096 : : int unbound;
8097 : : PyObject *func, *res;
8098 : :
8099 : 365 : func = lookup_maybe_method(self, &_Py_ID(__anext__), &unbound);
8100 [ + - ]: 365 : if (func != NULL) {
8101 : 365 : res = call_unbound_noarg(unbound, func, self);
8102 : 365 : Py_DECREF(func);
8103 : 365 : return res;
8104 : : }
8105 : 0 : PyErr_Format(PyExc_AttributeError,
8106 : : "object %.50s does not have __anext__ method",
8107 : 0 : Py_TYPE(self)->tp_name);
8108 : 0 : return NULL;
8109 : : }
8110 : :
8111 : : /*
8112 : : Table mapping __foo__ names to tp_foo offsets and slot_tp_foo wrapper functions.
8113 : :
8114 : : The table is ordered by offsets relative to the 'PyHeapTypeObject' structure,
8115 : : which incorporates the additional structures used for numbers, sequences and
8116 : : mappings. Note that multiple names may map to the same slot (e.g. __eq__,
8117 : : __ne__ etc. all map to tp_richcompare) and one name may map to multiple slots
8118 : : (e.g. __str__ affects tp_str as well as tp_repr). The table is terminated with
8119 : : an all-zero entry. (This table is further initialized in
8120 : : _PyTypes_InitSlotDefs().)
8121 : : */
8122 : :
8123 : : typedef struct wrapperbase slotdef;
8124 : :
8125 : : #undef TPSLOT
8126 : : #undef FLSLOT
8127 : : #undef AMSLOT
8128 : : #undef ETSLOT
8129 : : #undef SQSLOT
8130 : : #undef MPSLOT
8131 : : #undef NBSLOT
8132 : : #undef UNSLOT
8133 : : #undef IBSLOT
8134 : : #undef BINSLOT
8135 : : #undef RBINSLOT
8136 : :
8137 : : #define TPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8138 : : {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
8139 : : PyDoc_STR(DOC)}
8140 : : #define FLSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC, FLAGS) \
8141 : : {NAME, offsetof(PyTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
8142 : : PyDoc_STR(DOC), FLAGS}
8143 : : #define ETSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8144 : : {NAME, offsetof(PyHeapTypeObject, SLOT), (void *)(FUNCTION), WRAPPER, \
8145 : : PyDoc_STR(DOC)}
8146 : : #define AMSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8147 : : ETSLOT(NAME, as_async.SLOT, FUNCTION, WRAPPER, DOC)
8148 : : #define SQSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8149 : : ETSLOT(NAME, as_sequence.SLOT, FUNCTION, WRAPPER, DOC)
8150 : : #define MPSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8151 : : ETSLOT(NAME, as_mapping.SLOT, FUNCTION, WRAPPER, DOC)
8152 : : #define NBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8153 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, DOC)
8154 : : #define UNSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8155 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
8156 : : NAME "($self, /)\n--\n\n" DOC)
8157 : : #define IBSLOT(NAME, SLOT, FUNCTION, WRAPPER, DOC) \
8158 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, WRAPPER, \
8159 : : NAME "($self, value, /)\n--\n\nReturn self" DOC "value.")
8160 : : #define BINSLOT(NAME, SLOT, FUNCTION, DOC) \
8161 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
8162 : : NAME "($self, value, /)\n--\n\nReturn self" DOC "value.")
8163 : : #define RBINSLOT(NAME, SLOT, FUNCTION, DOC) \
8164 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
8165 : : NAME "($self, value, /)\n--\n\nReturn value" DOC "self.")
8166 : : #define BINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
8167 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_l, \
8168 : : NAME "($self, value, /)\n--\n\n" DOC)
8169 : : #define RBINSLOTNOTINFIX(NAME, SLOT, FUNCTION, DOC) \
8170 : : ETSLOT(NAME, as_number.SLOT, FUNCTION, wrap_binaryfunc_r, \
8171 : : NAME "($self, value, /)\n--\n\n" DOC)
8172 : :
8173 : : static slotdef slotdefs[] = {
8174 : : TPSLOT("__getattribute__", tp_getattr, NULL, NULL, ""),
8175 : : TPSLOT("__getattr__", tp_getattr, NULL, NULL, ""),
8176 : : TPSLOT("__setattr__", tp_setattr, NULL, NULL, ""),
8177 : : TPSLOT("__delattr__", tp_setattr, NULL, NULL, ""),
8178 : : TPSLOT("__repr__", tp_repr, slot_tp_repr, wrap_unaryfunc,
8179 : : "__repr__($self, /)\n--\n\nReturn repr(self)."),
8180 : : TPSLOT("__hash__", tp_hash, slot_tp_hash, wrap_hashfunc,
8181 : : "__hash__($self, /)\n--\n\nReturn hash(self)."),
8182 : : FLSLOT("__call__", tp_call, slot_tp_call, (wrapperfunc)(void(*)(void))wrap_call,
8183 : : "__call__($self, /, *args, **kwargs)\n--\n\nCall self as a function.",
8184 : : PyWrapperFlag_KEYWORDS),
8185 : : TPSLOT("__str__", tp_str, slot_tp_str, wrap_unaryfunc,
8186 : : "__str__($self, /)\n--\n\nReturn str(self)."),
8187 : : TPSLOT("__getattribute__", tp_getattro, slot_tp_getattr_hook,
8188 : : wrap_binaryfunc,
8189 : : "__getattribute__($self, name, /)\n--\n\nReturn getattr(self, name)."),
8190 : : TPSLOT("__getattr__", tp_getattro, slot_tp_getattr_hook, NULL, ""),
8191 : : TPSLOT("__setattr__", tp_setattro, slot_tp_setattro, wrap_setattr,
8192 : : "__setattr__($self, name, value, /)\n--\n\nImplement setattr(self, name, value)."),
8193 : : TPSLOT("__delattr__", tp_setattro, slot_tp_setattro, wrap_delattr,
8194 : : "__delattr__($self, name, /)\n--\n\nImplement delattr(self, name)."),
8195 : : TPSLOT("__lt__", tp_richcompare, slot_tp_richcompare, richcmp_lt,
8196 : : "__lt__($self, value, /)\n--\n\nReturn self<value."),
8197 : : TPSLOT("__le__", tp_richcompare, slot_tp_richcompare, richcmp_le,
8198 : : "__le__($self, value, /)\n--\n\nReturn self<=value."),
8199 : : TPSLOT("__eq__", tp_richcompare, slot_tp_richcompare, richcmp_eq,
8200 : : "__eq__($self, value, /)\n--\n\nReturn self==value."),
8201 : : TPSLOT("__ne__", tp_richcompare, slot_tp_richcompare, richcmp_ne,
8202 : : "__ne__($self, value, /)\n--\n\nReturn self!=value."),
8203 : : TPSLOT("__gt__", tp_richcompare, slot_tp_richcompare, richcmp_gt,
8204 : : "__gt__($self, value, /)\n--\n\nReturn self>value."),
8205 : : TPSLOT("__ge__", tp_richcompare, slot_tp_richcompare, richcmp_ge,
8206 : : "__ge__($self, value, /)\n--\n\nReturn self>=value."),
8207 : : TPSLOT("__iter__", tp_iter, slot_tp_iter, wrap_unaryfunc,
8208 : : "__iter__($self, /)\n--\n\nImplement iter(self)."),
8209 : : TPSLOT("__next__", tp_iternext, slot_tp_iternext, wrap_next,
8210 : : "__next__($self, /)\n--\n\nImplement next(self)."),
8211 : : TPSLOT("__get__", tp_descr_get, slot_tp_descr_get, wrap_descr_get,
8212 : : "__get__($self, instance, owner=None, /)\n--\n\nReturn an attribute of instance, which is of type owner."),
8213 : : TPSLOT("__set__", tp_descr_set, slot_tp_descr_set, wrap_descr_set,
8214 : : "__set__($self, instance, value, /)\n--\n\nSet an attribute of instance to value."),
8215 : : TPSLOT("__delete__", tp_descr_set, slot_tp_descr_set,
8216 : : wrap_descr_delete,
8217 : : "__delete__($self, instance, /)\n--\n\nDelete an attribute of instance."),
8218 : : FLSLOT("__init__", tp_init, slot_tp_init, (wrapperfunc)(void(*)(void))wrap_init,
8219 : : "__init__($self, /, *args, **kwargs)\n--\n\n"
8220 : : "Initialize self. See help(type(self)) for accurate signature.",
8221 : : PyWrapperFlag_KEYWORDS),
8222 : : TPSLOT("__new__", tp_new, slot_tp_new, NULL,
8223 : : "__new__(type, /, *args, **kwargs)\n--\n\n"
8224 : : "Create and return new object. See help(type) for accurate signature."),
8225 : : TPSLOT("__del__", tp_finalize, slot_tp_finalize, (wrapperfunc)wrap_del, ""),
8226 : :
8227 : : AMSLOT("__await__", am_await, slot_am_await, wrap_unaryfunc,
8228 : : "__await__($self, /)\n--\n\nReturn an iterator to be used in await expression."),
8229 : : AMSLOT("__aiter__", am_aiter, slot_am_aiter, wrap_unaryfunc,
8230 : : "__aiter__($self, /)\n--\n\nReturn an awaitable, that resolves in asynchronous iterator."),
8231 : : AMSLOT("__anext__", am_anext, slot_am_anext, wrap_unaryfunc,
8232 : : "__anext__($self, /)\n--\n\nReturn a value or raise StopAsyncIteration."),
8233 : :
8234 : : BINSLOT("__add__", nb_add, slot_nb_add,
8235 : : "+"),
8236 : : RBINSLOT("__radd__", nb_add, slot_nb_add,
8237 : : "+"),
8238 : : BINSLOT("__sub__", nb_subtract, slot_nb_subtract,
8239 : : "-"),
8240 : : RBINSLOT("__rsub__", nb_subtract, slot_nb_subtract,
8241 : : "-"),
8242 : : BINSLOT("__mul__", nb_multiply, slot_nb_multiply,
8243 : : "*"),
8244 : : RBINSLOT("__rmul__", nb_multiply, slot_nb_multiply,
8245 : : "*"),
8246 : : BINSLOT("__mod__", nb_remainder, slot_nb_remainder,
8247 : : "%"),
8248 : : RBINSLOT("__rmod__", nb_remainder, slot_nb_remainder,
8249 : : "%"),
8250 : : BINSLOTNOTINFIX("__divmod__", nb_divmod, slot_nb_divmod,
8251 : : "Return divmod(self, value)."),
8252 : : RBINSLOTNOTINFIX("__rdivmod__", nb_divmod, slot_nb_divmod,
8253 : : "Return divmod(value, self)."),
8254 : : NBSLOT("__pow__", nb_power, slot_nb_power, wrap_ternaryfunc,
8255 : : "__pow__($self, value, mod=None, /)\n--\n\nReturn pow(self, value, mod)."),
8256 : : NBSLOT("__rpow__", nb_power, slot_nb_power, wrap_ternaryfunc_r,
8257 : : "__rpow__($self, value, mod=None, /)\n--\n\nReturn pow(value, self, mod)."),
8258 : : UNSLOT("__neg__", nb_negative, slot_nb_negative, wrap_unaryfunc, "-self"),
8259 : : UNSLOT("__pos__", nb_positive, slot_nb_positive, wrap_unaryfunc, "+self"),
8260 : : UNSLOT("__abs__", nb_absolute, slot_nb_absolute, wrap_unaryfunc,
8261 : : "abs(self)"),
8262 : : UNSLOT("__bool__", nb_bool, slot_nb_bool, wrap_inquirypred,
8263 : : "True if self else False"),
8264 : : UNSLOT("__invert__", nb_invert, slot_nb_invert, wrap_unaryfunc, "~self"),
8265 : : BINSLOT("__lshift__", nb_lshift, slot_nb_lshift, "<<"),
8266 : : RBINSLOT("__rlshift__", nb_lshift, slot_nb_lshift, "<<"),
8267 : : BINSLOT("__rshift__", nb_rshift, slot_nb_rshift, ">>"),
8268 : : RBINSLOT("__rrshift__", nb_rshift, slot_nb_rshift, ">>"),
8269 : : BINSLOT("__and__", nb_and, slot_nb_and, "&"),
8270 : : RBINSLOT("__rand__", nb_and, slot_nb_and, "&"),
8271 : : BINSLOT("__xor__", nb_xor, slot_nb_xor, "^"),
8272 : : RBINSLOT("__rxor__", nb_xor, slot_nb_xor, "^"),
8273 : : BINSLOT("__or__", nb_or, slot_nb_or, "|"),
8274 : : RBINSLOT("__ror__", nb_or, slot_nb_or, "|"),
8275 : : UNSLOT("__int__", nb_int, slot_nb_int, wrap_unaryfunc,
8276 : : "int(self)"),
8277 : : UNSLOT("__float__", nb_float, slot_nb_float, wrap_unaryfunc,
8278 : : "float(self)"),
8279 : : IBSLOT("__iadd__", nb_inplace_add, slot_nb_inplace_add,
8280 : : wrap_binaryfunc, "+="),
8281 : : IBSLOT("__isub__", nb_inplace_subtract, slot_nb_inplace_subtract,
8282 : : wrap_binaryfunc, "-="),
8283 : : IBSLOT("__imul__", nb_inplace_multiply, slot_nb_inplace_multiply,
8284 : : wrap_binaryfunc, "*="),
8285 : : IBSLOT("__imod__", nb_inplace_remainder, slot_nb_inplace_remainder,
8286 : : wrap_binaryfunc, "%="),
8287 : : IBSLOT("__ipow__", nb_inplace_power, slot_nb_inplace_power,
8288 : : wrap_ternaryfunc, "**="),
8289 : : IBSLOT("__ilshift__", nb_inplace_lshift, slot_nb_inplace_lshift,
8290 : : wrap_binaryfunc, "<<="),
8291 : : IBSLOT("__irshift__", nb_inplace_rshift, slot_nb_inplace_rshift,
8292 : : wrap_binaryfunc, ">>="),
8293 : : IBSLOT("__iand__", nb_inplace_and, slot_nb_inplace_and,
8294 : : wrap_binaryfunc, "&="),
8295 : : IBSLOT("__ixor__", nb_inplace_xor, slot_nb_inplace_xor,
8296 : : wrap_binaryfunc, "^="),
8297 : : IBSLOT("__ior__", nb_inplace_or, slot_nb_inplace_or,
8298 : : wrap_binaryfunc, "|="),
8299 : : BINSLOT("__floordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
8300 : : RBINSLOT("__rfloordiv__", nb_floor_divide, slot_nb_floor_divide, "//"),
8301 : : BINSLOT("__truediv__", nb_true_divide, slot_nb_true_divide, "/"),
8302 : : RBINSLOT("__rtruediv__", nb_true_divide, slot_nb_true_divide, "/"),
8303 : : IBSLOT("__ifloordiv__", nb_inplace_floor_divide,
8304 : : slot_nb_inplace_floor_divide, wrap_binaryfunc, "//="),
8305 : : IBSLOT("__itruediv__", nb_inplace_true_divide,
8306 : : slot_nb_inplace_true_divide, wrap_binaryfunc, "/="),
8307 : : NBSLOT("__index__", nb_index, slot_nb_index, wrap_unaryfunc,
8308 : : "__index__($self, /)\n--\n\n"
8309 : : "Return self converted to an integer, if self is suitable "
8310 : : "for use as an index into a list."),
8311 : : BINSLOT("__matmul__", nb_matrix_multiply, slot_nb_matrix_multiply,
8312 : : "@"),
8313 : : RBINSLOT("__rmatmul__", nb_matrix_multiply, slot_nb_matrix_multiply,
8314 : : "@"),
8315 : : IBSLOT("__imatmul__", nb_inplace_matrix_multiply, slot_nb_inplace_matrix_multiply,
8316 : : wrap_binaryfunc, "@="),
8317 : : MPSLOT("__len__", mp_length, slot_mp_length, wrap_lenfunc,
8318 : : "__len__($self, /)\n--\n\nReturn len(self)."),
8319 : : MPSLOT("__getitem__", mp_subscript, slot_mp_subscript,
8320 : : wrap_binaryfunc,
8321 : : "__getitem__($self, key, /)\n--\n\nReturn self[key]."),
8322 : : MPSLOT("__setitem__", mp_ass_subscript, slot_mp_ass_subscript,
8323 : : wrap_objobjargproc,
8324 : : "__setitem__($self, key, value, /)\n--\n\nSet self[key] to value."),
8325 : : MPSLOT("__delitem__", mp_ass_subscript, slot_mp_ass_subscript,
8326 : : wrap_delitem,
8327 : : "__delitem__($self, key, /)\n--\n\nDelete self[key]."),
8328 : :
8329 : : SQSLOT("__len__", sq_length, slot_sq_length, wrap_lenfunc,
8330 : : "__len__($self, /)\n--\n\nReturn len(self)."),
8331 : : /* Heap types defining __add__/__mul__ have sq_concat/sq_repeat == NULL.
8332 : : The logic in abstract.c always falls back to nb_add/nb_multiply in
8333 : : this case. Defining both the nb_* and the sq_* slots to call the
8334 : : user-defined methods has unexpected side-effects, as shown by
8335 : : test_descr.notimplemented() */
8336 : : SQSLOT("__add__", sq_concat, NULL, wrap_binaryfunc,
8337 : : "__add__($self, value, /)\n--\n\nReturn self+value."),
8338 : : SQSLOT("__mul__", sq_repeat, NULL, wrap_indexargfunc,
8339 : : "__mul__($self, value, /)\n--\n\nReturn self*value."),
8340 : : SQSLOT("__rmul__", sq_repeat, NULL, wrap_indexargfunc,
8341 : : "__rmul__($self, value, /)\n--\n\nReturn value*self."),
8342 : : SQSLOT("__getitem__", sq_item, slot_sq_item, wrap_sq_item,
8343 : : "__getitem__($self, key, /)\n--\n\nReturn self[key]."),
8344 : : SQSLOT("__setitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_setitem,
8345 : : "__setitem__($self, key, value, /)\n--\n\nSet self[key] to value."),
8346 : : SQSLOT("__delitem__", sq_ass_item, slot_sq_ass_item, wrap_sq_delitem,
8347 : : "__delitem__($self, key, /)\n--\n\nDelete self[key]."),
8348 : : SQSLOT("__contains__", sq_contains, slot_sq_contains, wrap_objobjproc,
8349 : : "__contains__($self, key, /)\n--\n\nReturn key in self."),
8350 : : SQSLOT("__iadd__", sq_inplace_concat, NULL,
8351 : : wrap_binaryfunc,
8352 : : "__iadd__($self, value, /)\n--\n\nImplement self+=value."),
8353 : : SQSLOT("__imul__", sq_inplace_repeat, NULL,
8354 : : wrap_indexargfunc,
8355 : : "__imul__($self, value, /)\n--\n\nImplement self*=value."),
8356 : :
8357 : : {NULL}
8358 : : };
8359 : :
8360 : : /* Given a type pointer and an offset gotten from a slotdef entry, return a
8361 : : pointer to the actual slot. This is not quite the same as simply adding
8362 : : the offset to the type pointer, since it takes care to indirect through the
8363 : : proper indirection pointer (as_buffer, etc.); it returns NULL if the
8364 : : indirection pointer is NULL. */
8365 : : static void **
8366 : 280043802 : slotptr(PyTypeObject *type, int ioffset)
8367 : : {
8368 : : char *ptr;
8369 : 280043802 : long offset = ioffset;
8370 : :
8371 : : /* Note: this depends on the order of the members of PyHeapTypeObject! */
8372 : : assert(offset >= 0);
8373 : : assert((size_t)offset < offsetof(PyHeapTypeObject, as_buffer));
8374 [ + + ]: 280043802 : if ((size_t)offset >= offsetof(PyHeapTypeObject, as_sequence)) {
8375 : 30764281 : ptr = (char *)type->tp_as_sequence;
8376 : 30764281 : offset -= offsetof(PyHeapTypeObject, as_sequence);
8377 : : }
8378 [ + + ]: 249279521 : else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_mapping)) {
8379 : 11993000 : ptr = (char *)type->tp_as_mapping;
8380 : 11993000 : offset -= offsetof(PyHeapTypeObject, as_mapping);
8381 : : }
8382 [ + + ]: 237286521 : else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_number)) {
8383 : 142485066 : ptr = (char *)type->tp_as_number;
8384 : 142485066 : offset -= offsetof(PyHeapTypeObject, as_number);
8385 : : }
8386 [ + + ]: 94801455 : else if ((size_t)offset >= offsetof(PyHeapTypeObject, as_async)) {
8387 : 9678221 : ptr = (char *)type->tp_as_async;
8388 : 9678221 : offset -= offsetof(PyHeapTypeObject, as_async);
8389 : : }
8390 : : else {
8391 : 85123234 : ptr = (char *)type;
8392 : : }
8393 [ + + ]: 280043802 : if (ptr != NULL)
8394 : 240134308 : ptr += offset;
8395 : 280043802 : return (void **)ptr;
8396 : : }
8397 : :
8398 : : /* Length of array of slotdef pointers used to store slots with the
8399 : : same __name__. There should be at most MAX_EQUIV-1 slotdef entries with
8400 : : the same __name__, for any __name__. Since that's a static property, it is
8401 : : appropriate to declare fixed-size arrays for this. */
8402 : : #define MAX_EQUIV 10
8403 : :
8404 : : /* Return a slot pointer for a given name, but ONLY if the attribute has
8405 : : exactly one slot function. The name must be an interned string. */
8406 : : static void **
8407 : 19887518 : resolve_slotdups(PyTypeObject *type, PyObject *name)
8408 : : {
8409 : : /* XXX Maybe this could be optimized more -- but is it worth it? */
8410 : :
8411 : : /* pname and ptrs act as a little cache */
8412 : : static PyObject *pname;
8413 : : static slotdef *ptrs[MAX_EQUIV];
8414 : : slotdef *p, **pp;
8415 : : void **res, **ptr;
8416 : :
8417 [ + + ]: 19887518 : if (pname != name) {
8418 : : /* Collect all slotdefs that match name into ptrs. */
8419 : 19872649 : pname = name;
8420 : 19872649 : pp = ptrs;
8421 [ + + ]: 1848156357 : for (p = slotdefs; p->name_strobj; p++) {
8422 [ + + ]: 1828283708 : if (p->name_strobj == name)
8423 : 27943194 : *pp++ = p;
8424 : : }
8425 : 19872649 : *pp = NULL;
8426 : : }
8427 : :
8428 : : /* Look in all slots of the type matching the name. If exactly one of these
8429 : : has a filled-in slot, return a pointer to that slot.
8430 : : Otherwise, return NULL. */
8431 : 19887518 : res = NULL;
8432 [ + + ]: 47586153 : for (pp = ptrs; *pp; pp++) {
8433 : 27969402 : ptr = slotptr(type, (*pp)->offset);
8434 [ + - + + ]: 27969402 : if (ptr == NULL || *ptr == NULL)
8435 : 8203507 : continue;
8436 [ + + ]: 19765895 : if (res != NULL)
8437 : 270767 : return NULL;
8438 : 19495128 : res = ptr;
8439 : : }
8440 : 19616751 : return res;
8441 : : }
8442 : :
8443 : :
8444 : : /* Common code for update_slots_callback() and fixup_slot_dispatchers().
8445 : : *
8446 : : * This is meant to set a "slot" like type->tp_repr or
8447 : : * type->tp_as_sequence->sq_concat by looking up special methods like
8448 : : * __repr__ or __add__. The opposite (adding special methods from slots) is
8449 : : * done by add_operators(), called from PyType_Ready(). Since update_one_slot()
8450 : : * calls PyType_Ready() if needed, the special methods are already in place.
8451 : : *
8452 : : * The special methods corresponding to each slot are defined in the "slotdef"
8453 : : * array. Note that one slot may correspond to multiple special methods and vice
8454 : : * versa. For example, tp_richcompare uses 6 methods __lt__, ..., __ge__ and
8455 : : * tp_as_number->nb_add uses __add__ and __radd__. In the other direction,
8456 : : * __add__ is used by the number and sequence protocols and __getitem__ by the
8457 : : * sequence and mapping protocols. This causes a lot of complications.
8458 : : *
8459 : : * In detail, update_one_slot() does the following:
8460 : : *
8461 : : * First of all, if the slot in question does not exist, return immediately.
8462 : : * This can happen for example if it's tp_as_number->nb_add but tp_as_number
8463 : : * is NULL.
8464 : : *
8465 : : * For the given slot, we loop over all the special methods with a name
8466 : : * corresponding to that slot (for example, for tp_descr_set, this would be
8467 : : * __set__ and __delete__) and we look up these names in the MRO of the type.
8468 : : * If we don't find any special method, the slot is set to NULL (regardless of
8469 : : * what was in the slot before).
8470 : : *
8471 : : * Suppose that we find exactly one special method. If it's a wrapper_descriptor
8472 : : * (i.e. a special method calling a slot, for example str.__repr__ which calls
8473 : : * the tp_repr for the 'str' class) with the correct name ("__repr__" for
8474 : : * tp_repr), for the right class, calling the right wrapper C function (like
8475 : : * wrap_unaryfunc for tp_repr), then the slot is set to the slot that the
8476 : : * wrapper_descriptor originally wrapped. For example, a class inheriting
8477 : : * from 'str' and not redefining __repr__ will have tp_repr set to the tp_repr
8478 : : * of 'str'.
8479 : : * In all other cases where the special method exists, the slot is set to a
8480 : : * wrapper calling the special method. There is one exception: if the special
8481 : : * method is a wrapper_descriptor with the correct name but the type has
8482 : : * precisely one slot set for that name and that slot is not the one that we
8483 : : * are updating, then NULL is put in the slot (this exception is the only place
8484 : : * in update_one_slot() where the *existing* slots matter).
8485 : : *
8486 : : * When there are multiple special methods for the same slot, the above is
8487 : : * applied for each special method. As long as the results agree, the common
8488 : : * resulting slot is applied. If the results disagree, then a wrapper for
8489 : : * the special methods is installed. This is always safe, but less efficient
8490 : : * because it uses method lookup instead of direct C calls.
8491 : : *
8492 : : * There are some further special cases for specific slots, like supporting
8493 : : * __hash__ = None for tp_hash and special code for tp_new.
8494 : : *
8495 : : * When done, return a pointer to the next slotdef with a different offset,
8496 : : * because that's convenient for fixup_slot_dispatchers(). This function never
8497 : : * sets an exception: if an internal error happens (unlikely), it's ignored. */
8498 : : static slotdef *
8499 : 79620320 : update_one_slot(PyTypeObject *type, slotdef *p)
8500 : : {
8501 : : PyObject *descr;
8502 : : PyWrapperDescrObject *d;
8503 : 79620320 : void *generic = NULL, *specific = NULL;
8504 : 79620320 : int use_generic = 0;
8505 : 79620320 : int offset = p->offset;
8506 : : int error;
8507 : 79620320 : void **ptr = slotptr(type, offset);
8508 : :
8509 [ - + ]: 79620320 : if (ptr == NULL) {
8510 : : do {
8511 : 0 : ++p;
8512 [ # # ]: 0 : } while (p->offset == offset);
8513 : 0 : return p;
8514 : : }
8515 : : /* We may end up clearing live exceptions below, so make sure it's ours. */
8516 : : assert(!PyErr_Occurred());
8517 : : do {
8518 : : /* Use faster uncached lookup as we won't get any cache hits during type setup. */
8519 : 112883582 : descr = find_name_in_mro(type, p->name_strobj, &error);
8520 [ + + ]: 112883582 : if (descr == NULL) {
8521 [ - + ]: 88224098 : if (error == -1) {
8522 : : /* It is unlikely but not impossible that there has been an exception
8523 : : during lookup. Since this function originally expected no errors,
8524 : : we ignore them here in order to keep up the interface. */
8525 : 0 : PyErr_Clear();
8526 : : }
8527 [ + + ]: 88224098 : if (ptr == (void**)&type->tp_iternext) {
8528 : 1168934 : specific = (void *)_PyObject_NextNotImplemented;
8529 : : }
8530 : 88224098 : continue;
8531 : : }
8532 [ + + ]: 24659484 : if (Py_IS_TYPE(descr, &PyWrapperDescr_Type) &&
8533 [ + + ]: 39792406 : ((PyWrapperDescrObject *)descr)->d_base->name_strobj == p->name_strobj) {
8534 : 19887518 : void **tptr = resolve_slotdups(type, p->name_strobj);
8535 [ + + + + ]: 19887518 : if (tptr == NULL || tptr == ptr)
8536 : 15979246 : generic = p->function;
8537 : 19887518 : d = (PyWrapperDescrObject *)descr;
8538 [ + + + + ]: 19887518 : if ((specific == NULL || specific == d->d_wrapped) &&
8539 [ + + + + ]: 35804778 : d->d_base->wrapper == p->wrapper &&
8540 : 15919644 : PyType_IsSubtype(type, PyDescr_TYPE(d)))
8541 : : {
8542 : 15919643 : specific = d->d_wrapped;
8543 : : }
8544 : : else {
8545 : : /* We cannot use the specific slot function because either
8546 : : - it is not unique: there are multiple methods for this
8547 : : slot and they conflict
8548 : : - the signature is wrong (as checked by the ->wrapper
8549 : : comparison above)
8550 : : - it's wrapping the wrong class
8551 : : */
8552 : 3967875 : use_generic = 1;
8553 : : }
8554 : : }
8555 [ + + + + ]: 5859048 : else if (Py_IS_TYPE(descr, &PyCFunction_Type) &&
8556 : 1087082 : PyCFunction_GET_FUNCTION(descr) ==
8557 : 1086186 : _PyCFunction_CAST(tp_new_wrapper) &&
8558 [ + - ]: 1086186 : ptr == (void**)&type->tp_new)
8559 : : {
8560 : : /* The __new__ wrapper is not a wrapper descriptor,
8561 : : so must be special-cased differently.
8562 : : If we don't do this, creating an instance will
8563 : : always use slot_tp_new which will look up
8564 : : __new__ in the MRO which will call tp_new_wrapper
8565 : : which will look through the base classes looking
8566 : : for a static base and call its tp_new (usually
8567 : : PyType_GenericNew), after performing various
8568 : : sanity checks and constructing a new argument
8569 : : list. Cut all that nonsense short -- this speeds
8570 : : up instance creation tremendously. */
8571 : 1086186 : specific = (void *)type->tp_new;
8572 : : /* XXX I'm not 100% sure that there isn't a hole
8573 : : in this reasoning that requires additional
8574 : : sanity checks. I'll buy the first person to
8575 : : point out a bug in this reasoning a beer. */
8576 : : }
8577 [ + + ]: 3685780 : else if (descr == Py_None &&
8578 [ + + ]: 78067 : ptr == (void**)&type->tp_hash) {
8579 : : /* We specifically allow __hash__ to be set to None
8580 : : to prevent inheritance of the default
8581 : : implementation from object.__hash__ */
8582 : 69525 : specific = (void *)PyObject_HashNotImplemented;
8583 : : }
8584 : : else {
8585 : 3616255 : use_generic = 1;
8586 : 3616255 : generic = p->function;
8587 : : }
8588 [ + + ]: 112883582 : } while ((++p)->offset == offset);
8589 [ + + + + ]: 79620320 : if (specific && !use_generic)
8590 : 10510964 : *ptr = specific;
8591 : : else
8592 : 69109356 : *ptr = generic;
8593 : 79620320 : return p;
8594 : : }
8595 : :
8596 : : /* In the type, update the slots whose slotdefs are gathered in the pp array.
8597 : : This is a callback for update_subclasses(). */
8598 : : static int
8599 : 479372 : update_slots_callback(PyTypeObject *type, void *data)
8600 : : {
8601 : 479372 : slotdef **pp = (slotdef **)data;
8602 [ + + ]: 1022447 : for (; *pp; pp++) {
8603 : 543075 : update_one_slot(type, *pp);
8604 : : }
8605 : 479372 : return 0;
8606 : : }
8607 : :
8608 : : static int slotdefs_initialized = 0;
8609 : : /* Initialize the slotdefs table by adding interned string objects for the
8610 : : names. */
8611 : : PyStatus
8612 : 2967 : _PyTypes_InitSlotDefs(void)
8613 : : {
8614 [ - + ]: 2967 : if (slotdefs_initialized) {
8615 : 0 : return _PyStatus_OK();
8616 : : }
8617 : :
8618 [ + + ]: 275931 : for (slotdef *p = slotdefs; p->name; p++) {
8619 : : /* Slots must be ordered by their offset in the PyHeapTypeObject. */
8620 : : assert(!p[1].name || p->offset <= p[1].offset);
8621 : : /* bpo-40521: Interned strings are shared by all subinterpreters */
8622 : 272964 : p->name_strobj = PyUnicode_InternFromString(p->name);
8623 [ + - - + ]: 272964 : if (!p->name_strobj || !PyUnicode_CHECK_INTERNED(p->name_strobj)) {
8624 : 0 : return _PyStatus_NO_MEMORY();
8625 : : }
8626 : : }
8627 : 2967 : slotdefs_initialized = 1;
8628 : 2967 : return _PyStatus_OK();
8629 : : }
8630 : :
8631 : : /* Undo _PyTypes_InitSlotDefs(), releasing the interned strings. */
8632 : 2956 : static void clear_slotdefs(void)
8633 : : {
8634 [ + + ]: 274908 : for (slotdef *p = slotdefs; p->name; p++) {
8635 [ + - ]: 271952 : Py_CLEAR(p->name_strobj);
8636 : : }
8637 : 2956 : slotdefs_initialized = 0;
8638 : 2956 : }
8639 : :
8640 : : /* Update the slots after assignment to a class (type) attribute. */
8641 : : static int
8642 : 878788 : update_slot(PyTypeObject *type, PyObject *name)
8643 : : {
8644 : : slotdef *ptrs[MAX_EQUIV];
8645 : : slotdef *p;
8646 : : slotdef **pp;
8647 : : int offset;
8648 : :
8649 : : assert(PyUnicode_CheckExact(name));
8650 : : assert(PyUnicode_CHECK_INTERNED(name));
8651 : :
8652 : : assert(slotdefs_initialized);
8653 : 878788 : pp = ptrs;
8654 [ + + ]: 81727284 : for (p = slotdefs; p->name; p++) {
8655 : : assert(PyUnicode_CheckExact(p->name_strobj));
8656 : : assert(PyUnicode_CheckExact(name));
8657 : : /* bpo-40521: Using interned strings. */
8658 [ + + ]: 80848496 : if (p->name_strobj == name) {
8659 : 539049 : *pp++ = p;
8660 : : }
8661 : : }
8662 : 878788 : *pp = NULL;
8663 [ + + ]: 1417837 : for (pp = ptrs; *pp; pp++) {
8664 : 539049 : p = *pp;
8665 : 539049 : offset = p->offset;
8666 [ + + + + ]: 746005 : while (p > slotdefs && (p-1)->offset == offset)
8667 : 206956 : --p;
8668 : 539049 : *pp = p;
8669 : : }
8670 [ + + ]: 878788 : if (ptrs[0] == NULL)
8671 : 402550 : return 0; /* Not an attribute that affects any slots */
8672 : 476238 : return update_subclasses(type, name,
8673 : : update_slots_callback, (void *)ptrs);
8674 : : }
8675 : :
8676 : : /* Store the proper functions in the slot dispatches at class (type)
8677 : : definition time, based upon which operations the class overrides in its
8678 : : dict. */
8679 : : static void
8680 : 1216573 : fixup_slot_dispatchers(PyTypeObject *type)
8681 : : {
8682 : : assert(!PyErr_Occurred());
8683 : : assert(slotdefs_initialized);
8684 [ + + ]: 80293818 : for (slotdef *p = slotdefs; p->name; ) {
8685 : 79077245 : p = update_one_slot(type, p);
8686 : : }
8687 : 1216573 : }
8688 : :
8689 : : static void
8690 : 675 : update_all_slots(PyTypeObject* type)
8691 : : {
8692 : : slotdef *p;
8693 : :
8694 : : /* Clear the VALID_VERSION flag of 'type' and all its subclasses. */
8695 : 675 : PyType_Modified(type);
8696 : :
8697 : : assert(slotdefs_initialized);
8698 [ + + ]: 62775 : for (p = slotdefs; p->name; p++) {
8699 : : /* update_slot returns int but can't actually fail */
8700 : 62100 : update_slot(type, p->name_strobj);
8701 : : }
8702 : 675 : }
8703 : :
8704 : :
8705 : : /* Call __set_name__ on all attributes (including descriptors)
8706 : : in a newly generated type */
8707 : : static int
8708 : 1216573 : type_new_set_names(PyTypeObject *type)
8709 : : {
8710 : 1216573 : PyObject *names_to_set = PyDict_Copy(type->tp_dict);
8711 [ - + ]: 1216573 : if (names_to_set == NULL) {
8712 : 0 : return -1;
8713 : : }
8714 : :
8715 : 1216573 : Py_ssize_t i = 0;
8716 : : PyObject *key, *value;
8717 [ + + ]: 11748400 : while (PyDict_Next(names_to_set, &i, &key, &value)) {
8718 : 10531839 : PyObject *set_name = _PyObject_LookupSpecial(value,
8719 : : &_Py_ID(__set_name__));
8720 [ + + ]: 10531839 : if (set_name == NULL) {
8721 [ - + ]: 10332326 : if (PyErr_Occurred()) {
8722 : 0 : goto error;
8723 : : }
8724 : 10332326 : continue;
8725 : : }
8726 : :
8727 : 199513 : PyObject *res = PyObject_CallFunctionObjArgs(set_name, type, key, NULL);
8728 : 199513 : Py_DECREF(set_name);
8729 : :
8730 [ + + ]: 199513 : if (res == NULL) {
8731 : 12 : _PyErr_FormatFromCause(PyExc_RuntimeError,
8732 : : "Error calling __set_name__ on '%.100s' instance %R "
8733 : : "in '%.100s'",
8734 : 12 : Py_TYPE(value)->tp_name, key, type->tp_name);
8735 : 12 : goto error;
8736 : : }
8737 : 199501 : Py_DECREF(res);
8738 : : }
8739 : :
8740 : 1216561 : Py_DECREF(names_to_set);
8741 : 1216561 : return 0;
8742 : :
8743 : 12 : error:
8744 : 12 : Py_DECREF(names_to_set);
8745 : 12 : return -1;
8746 : : }
8747 : :
8748 : :
8749 : : /* Call __init_subclass__ on the parent of a newly generated type */
8750 : : static int
8751 : 1216561 : type_new_init_subclass(PyTypeObject *type, PyObject *kwds)
8752 : : {
8753 : 1216561 : PyObject *args[2] = {(PyObject *)type, (PyObject *)type};
8754 : 1216561 : PyObject *super = _PyObject_FastCall((PyObject *)&PySuper_Type, args, 2);
8755 [ + + ]: 1216561 : if (super == NULL) {
8756 : 1 : return -1;
8757 : : }
8758 : :
8759 : 1216560 : PyObject *func = PyObject_GetAttr(super, &_Py_ID(__init_subclass__));
8760 : 1216560 : Py_DECREF(super);
8761 [ - + ]: 1216560 : if (func == NULL) {
8762 : 0 : return -1;
8763 : : }
8764 : :
8765 : 1216560 : PyObject *result = PyObject_VectorcallDict(func, NULL, 0, kwds);
8766 : 1216560 : Py_DECREF(func);
8767 [ + + ]: 1216560 : if (result == NULL) {
8768 : 43 : return -1;
8769 : : }
8770 : :
8771 : 1216517 : Py_DECREF(result);
8772 : 1216517 : return 0;
8773 : : }
8774 : :
8775 : :
8776 : : /* recurse_down_subclasses() and update_subclasses() are mutually
8777 : : recursive functions to call a callback for all subclasses,
8778 : : but refraining from recursing into subclasses that define 'attr_name'. */
8779 : :
8780 : : static int
8781 : 479372 : update_subclasses(PyTypeObject *type, PyObject *attr_name,
8782 : : update_callback callback, void *data)
8783 : : {
8784 [ - + ]: 479372 : if (callback(type, data) < 0) {
8785 : 0 : return -1;
8786 : : }
8787 : 479372 : return recurse_down_subclasses(type, attr_name, callback, data);
8788 : : }
8789 : :
8790 : : static int
8791 : 479372 : recurse_down_subclasses(PyTypeObject *type, PyObject *attr_name,
8792 : : update_callback callback, void *data)
8793 : : {
8794 : : // It is safe to use a borrowed reference because update_subclasses() is
8795 : : // only used with update_slots_callback() which doesn't modify
8796 : : // tp_subclasses.
8797 : 479372 : PyObject *subclasses = type->tp_subclasses; // borrowed ref
8798 [ + + ]: 479372 : if (subclasses == NULL) {
8799 : 477695 : return 0;
8800 : : }
8801 : : assert(PyDict_CheckExact(subclasses));
8802 : :
8803 : 1677 : Py_ssize_t i = 0;
8804 : : PyObject *ref;
8805 [ + + ]: 4831 : while (PyDict_Next(subclasses, &i, NULL, &ref)) {
8806 : : assert(PyWeakref_CheckRef(ref));
8807 : 3154 : PyObject *obj = PyWeakref_GET_OBJECT(ref);
8808 : : assert(obj != NULL);
8809 [ - + ]: 3154 : if (obj == Py_None) {
8810 : 0 : continue;
8811 : : }
8812 : 3154 : PyTypeObject *subclass = _PyType_CAST(obj);
8813 : :
8814 : : /* Avoid recursing down into unaffected classes */
8815 : 3154 : PyObject *dict = subclass->tp_dict;
8816 [ + - + - ]: 3154 : if (dict != NULL && PyDict_Check(dict)) {
8817 : 3154 : int r = PyDict_Contains(dict, attr_name);
8818 [ - + ]: 3154 : if (r < 0) {
8819 : 0 : return -1;
8820 : : }
8821 [ + + ]: 3154 : if (r > 0) {
8822 : 20 : continue;
8823 : : }
8824 : : }
8825 : :
8826 [ - + ]: 3134 : if (update_subclasses(subclass, attr_name, callback, data) < 0) {
8827 : 0 : return -1;
8828 : : }
8829 : : }
8830 : 1677 : return 0;
8831 : : }
8832 : :
8833 : : /* This function is called by PyType_Ready() to populate the type's
8834 : : dictionary with method descriptors for function slots. For each
8835 : : function slot (like tp_repr) that's defined in the type, one or more
8836 : : corresponding descriptors are added in the type's tp_dict dictionary
8837 : : under the appropriate name (like __repr__). Some function slots
8838 : : cause more than one descriptor to be added (for example, the nb_add
8839 : : slot adds both __add__ and __radd__ descriptors) and some function
8840 : : slots compete for the same descriptor (for example both sq_item and
8841 : : mp_subscript generate a __getitem__ descriptor).
8842 : :
8843 : : In the latter case, the first slotdef entry encountered wins. Since
8844 : : slotdef entries are sorted by the offset of the slot in the
8845 : : PyHeapTypeObject, this gives us some control over disambiguating
8846 : : between competing slots: the members of PyHeapTypeObject are listed
8847 : : from most general to least general, so the most general slot is
8848 : : preferred. In particular, because as_mapping comes before as_sequence,
8849 : : for a type that defines both mp_subscript and sq_item, mp_subscript
8850 : : wins.
8851 : :
8852 : : This only adds new descriptors and doesn't overwrite entries in
8853 : : tp_dict that were previously defined. The descriptors contain a
8854 : : reference to the C function they must call, so that it's safe if they
8855 : : are copied into a subtype's __dict__ and the subtype has a different
8856 : : C function in its slot -- calling the method defined by the
8857 : : descriptor will call the C function that was used to create it,
8858 : : rather than the C function present in the slot when it is called.
8859 : : (This is important because a subtype may have a C function in the
8860 : : slot that calls the method from the dictionary, and we want to avoid
8861 : : infinite recursion here.) */
8862 : :
8863 : : static int
8864 : 2005280 : add_operators(PyTypeObject *type)
8865 : : {
8866 : 2005280 : PyObject *dict = type->tp_dict;
8867 : : slotdef *p;
8868 : : PyObject *descr;
8869 : : void **ptr;
8870 : :
8871 : : assert(slotdefs_initialized);
8872 [ + + ]: 186491040 : for (p = slotdefs; p->name; p++) {
8873 [ + + ]: 184485760 : if (p->wrapper == NULL)
8874 : 12031680 : continue;
8875 : 172454080 : ptr = slotptr(type, p->offset);
8876 [ + + + + ]: 172454080 : if (!ptr || !*ptr)
8877 : 168924040 : continue;
8878 : 3530040 : int r = PyDict_Contains(dict, p->name_strobj);
8879 [ + + ]: 3530040 : if (r > 0)
8880 : 66177 : continue;
8881 [ - + ]: 3463863 : if (r < 0) {
8882 : 0 : return -1;
8883 : : }
8884 [ + + ]: 3463863 : if (*ptr == (void *)PyObject_HashNotImplemented) {
8885 : : /* Classes may prevent the inheritance of the tp_hash
8886 : : slot by storing PyObject_HashNotImplemented in it. Make it
8887 : : visible as a None value for the __hash__ attribute. */
8888 [ - + ]: 33516 : if (PyDict_SetItem(dict, p->name_strobj, Py_None) < 0)
8889 : 0 : return -1;
8890 : : }
8891 : : else {
8892 : 3430347 : descr = PyDescr_NewWrapper(type, p, *ptr);
8893 [ - + ]: 3430347 : if (descr == NULL)
8894 : 0 : return -1;
8895 [ - + ]: 3430347 : if (PyDict_SetItem(dict, p->name_strobj, descr) < 0) {
8896 : 0 : Py_DECREF(descr);
8897 : 0 : return -1;
8898 : : }
8899 : 3430347 : Py_DECREF(descr);
8900 : : }
8901 : : }
8902 : 2005280 : return 0;
8903 : : }
8904 : :
8905 : :
8906 : : /* Cooperative 'super' */
8907 : :
8908 : : typedef struct {
8909 : : PyObject_HEAD
8910 : : PyTypeObject *type;
8911 : : PyObject *obj;
8912 : : PyTypeObject *obj_type;
8913 : : } superobject;
8914 : :
8915 : : static PyMemberDef super_members[] = {
8916 : : {"__thisclass__", T_OBJECT, offsetof(superobject, type), READONLY,
8917 : : "the class invoking super()"},
8918 : : {"__self__", T_OBJECT, offsetof(superobject, obj), READONLY,
8919 : : "the instance invoking super(); may be None"},
8920 : : {"__self_class__", T_OBJECT, offsetof(superobject, obj_type), READONLY,
8921 : : "the type of the instance invoking super(); may be None"},
8922 : : {0}
8923 : : };
8924 : :
8925 : : static void
8926 : 12225416 : super_dealloc(PyObject *self)
8927 : : {
8928 : 12225416 : superobject *su = (superobject *)self;
8929 : :
8930 : 12225416 : _PyObject_GC_UNTRACK(self);
8931 : 12225416 : Py_XDECREF(su->obj);
8932 : 12225416 : Py_XDECREF(su->type);
8933 : 12225416 : Py_XDECREF(su->obj_type);
8934 : 12225416 : Py_TYPE(self)->tp_free(self);
8935 : 12225416 : }
8936 : :
8937 : : static PyObject *
8938 : 0 : super_repr(PyObject *self)
8939 : : {
8940 : 0 : superobject *su = (superobject *)self;
8941 : :
8942 [ # # ]: 0 : if (su->obj_type)
8943 : 0 : return PyUnicode_FromFormat(
8944 : : "<super: <class '%s'>, <%s object>>",
8945 : 0 : su->type ? su->type->tp_name : "NULL",
8946 [ # # ]: 0 : su->obj_type->tp_name);
8947 : : else
8948 : 0 : return PyUnicode_FromFormat(
8949 : : "<super: <class '%s'>, NULL>",
8950 [ # # ]: 0 : su->type ? su->type->tp_name : "NULL");
8951 : : }
8952 : :
8953 : : static PyObject *
8954 : 12225536 : super_getattro(PyObject *self, PyObject *name)
8955 : : {
8956 : 12225536 : superobject *su = (superobject *)self;
8957 : : PyTypeObject *starttype;
8958 : : PyObject *mro;
8959 : : Py_ssize_t i, n;
8960 : :
8961 : 12225536 : starttype = su->obj_type;
8962 [ + + ]: 12225536 : if (starttype == NULL)
8963 : 2 : goto skip;
8964 : :
8965 : : /* We want __class__ to return the class of the super object
8966 : : (i.e. super, or a subclass), not the class of su->obj. */
8967 [ + - + + ]: 24451068 : if (PyUnicode_Check(name) &&
8968 [ + + ]: 12311164 : PyUnicode_GET_LENGTH(name) == 9 &&
8969 : 85630 : _PyUnicode_Equal(name, &_Py_ID(__class__)))
8970 : 1 : goto skip;
8971 : :
8972 : 12225533 : mro = starttype->tp_mro;
8973 [ + + ]: 12225533 : if (mro == NULL)
8974 : 1 : goto skip;
8975 : :
8976 : : assert(PyTuple_Check(mro));
8977 : 12225532 : n = PyTuple_GET_SIZE(mro);
8978 : :
8979 : : /* No need to check the last one: it's gonna be skipped anyway. */
8980 [ + + ]: 13869948 : for (i = 0; i+1 < n; i++) {
8981 [ + + ]: 13869947 : if ((PyObject *)(su->type) == PyTuple_GET_ITEM(mro, i))
8982 : 12225531 : break;
8983 : : }
8984 : 12225532 : i++; /* skip su->type (if any) */
8985 [ + + ]: 12225532 : if (i >= n)
8986 : 1 : goto skip;
8987 : :
8988 : : /* keep a strong reference to mro because starttype->tp_mro can be
8989 : : replaced during PyDict_GetItemWithError(dict, name) */
8990 : 12225531 : Py_INCREF(mro);
8991 : : do {
8992 : 19652161 : PyObject *obj = PyTuple_GET_ITEM(mro, i);
8993 : 19652161 : PyObject *dict = _PyType_CAST(obj)->tp_dict;
8994 : : assert(dict != NULL && PyDict_Check(dict));
8995 : :
8996 : 19652161 : PyObject *res = PyDict_GetItemWithError(dict, name);
8997 [ + + ]: 19652161 : if (res != NULL) {
8998 : 12225445 : Py_INCREF(res);
8999 : :
9000 : 12225445 : descrgetfunc f = Py_TYPE(res)->tp_descr_get;
9001 [ + + ]: 12225445 : if (f != NULL) {
9002 : : PyObject *res2;
9003 : 11104765 : res2 = f(res,
9004 : : /* Only pass 'obj' param if this is instance-mode super
9005 : : (See SF ID #743627) */
9006 [ + + ]: 11104765 : (su->obj == (PyObject *)starttype) ? NULL : su->obj,
9007 : : (PyObject *)starttype);
9008 : 11104765 : Py_DECREF(res);
9009 : 11104765 : res = res2;
9010 : : }
9011 : :
9012 : 12225445 : Py_DECREF(mro);
9013 : 12225445 : return res;
9014 : : }
9015 [ - + ]: 7426716 : else if (PyErr_Occurred()) {
9016 : 0 : Py_DECREF(mro);
9017 : 0 : return NULL;
9018 : : }
9019 : :
9020 : 7426716 : i++;
9021 [ + + ]: 7426716 : } while (i < n);
9022 : 86 : Py_DECREF(mro);
9023 : :
9024 : 91 : skip:
9025 : 91 : return PyObject_GenericGetAttr(self, name);
9026 : : }
9027 : :
9028 : : static PyTypeObject *
9029 : 12226400 : supercheck(PyTypeObject *type, PyObject *obj)
9030 : : {
9031 : : /* Check that a super() call makes sense. Return a type object.
9032 : :
9033 : : obj can be a class, or an instance of one:
9034 : :
9035 : : - If it is a class, it must be a subclass of 'type'. This case is
9036 : : used for class methods; the return value is obj.
9037 : :
9038 : : - If it is an instance, it must be an instance of 'type'. This is
9039 : : the normal case; the return value is obj.__class__.
9040 : :
9041 : : But... when obj is an instance, we want to allow for the case where
9042 : : Py_TYPE(obj) is not a subclass of type, but obj.__class__ is!
9043 : : This will allow using super() with a proxy for obj.
9044 : : */
9045 : :
9046 : : /* Check for first bullet above (special case) */
9047 [ + + + + ]: 12226400 : if (PyType_Check(obj) && PyType_IsSubtype((PyTypeObject *)obj, type)) {
9048 : 2359529 : Py_INCREF(obj);
9049 : 2359529 : return (PyTypeObject *)obj;
9050 : : }
9051 : :
9052 : : /* Normal case */
9053 [ + + ]: 9866871 : if (PyType_IsSubtype(Py_TYPE(obj), type)) {
9054 : 9866864 : Py_INCREF(Py_TYPE(obj));
9055 : 9866864 : return Py_TYPE(obj);
9056 : : }
9057 : : else {
9058 : : /* Try the slow way */
9059 : : PyObject *class_attr;
9060 : :
9061 [ - + ]: 7 : if (_PyObject_LookupAttr(obj, &_Py_ID(__class__), &class_attr) < 0) {
9062 : 1 : return NULL;
9063 : : }
9064 [ + - + - ]: 14 : if (class_attr != NULL &&
9065 : 7 : PyType_Check(class_attr) &&
9066 [ + + ]: 7 : (PyTypeObject *)class_attr != Py_TYPE(obj))
9067 : : {
9068 : 1 : int ok = PyType_IsSubtype(
9069 : : (PyTypeObject *)class_attr, type);
9070 [ + - ]: 1 : if (ok) {
9071 : 1 : return (PyTypeObject *)class_attr;
9072 : : }
9073 : : }
9074 : 6 : Py_XDECREF(class_attr);
9075 : : }
9076 : :
9077 : 6 : PyErr_SetString(PyExc_TypeError,
9078 : : "super(type, obj): "
9079 : : "obj must be an instance or subtype of type");
9080 : 6 : return NULL;
9081 : : }
9082 : :
9083 : : static PyObject *
9084 : 16 : super_descr_get(PyObject *self, PyObject *obj, PyObject *type)
9085 : : {
9086 : 16 : superobject *su = (superobject *)self;
9087 : : superobject *newobj;
9088 : :
9089 [ + - + - : 16 : if (obj == NULL || obj == Py_None || su->obj != NULL) {
- + ]
9090 : : /* Not binding to an object, or already bound */
9091 : 0 : Py_INCREF(self);
9092 : 0 : return self;
9093 : : }
9094 [ + + ]: 16 : if (!Py_IS_TYPE(su, &PySuper_Type))
9095 : : /* If su is an instance of a (strict) subclass of super,
9096 : : call its type */
9097 : 1 : return PyObject_CallFunctionObjArgs((PyObject *)Py_TYPE(su),
9098 : : su->type, obj, NULL);
9099 : : else {
9100 : : /* Inline the common case */
9101 : 15 : PyTypeObject *obj_type = supercheck(su->type, obj);
9102 [ + + ]: 15 : if (obj_type == NULL)
9103 : 2 : return NULL;
9104 : 13 : newobj = (superobject *)PySuper_Type.tp_new(&PySuper_Type,
9105 : : NULL, NULL);
9106 [ - + ]: 13 : if (newobj == NULL)
9107 : 0 : return NULL;
9108 : 13 : Py_INCREF(su->type);
9109 : 13 : Py_INCREF(obj);
9110 : 13 : newobj->type = su->type;
9111 : 13 : newobj->obj = obj;
9112 : 13 : newobj->obj_type = obj_type;
9113 : 13 : return (PyObject *)newobj;
9114 : : }
9115 : : }
9116 : :
9117 : : static int
9118 : 9543163 : super_init_without_args(_PyInterpreterFrame *cframe, PyCodeObject *co,
9119 : : PyTypeObject **type_p, PyObject **obj_p)
9120 : : {
9121 [ + + ]: 9543163 : if (co->co_argcount == 0) {
9122 : 1 : PyErr_SetString(PyExc_RuntimeError,
9123 : : "super(): no arguments");
9124 : 1 : return -1;
9125 : : }
9126 : :
9127 : : assert(cframe->f_code->co_nlocalsplus > 0);
9128 : 9543162 : PyObject *firstarg = _PyFrame_GetLocalsArray(cframe)[0];
9129 : : // The first argument might be a cell.
9130 [ + + + + ]: 9543162 : if (firstarg != NULL && (_PyLocals_GetKind(co->co_localspluskinds, 0) & CO_FAST_CELL)) {
9131 : : // "firstarg" is a cell here unless (very unlikely) super()
9132 : : // was called from the C-API before the first MAKE_CELL op.
9133 [ + - ]: 8538 : if (_PyInterpreterFrame_LASTI(cframe) >= 0) {
9134 : : // MAKE_CELL and COPY_FREE_VARS have no quickened forms, so no need
9135 : : // to use _PyOpcode_Deopt here:
9136 : : assert(_Py_OPCODE(_PyCode_CODE(co)[0]) == MAKE_CELL ||
9137 : : _Py_OPCODE(_PyCode_CODE(co)[0]) == COPY_FREE_VARS);
9138 : : assert(PyCell_Check(firstarg));
9139 : 8538 : firstarg = PyCell_GET(firstarg);
9140 : : }
9141 : : }
9142 [ + + ]: 9543162 : if (firstarg == NULL) {
9143 : 1 : PyErr_SetString(PyExc_RuntimeError,
9144 : : "super(): arg[0] deleted");
9145 : 1 : return -1;
9146 : : }
9147 : :
9148 : : // Look for __class__ in the free vars.
9149 : 9543161 : PyTypeObject *type = NULL;
9150 : 9543161 : int i = co->co_nlocals + co->co_nplaincellvars;
9151 [ + - ]: 9543168 : for (; i < co->co_nlocalsplus; i++) {
9152 : : assert((_PyLocals_GetKind(co->co_localspluskinds, i) & CO_FAST_FREE) != 0);
9153 : 9543168 : PyObject *name = PyTuple_GET_ITEM(co->co_localsplusnames, i);
9154 : : assert(PyUnicode_Check(name));
9155 [ + + ]: 9543168 : if (_PyUnicode_Equal(name, &_Py_ID(__class__))) {
9156 : 9543161 : PyObject *cell = _PyFrame_GetLocalsArray(cframe)[i];
9157 [ + - - + ]: 9543161 : if (cell == NULL || !PyCell_Check(cell)) {
9158 : 0 : PyErr_SetString(PyExc_RuntimeError,
9159 : : "super(): bad __class__ cell");
9160 : 0 : return -1;
9161 : : }
9162 : 9543161 : type = (PyTypeObject *) PyCell_GET(cell);
9163 [ + + ]: 9543161 : if (type == NULL) {
9164 : 1 : PyErr_SetString(PyExc_RuntimeError,
9165 : : "super(): empty __class__ cell");
9166 : 1 : return -1;
9167 : : }
9168 [ - + ]: 9543160 : if (!PyType_Check(type)) {
9169 : 0 : PyErr_Format(PyExc_RuntimeError,
9170 : : "super(): __class__ is not a type (%s)",
9171 : 0 : Py_TYPE(type)->tp_name);
9172 : 0 : return -1;
9173 : : }
9174 : 9543160 : break;
9175 : : }
9176 : : }
9177 [ - + ]: 9543160 : if (type == NULL) {
9178 : 0 : PyErr_SetString(PyExc_RuntimeError,
9179 : : "super(): __class__ cell not found");
9180 : 0 : return -1;
9181 : : }
9182 : :
9183 : 9543160 : *type_p = type;
9184 : 9543160 : *obj_p = firstarg;
9185 : 9543160 : return 0;
9186 : : }
9187 : :
9188 : : static int super_init_impl(PyObject *self, PyTypeObject *type, PyObject *obj);
9189 : :
9190 : : static int
9191 : 1004 : super_init(PyObject *self, PyObject *args, PyObject *kwds)
9192 : : {
9193 : 1004 : PyTypeObject *type = NULL;
9194 : 1004 : PyObject *obj = NULL;
9195 : :
9196 [ - + - - ]: 1004 : if (!_PyArg_NoKeywords("super", kwds))
9197 : 0 : return -1;
9198 [ - + ]: 1004 : if (!PyArg_ParseTuple(args, "|O!O:super", &PyType_Type, &type, &obj))
9199 : 0 : return -1;
9200 [ - + ]: 1004 : if (super_init_impl(self, type, obj) < 0) {
9201 : 0 : return -1;
9202 : : }
9203 : 1004 : return 0;
9204 : : }
9205 : :
9206 : : static inline int
9207 : 12226402 : super_init_impl(PyObject *self, PyTypeObject *type, PyObject *obj) {
9208 : 12226402 : superobject *su = (superobject *)self;
9209 : 12226402 : PyTypeObject *obj_type = NULL;
9210 [ + + ]: 12226402 : if (type == NULL) {
9211 : : /* Call super(), without args -- fill in from __class__
9212 : : and first local variable on the stack. */
9213 : 9543163 : PyThreadState *tstate = _PyThreadState_GET();
9214 : 9543163 : _PyInterpreterFrame *cframe = tstate->cframe->current_frame;
9215 [ - + ]: 9543163 : if (cframe == NULL) {
9216 : 0 : PyErr_SetString(PyExc_RuntimeError,
9217 : : "super(): no current frame");
9218 : 0 : return -1;
9219 : : }
9220 : 9543163 : int res = super_init_without_args(cframe, cframe->f_code, &type, &obj);
9221 : :
9222 [ + + ]: 9543163 : if (res < 0) {
9223 : 3 : return -1;
9224 : : }
9225 : : }
9226 : :
9227 [ - + ]: 12226399 : if (obj == Py_None)
9228 : 0 : obj = NULL;
9229 [ + + ]: 12226399 : if (obj != NULL) {
9230 : 12226385 : obj_type = supercheck(type, obj);
9231 [ + + ]: 12226385 : if (obj_type == NULL)
9232 : 4 : return -1;
9233 : 12226381 : Py_INCREF(obj);
9234 : : }
9235 : 12226395 : Py_INCREF(type);
9236 : 12226395 : Py_XSETREF(su->type, type);
9237 : 12226395 : Py_XSETREF(su->obj, obj);
9238 : 12226395 : Py_XSETREF(su->obj_type, obj_type);
9239 : 12226395 : return 0;
9240 : : }
9241 : :
9242 : : PyDoc_STRVAR(super_doc,
9243 : : "super() -> same as super(__class__, <first argument>)\n"
9244 : : "super(type) -> unbound super object\n"
9245 : : "super(type, obj) -> bound super object; requires isinstance(obj, type)\n"
9246 : : "super(type, type2) -> bound super object; requires issubclass(type2, type)\n"
9247 : : "Typical use to call a cooperative superclass method:\n"
9248 : : "class C(B):\n"
9249 : : " def meth(self, arg):\n"
9250 : : " super().meth(arg)\n"
9251 : : "This works for class methods too:\n"
9252 : : "class C(B):\n"
9253 : : " @classmethod\n"
9254 : : " def cmeth(cls, arg):\n"
9255 : : " super().cmeth(arg)\n");
9256 : :
9257 : : static int
9258 : 6500 : super_traverse(PyObject *self, visitproc visit, void *arg)
9259 : : {
9260 : 6500 : superobject *su = (superobject *)self;
9261 : :
9262 [ + + - + ]: 6500 : Py_VISIT(su->obj);
9263 [ + - - + ]: 6500 : Py_VISIT(su->type);
9264 [ + + - + ]: 6500 : Py_VISIT(su->obj_type);
9265 : :
9266 : 6500 : return 0;
9267 : : }
9268 : :
9269 : : static PyObject *
9270 : 12225401 : super_vectorcall(PyObject *self, PyObject *const *args,
9271 : : size_t nargsf, PyObject *kwnames)
9272 : : {
9273 : : assert(PyType_Check(self));
9274 [ + + + - ]: 12225401 : if (!_PyArg_NoKwnames("super", kwnames)) {
9275 : 1 : return NULL;
9276 : : }
9277 : 12225400 : Py_ssize_t nargs = PyVectorcall_NARGS(nargsf);
9278 [ + - + + : 12225400 : if (!_PyArg_CheckPositional("super()", nargs, 0, 2)) {
+ - ]
9279 : 1 : return NULL;
9280 : : }
9281 : 12225399 : PyTypeObject *type = NULL;
9282 : 12225399 : PyObject *obj = NULL;
9283 : 12225399 : PyTypeObject *self_type = (PyTypeObject *)self;
9284 : 12225399 : PyObject *su = self_type->tp_alloc(self_type, 0);
9285 [ - + ]: 12225399 : if (su == NULL) {
9286 : 0 : return NULL;
9287 : : }
9288 : : // 1 or 2 argument form super().
9289 [ + + ]: 12225399 : if (nargs != 0) {
9290 : 2682236 : PyObject *arg0 = args[0];
9291 [ + + ]: 2682236 : if (!PyType_Check(arg0)) {
9292 : 1 : PyErr_Format(PyExc_TypeError,
9293 : 1 : "super() argument 1 must be a type, not %.200s", Py_TYPE(arg0)->tp_name);
9294 : 1 : goto fail;
9295 : : }
9296 : 2682235 : type = (PyTypeObject *)arg0;
9297 : : }
9298 [ + + ]: 12225398 : if (nargs == 2) {
9299 : 2682222 : obj = args[1];
9300 : : }
9301 [ + + ]: 12225398 : if (super_init_impl(su, type, obj) < 0) {
9302 : 7 : goto fail;
9303 : : }
9304 : 12225391 : return su;
9305 : 8 : fail:
9306 : 8 : Py_DECREF(su);
9307 : 8 : return NULL;
9308 : : }
9309 : :
9310 : : PyTypeObject PySuper_Type = {
9311 : : PyVarObject_HEAD_INIT(&PyType_Type, 0)
9312 : : "super", /* tp_name */
9313 : : sizeof(superobject), /* tp_basicsize */
9314 : : 0, /* tp_itemsize */
9315 : : /* methods */
9316 : : super_dealloc, /* tp_dealloc */
9317 : : 0, /* tp_vectorcall_offset */
9318 : : 0, /* tp_getattr */
9319 : : 0, /* tp_setattr */
9320 : : 0, /* tp_as_async */
9321 : : super_repr, /* tp_repr */
9322 : : 0, /* tp_as_number */
9323 : : 0, /* tp_as_sequence */
9324 : : 0, /* tp_as_mapping */
9325 : : 0, /* tp_hash */
9326 : : 0, /* tp_call */
9327 : : 0, /* tp_str */
9328 : : super_getattro, /* tp_getattro */
9329 : : 0, /* tp_setattro */
9330 : : 0, /* tp_as_buffer */
9331 : : Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |
9332 : : Py_TPFLAGS_BASETYPE, /* tp_flags */
9333 : : super_doc, /* tp_doc */
9334 : : super_traverse, /* tp_traverse */
9335 : : 0, /* tp_clear */
9336 : : 0, /* tp_richcompare */
9337 : : 0, /* tp_weaklistoffset */
9338 : : 0, /* tp_iter */
9339 : : 0, /* tp_iternext */
9340 : : 0, /* tp_methods */
9341 : : super_members, /* tp_members */
9342 : : 0, /* tp_getset */
9343 : : 0, /* tp_base */
9344 : : 0, /* tp_dict */
9345 : : super_descr_get, /* tp_descr_get */
9346 : : 0, /* tp_descr_set */
9347 : : 0, /* tp_dictoffset */
9348 : : super_init, /* tp_init */
9349 : : PyType_GenericAlloc, /* tp_alloc */
9350 : : PyType_GenericNew, /* tp_new */
9351 : : PyObject_GC_Del, /* tp_free */
9352 : : .tp_vectorcall = (vectorcallfunc)super_vectorcall,
9353 : : };
|