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