1/* Dictionary object implementation using a hash table */ 2 3/* The distribution includes a separate file, Objects/dictnotes.txt, 4 describing explorations into dictionary design and optimization. 5 It covers typical dictionary use patterns, the parameters for 6 tuning dictionaries, and several ideas for possible optimizations. 7*/ 8 9/* PyDictKeysObject 10 11This implements the dictionary's hashtable. 12 13As of Python 3.6, this is compact and ordered. Basic idea is described here: 14* https://mail.python.org/pipermail/python-dev/2012-December/123028.html 15* https://morepypy.blogspot.com/2015/01/faster-more-memory-efficient-and-more.html 16 17layout: 18 19+---------------------+ 20| dk_refcnt | 21| dk_log2_size | 22| dk_log2_index_bytes | 23| dk_kind | 24| dk_usable | 25| dk_nentries | 26+---------------------+ 27| dk_indices[] | 28| | 29+---------------------+ 30| dk_entries[] | 31| | 32+---------------------+ 33 34dk_indices is actual hashtable. It holds index in entries, or DKIX_EMPTY(-1) 35or DKIX_DUMMY(-2). 36Size of indices is dk_size. Type of each index in indices is vary on dk_size: 37 38* int8 for dk_size <= 128 39* int16 for 256 <= dk_size <= 2**15 40* int32 for 2**16 <= dk_size <= 2**31 41* int64 for 2**32 <= dk_size 42 43dk_entries is array of PyDictKeyEntry when dk_kind == DICT_KEYS_GENERAL or 44PyDictUnicodeEntry otherwise. Its length is USABLE_FRACTION(dk_size). 45 46NOTE: Since negative value is used for DKIX_EMPTY and DKIX_DUMMY, type of 47dk_indices entry is signed integer and int16 is used for table which 48dk_size == 256. 49*/ 50 51 52/* 53The DictObject can be in one of two forms. 54 55Either: 56 A combined table: 57 ma_values == NULL, dk_refcnt == 1. 58 Values are stored in the me_value field of the PyDictKeysObject. 59Or: 60 A split table: 61 ma_values != NULL, dk_refcnt >= 1 62 Values are stored in the ma_values array. 63 Only string (unicode) keys are allowed. 64 65There are four kinds of slots in the table (slot is index, and 66DK_ENTRIES(keys)[index] if index >= 0): 67 681. Unused. index == DKIX_EMPTY 69 Does not hold an active (key, value) pair now and never did. Unused can 70 transition to Active upon key insertion. This is each slot's initial state. 71 722. Active. index >= 0, me_key != NULL and me_value != NULL 73 Holds an active (key, value) pair. Active can transition to Dummy or 74 Pending upon key deletion (for combined and split tables respectively). 75 This is the only case in which me_value != NULL. 76 773. Dummy. index == DKIX_DUMMY (combined only) 78 Previously held an active (key, value) pair, but that was deleted and an 79 active pair has not yet overwritten the slot. Dummy can transition to 80 Active upon key insertion. Dummy slots cannot be made Unused again 81 else the probe sequence in case of collision would have no way to know 82 they were once active. 83 844. Pending. index >= 0, key != NULL, and value == NULL (split only) 85 Not yet inserted in split-table. 86*/ 87 88/* 89Preserving insertion order 90 91It's simple for combined table. Since dk_entries is mostly append only, we can 92get insertion order by just iterating dk_entries. 93 94One exception is .popitem(). It removes last item in dk_entries and decrement 95dk_nentries to achieve amortized O(1). Since there are DKIX_DUMMY remains in 96dk_indices, we can't increment dk_usable even though dk_nentries is 97decremented. 98 99To preserve the order in a split table, a bit vector is used to record the 100insertion order. When a key is inserted the bit vector is shifted up by 4 bits 101and the index of the key is stored in the low 4 bits. 102As a consequence of this, split keys have a maximum size of 16. 103*/ 104 105/* PyDict_MINSIZE is the starting size for any new dict. 106 * 8 allows dicts with no more than 5 active entries; experiments suggested 107 * this suffices for the majority of dicts (consisting mostly of usually-small 108 * dicts created to pass keyword arguments). 109 * Making this 8, rather than 4 reduces the number of resizes for most 110 * dictionaries, without any significant extra memory use. 111 */ 112#define PyDict_LOG_MINSIZE 3 113#define PyDict_MINSIZE 8 114 115#include "Python.h" 116#include "pycore_bitutils.h" // _Py_bit_length 117#include "pycore_call.h" // _PyObject_CallNoArgs() 118#include "pycore_code.h" // stats 119#include "pycore_dict.h" // PyDictKeysObject 120#include "pycore_gc.h" // _PyObject_GC_IS_TRACKED() 121#include "pycore_object.h" // _PyObject_GC_TRACK() 122#include "pycore_pyerrors.h" // _PyErr_Fetch() 123#include "pycore_pystate.h" // _PyThreadState_GET() 124#include "stringlib/eq.h" // unicode_eq() 125 126#include <stdbool.h> 127 128/*[clinic input] 129class dict "PyDictObject *" "&PyDict_Type" 130[clinic start generated code]*/ 131/*[clinic end generated code: output=da39a3ee5e6b4b0d input=f157a5a0ce9589d6]*/ 132 133 134/* 135To ensure the lookup algorithm terminates, there must be at least one Unused 136slot (NULL key) in the table. 137To avoid slowing down lookups on a near-full table, we resize the table when 138it's USABLE_FRACTION (currently two-thirds) full. 139*/ 140 141#define PERTURB_SHIFT 5 142 143/* 144Major subtleties ahead: Most hash schemes depend on having a "good" hash 145function, in the sense of simulating randomness. Python doesn't: its most 146important hash functions (for ints) are very regular in common 147cases: 148 149 >>>[hash(i) for i in range(4)] 150 [0, 1, 2, 3] 151 152This isn't necessarily bad! To the contrary, in a table of size 2**i, taking 153the low-order i bits as the initial table index is extremely fast, and there 154are no collisions at all for dicts indexed by a contiguous range of ints. So 155this gives better-than-random behavior in common cases, and that's very 156desirable. 157 158OTOH, when collisions occur, the tendency to fill contiguous slices of the 159hash table makes a good collision resolution strategy crucial. Taking only 160the last i bits of the hash code is also vulnerable: for example, consider 161the list [i << 16 for i in range(20000)] as a set of keys. Since ints are 162their own hash codes, and this fits in a dict of size 2**15, the last 15 bits 163 of every hash code are all 0: they *all* map to the same table index. 164 165But catering to unusual cases should not slow the usual ones, so we just take 166the last i bits anyway. It's up to collision resolution to do the rest. If 167we *usually* find the key we're looking for on the first try (and, it turns 168out, we usually do -- the table load factor is kept under 2/3, so the odds 169are solidly in our favor), then it makes best sense to keep the initial index 170computation dirt cheap. 171 172The first half of collision resolution is to visit table indices via this 173recurrence: 174 175 j = ((5*j) + 1) mod 2**i 176 177For any initial j in range(2**i), repeating that 2**i times generates each 178int in range(2**i) exactly once (see any text on random-number generation for 179proof). By itself, this doesn't help much: like linear probing (setting 180j += 1, or j -= 1, on each loop trip), it scans the table entries in a fixed 181order. This would be bad, except that's not the only thing we do, and it's 182actually *good* in the common cases where hash keys are consecutive. In an 183example that's really too small to make this entirely clear, for a table of 184size 2**3 the order of indices is: 185 186 0 -> 1 -> 6 -> 7 -> 4 -> 5 -> 2 -> 3 -> 0 [and here it's repeating] 187 188If two things come in at index 5, the first place we look after is index 2, 189not 6, so if another comes in at index 6 the collision at 5 didn't hurt it. 190Linear probing is deadly in this case because there the fixed probe order 191is the *same* as the order consecutive keys are likely to arrive. But it's 192extremely unlikely hash codes will follow a 5*j+1 recurrence by accident, 193and certain that consecutive hash codes do not. 194 195The other half of the strategy is to get the other bits of the hash code 196into play. This is done by initializing a (unsigned) vrbl "perturb" to the 197full hash code, and changing the recurrence to: 198 199 perturb >>= PERTURB_SHIFT; 200 j = (5*j) + 1 + perturb; 201 use j % 2**i as the next table index; 202 203Now the probe sequence depends (eventually) on every bit in the hash code, 204and the pseudo-scrambling property of recurring on 5*j+1 is more valuable, 205because it quickly magnifies small differences in the bits that didn't affect 206the initial index. Note that because perturb is unsigned, if the recurrence 207is executed often enough perturb eventually becomes and remains 0. At that 208point (very rarely reached) the recurrence is on (just) 5*j+1 again, and 209that's certain to find an empty slot eventually (since it generates every int 210in range(2**i), and we make sure there's always at least one empty slot). 211 212Selecting a good value for PERTURB_SHIFT is a balancing act. You want it 213small so that the high bits of the hash code continue to affect the probe 214sequence across iterations; but you want it large so that in really bad cases 215the high-order hash bits have an effect on early iterations. 5 was "the 216best" in minimizing total collisions across experiments Tim Peters ran (on 217both normal and pathological cases), but 4 and 6 weren't significantly worse. 218 219Historical: Reimer Behrends contributed the idea of using a polynomial-based 220approach, using repeated multiplication by x in GF(2**n) where an irreducible 221polynomial for each table size was chosen such that x was a primitive root. 222Christian Tismer later extended that to use division by x instead, as an 223efficient way to get the high bits of the hash code into play. This scheme 224also gave excellent collision statistics, but was more expensive: two 225if-tests were required inside the loop; computing "the next" index took about 226the same number of operations but without as much potential parallelism 227(e.g., computing 5*j can go on at the same time as computing 1+perturb in the 228above, and then shifting perturb can be done while the table index is being 229masked); and the PyDictObject struct required a member to hold the table's 230polynomial. In Tim's experiments the current scheme ran faster, produced 231equally good collision statistics, needed less code & used less memory. 232 233*/ 234 235static int dictresize(PyDictObject *mp, uint8_t log_newsize, int unicode); 236 237static PyObject* dict_iter(PyDictObject *dict); 238 239/*Global counter used to set ma_version_tag field of dictionary. 240 * It is incremented each time that a dictionary is created and each 241 * time that a dictionary is modified. */ 242uint64_t _pydict_global_version = 0; 243 244#include "clinic/dictobject.c.h" 245 246 247#if PyDict_MAXFREELIST > 0 248static struct _Py_dict_state * 249get_dict_state(void) 250{ 251 PyInterpreterState *interp = _PyInterpreterState_GET(); 252 return &interp->dict_state; 253} 254#endif 255 256 257void 258_PyDict_ClearFreeList(PyInterpreterState *interp) 259{ 260#if PyDict_MAXFREELIST > 0 261 struct _Py_dict_state *state = &interp->dict_state; 262 while (state->numfree) { 263 PyDictObject *op = state->free_list[--state->numfree]; 264 assert(PyDict_CheckExact(op)); 265 PyObject_GC_Del(op); 266 } 267 while (state->keys_numfree) { 268 PyObject_Free(state->keys_free_list[--state->keys_numfree]); 269 } 270#endif 271} 272 273 274void 275_PyDict_Fini(PyInterpreterState *interp) 276{ 277 _PyDict_ClearFreeList(interp); 278#if defined(Py_DEBUG) && PyDict_MAXFREELIST > 0 279 struct _Py_dict_state *state = &interp->dict_state; 280 state->numfree = -1; 281 state->keys_numfree = -1; 282#endif 283} 284 285static inline Py_hash_t 286unicode_get_hash(PyObject *o) 287{ 288 assert(PyUnicode_CheckExact(o)); 289 return _PyASCIIObject_CAST(o)->hash; 290} 291 292/* Print summary info about the state of the optimized allocator */ 293void 294_PyDict_DebugMallocStats(FILE *out) 295{ 296#if PyDict_MAXFREELIST > 0 297 struct _Py_dict_state *state = get_dict_state(); 298 _PyDebugAllocatorStats(out, "free PyDictObject", 299 state->numfree, sizeof(PyDictObject)); 300#endif 301} 302 303#define DK_MASK(dk) (DK_SIZE(dk)-1) 304 305static void free_keys_object(PyDictKeysObject *keys); 306 307static inline void 308dictkeys_incref(PyDictKeysObject *dk) 309{ 310#ifdef Py_REF_DEBUG 311 _Py_RefTotal++; 312#endif 313 dk->dk_refcnt++; 314} 315 316static inline void 317dictkeys_decref(PyDictKeysObject *dk) 318{ 319 assert(dk->dk_refcnt > 0); 320#ifdef Py_REF_DEBUG 321 _Py_RefTotal--; 322#endif 323 if (--dk->dk_refcnt == 0) { 324 free_keys_object(dk); 325 } 326} 327 328/* lookup indices. returns DKIX_EMPTY, DKIX_DUMMY, or ix >=0 */ 329static inline Py_ssize_t 330dictkeys_get_index(const PyDictKeysObject *keys, Py_ssize_t i) 331{ 332 int log2size = DK_LOG_SIZE(keys); 333 Py_ssize_t ix; 334 335 if (log2size < 8) { 336 const int8_t *indices = (const int8_t*)(keys->dk_indices); 337 ix = indices[i]; 338 } 339 else if (log2size < 16) { 340 const int16_t *indices = (const int16_t*)(keys->dk_indices); 341 ix = indices[i]; 342 } 343#if SIZEOF_VOID_P > 4 344 else if (log2size >= 32) { 345 const int64_t *indices = (const int64_t*)(keys->dk_indices); 346 ix = indices[i]; 347 } 348#endif 349 else { 350 const int32_t *indices = (const int32_t*)(keys->dk_indices); 351 ix = indices[i]; 352 } 353 assert(ix >= DKIX_DUMMY); 354 return ix; 355} 356 357/* write to indices. */ 358static inline void 359dictkeys_set_index(PyDictKeysObject *keys, Py_ssize_t i, Py_ssize_t ix) 360{ 361 int log2size = DK_LOG_SIZE(keys); 362 363 assert(ix >= DKIX_DUMMY); 364 assert(keys->dk_version == 0); 365 366 if (log2size < 8) { 367 int8_t *indices = (int8_t*)(keys->dk_indices); 368 assert(ix <= 0x7f); 369 indices[i] = (char)ix; 370 } 371 else if (log2size < 16) { 372 int16_t *indices = (int16_t*)(keys->dk_indices); 373 assert(ix <= 0x7fff); 374 indices[i] = (int16_t)ix; 375 } 376#if SIZEOF_VOID_P > 4 377 else if (log2size >= 32) { 378 int64_t *indices = (int64_t*)(keys->dk_indices); 379 indices[i] = ix; 380 } 381#endif 382 else { 383 int32_t *indices = (int32_t*)(keys->dk_indices); 384 assert(ix <= 0x7fffffff); 385 indices[i] = (int32_t)ix; 386 } 387} 388 389 390/* USABLE_FRACTION is the maximum dictionary load. 391 * Increasing this ratio makes dictionaries more dense resulting in more 392 * collisions. Decreasing it improves sparseness at the expense of spreading 393 * indices over more cache lines and at the cost of total memory consumed. 394 * 395 * USABLE_FRACTION must obey the following: 396 * (0 < USABLE_FRACTION(n) < n) for all n >= 2 397 * 398 * USABLE_FRACTION should be quick to calculate. 399 * Fractions around 1/2 to 2/3 seem to work well in practice. 400 */ 401#define USABLE_FRACTION(n) (((n) << 1)/3) 402 403/* Find the smallest dk_size >= minsize. */ 404static inline uint8_t 405calculate_log2_keysize(Py_ssize_t minsize) 406{ 407#if SIZEOF_LONG == SIZEOF_SIZE_T 408 minsize = (minsize | PyDict_MINSIZE) - 1; 409 return _Py_bit_length(minsize | (PyDict_MINSIZE-1)); 410#elif defined(_MSC_VER) 411 // On 64bit Windows, sizeof(long) == 4. 412 minsize = (minsize | PyDict_MINSIZE) - 1; 413 unsigned long msb; 414 _BitScanReverse64(&msb, (uint64_t)minsize); 415 return (uint8_t)(msb + 1); 416#else 417 uint8_t log2_size; 418 for (log2_size = PyDict_LOG_MINSIZE; 419 (((Py_ssize_t)1) << log2_size) < minsize; 420 log2_size++) 421 ; 422 return log2_size; 423#endif 424} 425 426/* estimate_keysize is reverse function of USABLE_FRACTION. 427 * 428 * This can be used to reserve enough size to insert n entries without 429 * resizing. 430 */ 431static inline uint8_t 432estimate_log2_keysize(Py_ssize_t n) 433{ 434 return calculate_log2_keysize((n*3 + 1) / 2); 435} 436 437 438/* GROWTH_RATE. Growth rate upon hitting maximum load. 439 * Currently set to used*3. 440 * This means that dicts double in size when growing without deletions, 441 * but have more head room when the number of deletions is on a par with the 442 * number of insertions. See also bpo-17563 and bpo-33205. 443 * 444 * GROWTH_RATE was set to used*4 up to version 3.2. 445 * GROWTH_RATE was set to used*2 in version 3.3.0 446 * GROWTH_RATE was set to used*2 + capacity/2 in 3.4.0-3.6.0. 447 */ 448#define GROWTH_RATE(d) ((d)->ma_used*3) 449 450/* This immutable, empty PyDictKeysObject is used for PyDict_Clear() 451 * (which cannot fail and thus can do no allocation). 452 */ 453static PyDictKeysObject empty_keys_struct = { 454 1, /* dk_refcnt */ 455 0, /* dk_log2_size */ 456 0, /* dk_log2_index_bytes */ 457 DICT_KEYS_UNICODE, /* dk_kind */ 458 1, /* dk_version */ 459 0, /* dk_usable (immutable) */ 460 0, /* dk_nentries */ 461 {DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, 462 DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY, DKIX_EMPTY}, /* dk_indices */ 463}; 464 465#define Py_EMPTY_KEYS &empty_keys_struct 466 467/* Uncomment to check the dict content in _PyDict_CheckConsistency() */ 468// #define DEBUG_PYDICT 469 470#ifdef DEBUG_PYDICT 471# define ASSERT_CONSISTENT(op) assert(_PyDict_CheckConsistency((PyObject *)(op), 1)) 472#else 473# define ASSERT_CONSISTENT(op) assert(_PyDict_CheckConsistency((PyObject *)(op), 0)) 474#endif 475 476static inline int 477get_index_from_order(PyDictObject *mp, Py_ssize_t i) 478{ 479 assert(mp->ma_used <= SHARED_KEYS_MAX_SIZE); 480 assert(i < (((char *)mp->ma_values)[-2])); 481 return ((char *)mp->ma_values)[-3-i]; 482} 483 484#ifdef DEBUG_PYDICT 485static void 486dump_entries(PyDictKeysObject *dk) 487{ 488 for (Py_ssize_t i = 0; i < dk->dk_nentries; i++) { 489 if (DK_IS_UNICODE(dk)) { 490 PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(dk)[i]; 491 printf("key=%p value=%p\n", ep->me_key, ep->me_value); 492 } 493 else { 494 PyDictKeyEntry *ep = &DK_ENTRIES(dk)[i]; 495 printf("key=%p hash=%lx value=%p\n", ep->me_key, ep->me_hash, ep->me_value); 496 } 497 } 498} 499#endif 500 501int 502_PyDict_CheckConsistency(PyObject *op, int check_content) 503{ 504#define CHECK(expr) \ 505 do { if (!(expr)) { _PyObject_ASSERT_FAILED_MSG(op, Py_STRINGIFY(expr)); } } while (0) 506 507 assert(op != NULL); 508 CHECK(PyDict_Check(op)); 509 PyDictObject *mp = (PyDictObject *)op; 510 511 PyDictKeysObject *keys = mp->ma_keys; 512 int splitted = _PyDict_HasSplitTable(mp); 513 Py_ssize_t usable = USABLE_FRACTION(DK_SIZE(keys)); 514 515 CHECK(0 <= mp->ma_used && mp->ma_used <= usable); 516 CHECK(0 <= keys->dk_usable && keys->dk_usable <= usable); 517 CHECK(0 <= keys->dk_nentries && keys->dk_nentries <= usable); 518 CHECK(keys->dk_usable + keys->dk_nentries <= usable); 519 520 if (!splitted) { 521 /* combined table */ 522 CHECK(keys->dk_kind != DICT_KEYS_SPLIT); 523 CHECK(keys->dk_refcnt == 1 || keys == Py_EMPTY_KEYS); 524 } 525 else { 526 CHECK(keys->dk_kind == DICT_KEYS_SPLIT); 527 CHECK(mp->ma_used <= SHARED_KEYS_MAX_SIZE); 528 } 529 530 if (check_content) { 531 for (Py_ssize_t i=0; i < DK_SIZE(keys); i++) { 532 Py_ssize_t ix = dictkeys_get_index(keys, i); 533 CHECK(DKIX_DUMMY <= ix && ix <= usable); 534 } 535 536 if (keys->dk_kind == DICT_KEYS_GENERAL) { 537 PyDictKeyEntry *entries = DK_ENTRIES(keys); 538 for (Py_ssize_t i=0; i < usable; i++) { 539 PyDictKeyEntry *entry = &entries[i]; 540 PyObject *key = entry->me_key; 541 542 if (key != NULL) { 543 /* test_dict fails if PyObject_Hash() is called again */ 544 CHECK(entry->me_hash != -1); 545 CHECK(entry->me_value != NULL); 546 547 if (PyUnicode_CheckExact(key)) { 548 Py_hash_t hash = unicode_get_hash(key); 549 CHECK(entry->me_hash == hash); 550 } 551 } 552 } 553 } 554 else { 555 PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys); 556 for (Py_ssize_t i=0; i < usable; i++) { 557 PyDictUnicodeEntry *entry = &entries[i]; 558 PyObject *key = entry->me_key; 559 560 if (key != NULL) { 561 CHECK(PyUnicode_CheckExact(key)); 562 Py_hash_t hash = unicode_get_hash(key); 563 CHECK(hash != -1); 564 if (!splitted) { 565 CHECK(entry->me_value != NULL); 566 } 567 } 568 569 if (splitted) { 570 CHECK(entry->me_value == NULL); 571 } 572 } 573 } 574 575 if (splitted) { 576 CHECK(mp->ma_used <= SHARED_KEYS_MAX_SIZE); 577 /* splitted table */ 578 int duplicate_check = 0; 579 for (Py_ssize_t i=0; i < mp->ma_used; i++) { 580 int index = get_index_from_order(mp, i); 581 CHECK((duplicate_check & (1<<index)) == 0); 582 duplicate_check |= (1<<index); 583 CHECK(mp->ma_values->values[index] != NULL); 584 } 585 } 586 } 587 return 1; 588 589#undef CHECK 590} 591 592 593static PyDictKeysObject* 594new_keys_object(uint8_t log2_size, bool unicode) 595{ 596 PyDictKeysObject *dk; 597 Py_ssize_t usable; 598 int log2_bytes; 599 size_t entry_size = unicode ? sizeof(PyDictUnicodeEntry) : sizeof(PyDictKeyEntry); 600 601 assert(log2_size >= PyDict_LOG_MINSIZE); 602 603 usable = USABLE_FRACTION((size_t)1<<log2_size); 604 if (log2_size < 8) { 605 log2_bytes = log2_size; 606 } 607 else if (log2_size < 16) { 608 log2_bytes = log2_size + 1; 609 } 610#if SIZEOF_VOID_P > 4 611 else if (log2_size >= 32) { 612 log2_bytes = log2_size + 3; 613 } 614#endif 615 else { 616 log2_bytes = log2_size + 2; 617 } 618 619#if PyDict_MAXFREELIST > 0 620 struct _Py_dict_state *state = get_dict_state(); 621#ifdef Py_DEBUG 622 // new_keys_object() must not be called after _PyDict_Fini() 623 assert(state->keys_numfree != -1); 624#endif 625 if (log2_size == PyDict_LOG_MINSIZE && unicode && state->keys_numfree > 0) { 626 dk = state->keys_free_list[--state->keys_numfree]; 627 OBJECT_STAT_INC(from_freelist); 628 } 629 else 630#endif 631 { 632 dk = PyObject_Malloc(sizeof(PyDictKeysObject) 633 + ((size_t)1 << log2_bytes) 634 + entry_size * usable); 635 if (dk == NULL) { 636 PyErr_NoMemory(); 637 return NULL; 638 } 639 } 640#ifdef Py_REF_DEBUG 641 _Py_RefTotal++; 642#endif 643 dk->dk_refcnt = 1; 644 dk->dk_log2_size = log2_size; 645 dk->dk_log2_index_bytes = log2_bytes; 646 dk->dk_kind = unicode ? DICT_KEYS_UNICODE : DICT_KEYS_GENERAL; 647 dk->dk_nentries = 0; 648 dk->dk_usable = usable; 649 dk->dk_version = 0; 650 memset(&dk->dk_indices[0], 0xff, ((size_t)1 << log2_bytes)); 651 memset(&dk->dk_indices[(size_t)1 << log2_bytes], 0, entry_size * usable); 652 return dk; 653} 654 655static void 656free_keys_object(PyDictKeysObject *keys) 657{ 658 assert(keys != Py_EMPTY_KEYS); 659 if (DK_IS_UNICODE(keys)) { 660 PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys); 661 Py_ssize_t i, n; 662 for (i = 0, n = keys->dk_nentries; i < n; i++) { 663 Py_XDECREF(entries[i].me_key); 664 Py_XDECREF(entries[i].me_value); 665 } 666 } 667 else { 668 PyDictKeyEntry *entries = DK_ENTRIES(keys); 669 Py_ssize_t i, n; 670 for (i = 0, n = keys->dk_nentries; i < n; i++) { 671 Py_XDECREF(entries[i].me_key); 672 Py_XDECREF(entries[i].me_value); 673 } 674 } 675#if PyDict_MAXFREELIST > 0 676 struct _Py_dict_state *state = get_dict_state(); 677#ifdef Py_DEBUG 678 // free_keys_object() must not be called after _PyDict_Fini() 679 assert(state->keys_numfree != -1); 680#endif 681 if (DK_LOG_SIZE(keys) == PyDict_LOG_MINSIZE 682 && state->keys_numfree < PyDict_MAXFREELIST 683 && DK_IS_UNICODE(keys)) { 684 state->keys_free_list[state->keys_numfree++] = keys; 685 OBJECT_STAT_INC(to_freelist); 686 return; 687 } 688#endif 689 PyObject_Free(keys); 690} 691 692static inline PyDictValues* 693new_values(Py_ssize_t size) 694{ 695 assert(size > 0); 696 size_t prefix_size = _Py_SIZE_ROUND_UP(size+2, sizeof(PyObject *)); 697 assert(prefix_size < 256); 698 size_t n = prefix_size + size * sizeof(PyObject *); 699 uint8_t *mem = PyMem_Malloc(n); 700 if (mem == NULL) { 701 return NULL; 702 } 703 assert(prefix_size % sizeof(PyObject *) == 0); 704 mem[prefix_size-1] = (uint8_t)prefix_size; 705 return (PyDictValues*)(mem + prefix_size); 706} 707 708static inline void 709free_values(PyDictValues *values) 710{ 711 int prefix_size = ((uint8_t *)values)[-1]; 712 PyMem_Free(((char *)values)-prefix_size); 713} 714 715/* Consumes a reference to the keys object */ 716static PyObject * 717new_dict(PyDictKeysObject *keys, PyDictValues *values, Py_ssize_t used, int free_values_on_failure) 718{ 719 PyDictObject *mp; 720 assert(keys != NULL); 721#if PyDict_MAXFREELIST > 0 722 struct _Py_dict_state *state = get_dict_state(); 723#ifdef Py_DEBUG 724 // new_dict() must not be called after _PyDict_Fini() 725 assert(state->numfree != -1); 726#endif 727 if (state->numfree) { 728 mp = state->free_list[--state->numfree]; 729 assert (mp != NULL); 730 assert (Py_IS_TYPE(mp, &PyDict_Type)); 731 OBJECT_STAT_INC(from_freelist); 732 _Py_NewReference((PyObject *)mp); 733 } 734 else 735#endif 736 { 737 mp = PyObject_GC_New(PyDictObject, &PyDict_Type); 738 if (mp == NULL) { 739 dictkeys_decref(keys); 740 if (free_values_on_failure) { 741 free_values(values); 742 } 743 return NULL; 744 } 745 } 746 mp->ma_keys = keys; 747 mp->ma_values = values; 748 mp->ma_used = used; 749 mp->ma_version_tag = DICT_NEXT_VERSION(); 750 ASSERT_CONSISTENT(mp); 751 return (PyObject *)mp; 752} 753 754static inline Py_ssize_t 755shared_keys_usable_size(PyDictKeysObject *keys) 756{ 757 return keys->dk_nentries + keys->dk_usable; 758} 759 760/* Consumes a reference to the keys object */ 761static PyObject * 762new_dict_with_shared_keys(PyDictKeysObject *keys) 763{ 764 PyDictValues *values; 765 Py_ssize_t i, size; 766 767 size = shared_keys_usable_size(keys); 768 values = new_values(size); 769 if (values == NULL) { 770 dictkeys_decref(keys); 771 return PyErr_NoMemory(); 772 } 773 ((char *)values)[-2] = 0; 774 for (i = 0; i < size; i++) { 775 values->values[i] = NULL; 776 } 777 return new_dict(keys, values, 0, 1); 778} 779 780 781static PyDictKeysObject * 782clone_combined_dict_keys(PyDictObject *orig) 783{ 784 assert(PyDict_Check(orig)); 785 assert(Py_TYPE(orig)->tp_iter == (getiterfunc)dict_iter); 786 assert(orig->ma_values == NULL); 787 assert(orig->ma_keys->dk_refcnt == 1); 788 789 Py_ssize_t keys_size = _PyDict_KeysSize(orig->ma_keys); 790 PyDictKeysObject *keys = PyObject_Malloc(keys_size); 791 if (keys == NULL) { 792 PyErr_NoMemory(); 793 return NULL; 794 } 795 796 memcpy(keys, orig->ma_keys, keys_size); 797 798 /* After copying key/value pairs, we need to incref all 799 keys and values and they are about to be co-owned by a 800 new dict object. */ 801 PyObject **pkey, **pvalue; 802 size_t offs; 803 if (DK_IS_UNICODE(orig->ma_keys)) { 804 PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(keys); 805 pkey = &ep0->me_key; 806 pvalue = &ep0->me_value; 807 offs = sizeof(PyDictUnicodeEntry) / sizeof(PyObject*); 808 } 809 else { 810 PyDictKeyEntry *ep0 = DK_ENTRIES(keys); 811 pkey = &ep0->me_key; 812 pvalue = &ep0->me_value; 813 offs = sizeof(PyDictKeyEntry) / sizeof(PyObject*); 814 } 815 816 Py_ssize_t n = keys->dk_nentries; 817 for (Py_ssize_t i = 0; i < n; i++) { 818 PyObject *value = *pvalue; 819 if (value != NULL) { 820 Py_INCREF(value); 821 Py_INCREF(*pkey); 822 } 823 pvalue += offs; 824 pkey += offs; 825 } 826 827 /* Since we copied the keys table we now have an extra reference 828 in the system. Manually call increment _Py_RefTotal to signal that 829 we have it now; calling dictkeys_incref would be an error as 830 keys->dk_refcnt is already set to 1 (after memcpy). */ 831#ifdef Py_REF_DEBUG 832 _Py_RefTotal++; 833#endif 834 return keys; 835} 836 837PyObject * 838PyDict_New(void) 839{ 840 dictkeys_incref(Py_EMPTY_KEYS); 841 return new_dict(Py_EMPTY_KEYS, NULL, 0, 0); 842} 843 844/* Search index of hash table from offset of entry table */ 845static Py_ssize_t 846lookdict_index(PyDictKeysObject *k, Py_hash_t hash, Py_ssize_t index) 847{ 848 size_t mask = DK_MASK(k); 849 size_t perturb = (size_t)hash; 850 size_t i = (size_t)hash & mask; 851 852 for (;;) { 853 Py_ssize_t ix = dictkeys_get_index(k, i); 854 if (ix == index) { 855 return i; 856 } 857 if (ix == DKIX_EMPTY) { 858 return DKIX_EMPTY; 859 } 860 perturb >>= PERTURB_SHIFT; 861 i = mask & (i*5 + perturb + 1); 862 } 863 Py_UNREACHABLE(); 864} 865 866// Search non-Unicode key from Unicode table 867static Py_ssize_t 868unicodekeys_lookup_generic(PyDictObject *mp, PyDictKeysObject* dk, PyObject *key, Py_hash_t hash) 869{ 870 PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(dk); 871 size_t mask = DK_MASK(dk); 872 size_t perturb = hash; 873 size_t i = (size_t)hash & mask; 874 Py_ssize_t ix; 875 for (;;) { 876 ix = dictkeys_get_index(dk, i); 877 if (ix >= 0) { 878 PyDictUnicodeEntry *ep = &ep0[ix]; 879 assert(ep->me_key != NULL); 880 assert(PyUnicode_CheckExact(ep->me_key)); 881 if (ep->me_key == key) { 882 return ix; 883 } 884 if (unicode_get_hash(ep->me_key) == hash) { 885 PyObject *startkey = ep->me_key; 886 Py_INCREF(startkey); 887 int cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); 888 Py_DECREF(startkey); 889 if (cmp < 0) { 890 return DKIX_ERROR; 891 } 892 if (dk == mp->ma_keys && ep->me_key == startkey) { 893 if (cmp > 0) { 894 return ix; 895 } 896 } 897 else { 898 /* The dict was mutated, restart */ 899 return DKIX_KEY_CHANGED; 900 } 901 } 902 } 903 else if (ix == DKIX_EMPTY) { 904 return DKIX_EMPTY; 905 } 906 perturb >>= PERTURB_SHIFT; 907 i = mask & (i*5 + perturb + 1); 908 } 909 Py_UNREACHABLE(); 910} 911 912// Search Unicode key from Unicode table. 913static Py_ssize_t _Py_HOT_FUNCTION 914unicodekeys_lookup_unicode(PyDictKeysObject* dk, PyObject *key, Py_hash_t hash) 915{ 916 PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(dk); 917 size_t mask = DK_MASK(dk); 918 size_t perturb = hash; 919 size_t i = (size_t)hash & mask; 920 Py_ssize_t ix; 921 for (;;) { 922 ix = dictkeys_get_index(dk, i); 923 if (ix >= 0) { 924 PyDictUnicodeEntry *ep = &ep0[ix]; 925 assert(ep->me_key != NULL); 926 assert(PyUnicode_CheckExact(ep->me_key)); 927 if (ep->me_key == key || 928 (unicode_get_hash(ep->me_key) == hash && unicode_eq(ep->me_key, key))) { 929 return ix; 930 } 931 } 932 else if (ix == DKIX_EMPTY) { 933 return DKIX_EMPTY; 934 } 935 perturb >>= PERTURB_SHIFT; 936 i = mask & (i*5 + perturb + 1); 937 ix = dictkeys_get_index(dk, i); 938 if (ix >= 0) { 939 PyDictUnicodeEntry *ep = &ep0[ix]; 940 assert(ep->me_key != NULL); 941 assert(PyUnicode_CheckExact(ep->me_key)); 942 if (ep->me_key == key || 943 (unicode_get_hash(ep->me_key) == hash && unicode_eq(ep->me_key, key))) { 944 return ix; 945 } 946 } 947 else if (ix == DKIX_EMPTY) { 948 return DKIX_EMPTY; 949 } 950 perturb >>= PERTURB_SHIFT; 951 i = mask & (i*5 + perturb + 1); 952 } 953 Py_UNREACHABLE(); 954} 955 956// Search key from Generic table. 957static Py_ssize_t 958dictkeys_generic_lookup(PyDictObject *mp, PyDictKeysObject* dk, PyObject *key, Py_hash_t hash) 959{ 960 PyDictKeyEntry *ep0 = DK_ENTRIES(dk); 961 size_t mask = DK_MASK(dk); 962 size_t perturb = hash; 963 size_t i = (size_t)hash & mask; 964 Py_ssize_t ix; 965 for (;;) { 966 ix = dictkeys_get_index(dk, i); 967 if (ix >= 0) { 968 PyDictKeyEntry *ep = &ep0[ix]; 969 assert(ep->me_key != NULL); 970 if (ep->me_key == key) { 971 return ix; 972 } 973 if (ep->me_hash == hash) { 974 PyObject *startkey = ep->me_key; 975 Py_INCREF(startkey); 976 int cmp = PyObject_RichCompareBool(startkey, key, Py_EQ); 977 Py_DECREF(startkey); 978 if (cmp < 0) { 979 return DKIX_ERROR; 980 } 981 if (dk == mp->ma_keys && ep->me_key == startkey) { 982 if (cmp > 0) { 983 return ix; 984 } 985 } 986 else { 987 /* The dict was mutated, restart */ 988 return DKIX_KEY_CHANGED; 989 } 990 } 991 } 992 else if (ix == DKIX_EMPTY) { 993 return DKIX_EMPTY; 994 } 995 perturb >>= PERTURB_SHIFT; 996 i = mask & (i*5 + perturb + 1); 997 } 998 Py_UNREACHABLE(); 999} 1000 1001/* Lookup a string in a (all unicode) dict keys. 1002 * Returns DKIX_ERROR if key is not a string, 1003 * or if the dict keys is not all strings. 1004 * If the keys is present then return the index of key. 1005 * If the key is not present then return DKIX_EMPTY. 1006 */ 1007Py_ssize_t 1008_PyDictKeys_StringLookup(PyDictKeysObject* dk, PyObject *key) 1009{ 1010 DictKeysKind kind = dk->dk_kind; 1011 if (!PyUnicode_CheckExact(key) || kind == DICT_KEYS_GENERAL) { 1012 return DKIX_ERROR; 1013 } 1014 Py_hash_t hash = unicode_get_hash(key); 1015 if (hash == -1) { 1016 hash = PyUnicode_Type.tp_hash(key); 1017 if (hash == -1) { 1018 PyErr_Clear(); 1019 return DKIX_ERROR; 1020 } 1021 } 1022 return unicodekeys_lookup_unicode(dk, key, hash); 1023} 1024 1025/* 1026The basic lookup function used by all operations. 1027This is based on Algorithm D from Knuth Vol. 3, Sec. 6.4. 1028Open addressing is preferred over chaining since the link overhead for 1029chaining would be substantial (100% with typical malloc overhead). 1030 1031The initial probe index is computed as hash mod the table size. Subsequent 1032probe indices are computed as explained earlier. 1033 1034All arithmetic on hash should ignore overflow. 1035 1036_Py_dict_lookup() is general-purpose, and may return DKIX_ERROR if (and only if) a 1037comparison raises an exception. 1038When the key isn't found a DKIX_EMPTY is returned. 1039*/ 1040Py_ssize_t 1041_Py_dict_lookup(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject **value_addr) 1042{ 1043 PyDictKeysObject *dk; 1044 DictKeysKind kind; 1045 Py_ssize_t ix; 1046 1047start: 1048 dk = mp->ma_keys; 1049 kind = dk->dk_kind; 1050 1051 if (kind != DICT_KEYS_GENERAL) { 1052 if (PyUnicode_CheckExact(key)) { 1053 ix = unicodekeys_lookup_unicode(dk, key, hash); 1054 } 1055 else { 1056 ix = unicodekeys_lookup_generic(mp, dk, key, hash); 1057 if (ix == DKIX_KEY_CHANGED) { 1058 goto start; 1059 } 1060 } 1061 1062 if (ix >= 0) { 1063 if (kind == DICT_KEYS_SPLIT) { 1064 *value_addr = mp->ma_values->values[ix]; 1065 } 1066 else { 1067 *value_addr = DK_UNICODE_ENTRIES(dk)[ix].me_value; 1068 } 1069 } 1070 else { 1071 *value_addr = NULL; 1072 } 1073 } 1074 else { 1075 ix = dictkeys_generic_lookup(mp, dk, key, hash); 1076 if (ix == DKIX_KEY_CHANGED) { 1077 goto start; 1078 } 1079 if (ix >= 0) { 1080 *value_addr = DK_ENTRIES(dk)[ix].me_value; 1081 } 1082 else { 1083 *value_addr = NULL; 1084 } 1085 } 1086 1087 return ix; 1088} 1089 1090int 1091_PyDict_HasOnlyStringKeys(PyObject *dict) 1092{ 1093 Py_ssize_t pos = 0; 1094 PyObject *key, *value; 1095 assert(PyDict_Check(dict)); 1096 /* Shortcut */ 1097 if (((PyDictObject *)dict)->ma_keys->dk_kind != DICT_KEYS_GENERAL) 1098 return 1; 1099 while (PyDict_Next(dict, &pos, &key, &value)) 1100 if (!PyUnicode_Check(key)) 1101 return 0; 1102 return 1; 1103} 1104 1105#define MAINTAIN_TRACKING(mp, key, value) \ 1106 do { \ 1107 if (!_PyObject_GC_IS_TRACKED(mp)) { \ 1108 if (_PyObject_GC_MAY_BE_TRACKED(key) || \ 1109 _PyObject_GC_MAY_BE_TRACKED(value)) { \ 1110 _PyObject_GC_TRACK(mp); \ 1111 } \ 1112 } \ 1113 } while(0) 1114 1115void 1116_PyDict_MaybeUntrack(PyObject *op) 1117{ 1118 PyDictObject *mp; 1119 PyObject *value; 1120 Py_ssize_t i, numentries; 1121 1122 if (!PyDict_CheckExact(op) || !_PyObject_GC_IS_TRACKED(op)) 1123 return; 1124 1125 mp = (PyDictObject *) op; 1126 numentries = mp->ma_keys->dk_nentries; 1127 if (_PyDict_HasSplitTable(mp)) { 1128 for (i = 0; i < numentries; i++) { 1129 if ((value = mp->ma_values->values[i]) == NULL) 1130 continue; 1131 if (_PyObject_GC_MAY_BE_TRACKED(value)) { 1132 return; 1133 } 1134 } 1135 } 1136 else { 1137 if (DK_IS_UNICODE(mp->ma_keys)) { 1138 PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(mp->ma_keys); 1139 for (i = 0; i < numentries; i++) { 1140 if ((value = ep0[i].me_value) == NULL) 1141 continue; 1142 if (_PyObject_GC_MAY_BE_TRACKED(value)) 1143 return; 1144 } 1145 } 1146 else { 1147 PyDictKeyEntry *ep0 = DK_ENTRIES(mp->ma_keys); 1148 for (i = 0; i < numentries; i++) { 1149 if ((value = ep0[i].me_value) == NULL) 1150 continue; 1151 if (_PyObject_GC_MAY_BE_TRACKED(value) || 1152 _PyObject_GC_MAY_BE_TRACKED(ep0[i].me_key)) 1153 return; 1154 } 1155 } 1156 } 1157 _PyObject_GC_UNTRACK(op); 1158} 1159 1160/* Internal function to find slot for an item from its hash 1161 when it is known that the key is not present in the dict. 1162 1163 The dict must be combined. */ 1164static Py_ssize_t 1165find_empty_slot(PyDictKeysObject *keys, Py_hash_t hash) 1166{ 1167 assert(keys != NULL); 1168 1169 const size_t mask = DK_MASK(keys); 1170 size_t i = hash & mask; 1171 Py_ssize_t ix = dictkeys_get_index(keys, i); 1172 for (size_t perturb = hash; ix >= 0;) { 1173 perturb >>= PERTURB_SHIFT; 1174 i = (i*5 + perturb + 1) & mask; 1175 ix = dictkeys_get_index(keys, i); 1176 } 1177 return i; 1178} 1179 1180static int 1181insertion_resize(PyDictObject *mp, int unicode) 1182{ 1183 return dictresize(mp, calculate_log2_keysize(GROWTH_RATE(mp)), unicode); 1184} 1185 1186static Py_ssize_t 1187insert_into_dictkeys(PyDictKeysObject *keys, PyObject *name) 1188{ 1189 assert(PyUnicode_CheckExact(name)); 1190 Py_hash_t hash = unicode_get_hash(name); 1191 if (hash == -1) { 1192 hash = PyUnicode_Type.tp_hash(name); 1193 if (hash == -1) { 1194 PyErr_Clear(); 1195 return DKIX_EMPTY; 1196 } 1197 } 1198 Py_ssize_t ix = unicodekeys_lookup_unicode(keys, name, hash); 1199 if (ix == DKIX_EMPTY) { 1200 if (keys->dk_usable <= 0) { 1201 return DKIX_EMPTY; 1202 } 1203 Py_INCREF(name); 1204 /* Insert into new slot. */ 1205 keys->dk_version = 0; 1206 Py_ssize_t hashpos = find_empty_slot(keys, hash); 1207 ix = keys->dk_nentries; 1208 PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(keys)[ix]; 1209 dictkeys_set_index(keys, hashpos, ix); 1210 assert(ep->me_key == NULL); 1211 ep->me_key = name; 1212 keys->dk_usable--; 1213 keys->dk_nentries++; 1214 } 1215 assert (ix < SHARED_KEYS_MAX_SIZE); 1216 return ix; 1217} 1218 1219/* 1220Internal routine to insert a new item into the table. 1221Used both by the internal resize routine and by the public insert routine. 1222Returns -1 if an error occurred, or 0 on success. 1223Consumes key and value references. 1224*/ 1225static int 1226insertdict(PyDictObject *mp, PyObject *key, Py_hash_t hash, PyObject *value) 1227{ 1228 PyObject *old_value; 1229 1230 if (DK_IS_UNICODE(mp->ma_keys) && !PyUnicode_CheckExact(key)) { 1231 if (insertion_resize(mp, 0) < 0) 1232 goto Fail; 1233 assert(mp->ma_keys->dk_kind == DICT_KEYS_GENERAL); 1234 } 1235 1236 Py_ssize_t ix = _Py_dict_lookup(mp, key, hash, &old_value); 1237 if (ix == DKIX_ERROR) 1238 goto Fail; 1239 1240 MAINTAIN_TRACKING(mp, key, value); 1241 1242 if (ix == DKIX_EMPTY) { 1243 /* Insert into new slot. */ 1244 mp->ma_keys->dk_version = 0; 1245 assert(old_value == NULL); 1246 if (mp->ma_keys->dk_usable <= 0) { 1247 /* Need to resize. */ 1248 if (insertion_resize(mp, 1) < 0) 1249 goto Fail; 1250 } 1251 1252 Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash); 1253 dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries); 1254 1255 if (DK_IS_UNICODE(mp->ma_keys)) { 1256 PyDictUnicodeEntry *ep; 1257 ep = &DK_UNICODE_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries]; 1258 ep->me_key = key; 1259 if (mp->ma_values) { 1260 Py_ssize_t index = mp->ma_keys->dk_nentries; 1261 _PyDictValues_AddToInsertionOrder(mp->ma_values, index); 1262 assert (mp->ma_values->values[index] == NULL); 1263 mp->ma_values->values[index] = value; 1264 } 1265 else { 1266 ep->me_value = value; 1267 } 1268 } 1269 else { 1270 PyDictKeyEntry *ep; 1271 ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries]; 1272 ep->me_key = key; 1273 ep->me_hash = hash; 1274 ep->me_value = value; 1275 } 1276 mp->ma_used++; 1277 mp->ma_version_tag = DICT_NEXT_VERSION(); 1278 mp->ma_keys->dk_usable--; 1279 mp->ma_keys->dk_nentries++; 1280 assert(mp->ma_keys->dk_usable >= 0); 1281 ASSERT_CONSISTENT(mp); 1282 return 0; 1283 } 1284 1285 if (old_value != value) { 1286 if (_PyDict_HasSplitTable(mp)) { 1287 mp->ma_values->values[ix] = value; 1288 if (old_value == NULL) { 1289 _PyDictValues_AddToInsertionOrder(mp->ma_values, ix); 1290 mp->ma_used++; 1291 } 1292 } 1293 else { 1294 assert(old_value != NULL); 1295 if (DK_IS_UNICODE(mp->ma_keys)) { 1296 DK_UNICODE_ENTRIES(mp->ma_keys)[ix].me_value = value; 1297 } 1298 else { 1299 DK_ENTRIES(mp->ma_keys)[ix].me_value = value; 1300 } 1301 } 1302 mp->ma_version_tag = DICT_NEXT_VERSION(); 1303 } 1304 Py_XDECREF(old_value); /* which **CAN** re-enter (see issue #22653) */ 1305 ASSERT_CONSISTENT(mp); 1306 Py_DECREF(key); 1307 return 0; 1308 1309Fail: 1310 Py_DECREF(value); 1311 Py_DECREF(key); 1312 return -1; 1313} 1314 1315// Same to insertdict but specialized for ma_keys = Py_EMPTY_KEYS. 1316// Consumes key and value references. 1317static int 1318insert_to_emptydict(PyDictObject *mp, PyObject *key, Py_hash_t hash, 1319 PyObject *value) 1320{ 1321 assert(mp->ma_keys == Py_EMPTY_KEYS); 1322 1323 int unicode = PyUnicode_CheckExact(key); 1324 PyDictKeysObject *newkeys = new_keys_object(PyDict_LOG_MINSIZE, unicode); 1325 if (newkeys == NULL) { 1326 Py_DECREF(key); 1327 Py_DECREF(value); 1328 return -1; 1329 } 1330 dictkeys_decref(Py_EMPTY_KEYS); 1331 mp->ma_keys = newkeys; 1332 mp->ma_values = NULL; 1333 1334 MAINTAIN_TRACKING(mp, key, value); 1335 1336 size_t hashpos = (size_t)hash & (PyDict_MINSIZE-1); 1337 dictkeys_set_index(mp->ma_keys, hashpos, 0); 1338 if (unicode) { 1339 PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(mp->ma_keys); 1340 ep->me_key = key; 1341 ep->me_value = value; 1342 } 1343 else { 1344 PyDictKeyEntry *ep = DK_ENTRIES(mp->ma_keys); 1345 ep->me_key = key; 1346 ep->me_hash = hash; 1347 ep->me_value = value; 1348 } 1349 mp->ma_used++; 1350 mp->ma_version_tag = DICT_NEXT_VERSION(); 1351 mp->ma_keys->dk_usable--; 1352 mp->ma_keys->dk_nentries++; 1353 return 0; 1354} 1355 1356/* 1357Internal routine used by dictresize() to build a hashtable of entries. 1358*/ 1359static void 1360build_indices_generic(PyDictKeysObject *keys, PyDictKeyEntry *ep, Py_ssize_t n) 1361{ 1362 size_t mask = DK_MASK(keys); 1363 for (Py_ssize_t ix = 0; ix != n; ix++, ep++) { 1364 Py_hash_t hash = ep->me_hash; 1365 size_t i = hash & mask; 1366 for (size_t perturb = hash; dictkeys_get_index(keys, i) != DKIX_EMPTY;) { 1367 perturb >>= PERTURB_SHIFT; 1368 i = mask & (i*5 + perturb + 1); 1369 } 1370 dictkeys_set_index(keys, i, ix); 1371 } 1372} 1373 1374static void 1375build_indices_unicode(PyDictKeysObject *keys, PyDictUnicodeEntry *ep, Py_ssize_t n) 1376{ 1377 size_t mask = DK_MASK(keys); 1378 for (Py_ssize_t ix = 0; ix != n; ix++, ep++) { 1379 Py_hash_t hash = unicode_get_hash(ep->me_key); 1380 assert(hash != -1); 1381 size_t i = hash & mask; 1382 for (size_t perturb = hash; dictkeys_get_index(keys, i) != DKIX_EMPTY;) { 1383 perturb >>= PERTURB_SHIFT; 1384 i = mask & (i*5 + perturb + 1); 1385 } 1386 dictkeys_set_index(keys, i, ix); 1387 } 1388} 1389 1390/* 1391Restructure the table by allocating a new table and reinserting all 1392items again. When entries have been deleted, the new table may 1393actually be smaller than the old one. 1394If a table is split (its keys and hashes are shared, its values are not), 1395then the values are temporarily copied into the table, it is resized as 1396a combined table, then the me_value slots in the old table are NULLed out. 1397After resizing a table is always combined. 1398 1399This function supports: 1400 - Unicode split -> Unicode combined or Generic 1401 - Unicode combined -> Unicode combined or Generic 1402 - Generic -> Generic 1403*/ 1404static int 1405dictresize(PyDictObject *mp, uint8_t log2_newsize, int unicode) 1406{ 1407 PyDictKeysObject *oldkeys; 1408 PyDictValues *oldvalues; 1409 1410 if (log2_newsize >= SIZEOF_SIZE_T*8) { 1411 PyErr_NoMemory(); 1412 return -1; 1413 } 1414 assert(log2_newsize >= PyDict_LOG_MINSIZE); 1415 1416 oldkeys = mp->ma_keys; 1417 oldvalues = mp->ma_values; 1418 1419 if (!DK_IS_UNICODE(oldkeys)) { 1420 unicode = 0; 1421 } 1422 1423 /* NOTE: Current odict checks mp->ma_keys to detect resize happen. 1424 * So we can't reuse oldkeys even if oldkeys->dk_size == newsize. 1425 * TODO: Try reusing oldkeys when reimplement odict. 1426 */ 1427 1428 /* Allocate a new table. */ 1429 mp->ma_keys = new_keys_object(log2_newsize, unicode); 1430 if (mp->ma_keys == NULL) { 1431 mp->ma_keys = oldkeys; 1432 return -1; 1433 } 1434 // New table must be large enough. 1435 assert(mp->ma_keys->dk_usable >= mp->ma_used); 1436 1437 Py_ssize_t numentries = mp->ma_used; 1438 1439 if (oldvalues != NULL) { 1440 PyDictUnicodeEntry *oldentries = DK_UNICODE_ENTRIES(oldkeys); 1441 /* Convert split table into new combined table. 1442 * We must incref keys; we can transfer values. 1443 */ 1444 if (mp->ma_keys->dk_kind == DICT_KEYS_GENERAL) { 1445 // split -> generic 1446 PyDictKeyEntry *newentries = DK_ENTRIES(mp->ma_keys); 1447 1448 for (Py_ssize_t i = 0; i < numentries; i++) { 1449 int index = get_index_from_order(mp, i); 1450 PyDictUnicodeEntry *ep = &oldentries[index]; 1451 assert(oldvalues->values[index] != NULL); 1452 Py_INCREF(ep->me_key); 1453 newentries[i].me_key = ep->me_key; 1454 newentries[i].me_hash = unicode_get_hash(ep->me_key); 1455 newentries[i].me_value = oldvalues->values[index]; 1456 } 1457 build_indices_generic(mp->ma_keys, newentries, numentries); 1458 } 1459 else { // split -> combined unicode 1460 PyDictUnicodeEntry *newentries = DK_UNICODE_ENTRIES(mp->ma_keys); 1461 1462 for (Py_ssize_t i = 0; i < numentries; i++) { 1463 int index = get_index_from_order(mp, i); 1464 PyDictUnicodeEntry *ep = &oldentries[index]; 1465 assert(oldvalues->values[index] != NULL); 1466 Py_INCREF(ep->me_key); 1467 newentries[i].me_key = ep->me_key; 1468 newentries[i].me_value = oldvalues->values[index]; 1469 } 1470 build_indices_unicode(mp->ma_keys, newentries, numentries); 1471 } 1472 dictkeys_decref(oldkeys); 1473 mp->ma_values = NULL; 1474 free_values(oldvalues); 1475 } 1476 else { // oldkeys is combined. 1477 if (oldkeys->dk_kind == DICT_KEYS_GENERAL) { 1478 // generic -> generic 1479 assert(mp->ma_keys->dk_kind == DICT_KEYS_GENERAL); 1480 PyDictKeyEntry *oldentries = DK_ENTRIES(oldkeys); 1481 PyDictKeyEntry *newentries = DK_ENTRIES(mp->ma_keys); 1482 if (oldkeys->dk_nentries == numentries) { 1483 memcpy(newentries, oldentries, numentries * sizeof(PyDictKeyEntry)); 1484 } 1485 else { 1486 PyDictKeyEntry *ep = oldentries; 1487 for (Py_ssize_t i = 0; i < numentries; i++) { 1488 while (ep->me_value == NULL) 1489 ep++; 1490 newentries[i] = *ep++; 1491 } 1492 } 1493 build_indices_generic(mp->ma_keys, newentries, numentries); 1494 } 1495 else { // oldkeys is combined unicode 1496 PyDictUnicodeEntry *oldentries = DK_UNICODE_ENTRIES(oldkeys); 1497 if (unicode) { // combined unicode -> combined unicode 1498 PyDictUnicodeEntry *newentries = DK_UNICODE_ENTRIES(mp->ma_keys); 1499 if (oldkeys->dk_nentries == numentries && mp->ma_keys->dk_kind == DICT_KEYS_UNICODE) { 1500 memcpy(newentries, oldentries, numentries * sizeof(PyDictUnicodeEntry)); 1501 } 1502 else { 1503 PyDictUnicodeEntry *ep = oldentries; 1504 for (Py_ssize_t i = 0; i < numentries; i++) { 1505 while (ep->me_value == NULL) 1506 ep++; 1507 newentries[i] = *ep++; 1508 } 1509 } 1510 build_indices_unicode(mp->ma_keys, newentries, numentries); 1511 } 1512 else { // combined unicode -> generic 1513 PyDictKeyEntry *newentries = DK_ENTRIES(mp->ma_keys); 1514 PyDictUnicodeEntry *ep = oldentries; 1515 for (Py_ssize_t i = 0; i < numentries; i++) { 1516 while (ep->me_value == NULL) 1517 ep++; 1518 newentries[i].me_key = ep->me_key; 1519 newentries[i].me_hash = unicode_get_hash(ep->me_key); 1520 newentries[i].me_value = ep->me_value; 1521 ep++; 1522 } 1523 build_indices_generic(mp->ma_keys, newentries, numentries); 1524 } 1525 } 1526 1527 // We can not use free_keys_object here because key's reference 1528 // are moved already. 1529#ifdef Py_REF_DEBUG 1530 _Py_RefTotal--; 1531#endif 1532 if (oldkeys == Py_EMPTY_KEYS) { 1533 oldkeys->dk_refcnt--; 1534 assert(oldkeys->dk_refcnt > 0); 1535 } 1536 else { 1537 assert(oldkeys->dk_kind != DICT_KEYS_SPLIT); 1538 assert(oldkeys->dk_refcnt == 1); 1539#if PyDict_MAXFREELIST > 0 1540 struct _Py_dict_state *state = get_dict_state(); 1541#ifdef Py_DEBUG 1542 // dictresize() must not be called after _PyDict_Fini() 1543 assert(state->keys_numfree != -1); 1544#endif 1545 if (DK_LOG_SIZE(oldkeys) == PyDict_LOG_MINSIZE && 1546 DK_IS_UNICODE(oldkeys) && 1547 state->keys_numfree < PyDict_MAXFREELIST) 1548 { 1549 state->keys_free_list[state->keys_numfree++] = oldkeys; 1550 OBJECT_STAT_INC(to_freelist); 1551 } 1552 else 1553#endif 1554 { 1555 PyObject_Free(oldkeys); 1556 } 1557 } 1558 } 1559 1560 mp->ma_keys->dk_usable -= numentries; 1561 mp->ma_keys->dk_nentries = numentries; 1562 ASSERT_CONSISTENT(mp); 1563 return 0; 1564} 1565 1566static PyObject * 1567dict_new_presized(Py_ssize_t minused, bool unicode) 1568{ 1569 const uint8_t log2_max_presize = 17; 1570 const Py_ssize_t max_presize = ((Py_ssize_t)1) << log2_max_presize; 1571 uint8_t log2_newsize; 1572 PyDictKeysObject *new_keys; 1573 1574 if (minused <= USABLE_FRACTION(PyDict_MINSIZE)) { 1575 return PyDict_New(); 1576 } 1577 /* There are no strict guarantee that returned dict can contain minused 1578 * items without resize. So we create medium size dict instead of very 1579 * large dict or MemoryError. 1580 */ 1581 if (minused > USABLE_FRACTION(max_presize)) { 1582 log2_newsize = log2_max_presize; 1583 } 1584 else { 1585 log2_newsize = estimate_log2_keysize(minused); 1586 } 1587 1588 new_keys = new_keys_object(log2_newsize, unicode); 1589 if (new_keys == NULL) 1590 return NULL; 1591 return new_dict(new_keys, NULL, 0, 0); 1592} 1593 1594PyObject * 1595_PyDict_NewPresized(Py_ssize_t minused) 1596{ 1597 return dict_new_presized(minused, false); 1598} 1599 1600PyObject * 1601_PyDict_FromItems(PyObject *const *keys, Py_ssize_t keys_offset, 1602 PyObject *const *values, Py_ssize_t values_offset, 1603 Py_ssize_t length) 1604{ 1605 bool unicode = true; 1606 PyObject *const *ks = keys; 1607 1608 for (Py_ssize_t i = 0; i < length; i++) { 1609 if (!PyUnicode_CheckExact(*ks)) { 1610 unicode = false; 1611 break; 1612 } 1613 ks += keys_offset; 1614 } 1615 1616 PyObject *dict = dict_new_presized(length, unicode); 1617 if (dict == NULL) { 1618 return NULL; 1619 } 1620 1621 ks = keys; 1622 PyObject *const *vs = values; 1623 1624 for (Py_ssize_t i = 0; i < length; i++) { 1625 PyObject *key = *ks; 1626 PyObject *value = *vs; 1627 if (PyDict_SetItem(dict, key, value) < 0) { 1628 Py_DECREF(dict); 1629 return NULL; 1630 } 1631 ks += keys_offset; 1632 vs += values_offset; 1633 } 1634 1635 return dict; 1636} 1637 1638/* Note that, for historical reasons, PyDict_GetItem() suppresses all errors 1639 * that may occur (originally dicts supported only string keys, and exceptions 1640 * weren't possible). So, while the original intent was that a NULL return 1641 * meant the key wasn't present, in reality it can mean that, or that an error 1642 * (suppressed) occurred while computing the key's hash, or that some error 1643 * (suppressed) occurred when comparing keys in the dict's internal probe 1644 * sequence. A nasty example of the latter is when a Python-coded comparison 1645 * function hits a stack-depth error, which can cause this to return NULL 1646 * even if the key is present. 1647 */ 1648PyObject * 1649PyDict_GetItem(PyObject *op, PyObject *key) 1650{ 1651 if (!PyDict_Check(op)) { 1652 return NULL; 1653 } 1654 PyDictObject *mp = (PyDictObject *)op; 1655 1656 Py_hash_t hash; 1657 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 1658 hash = PyObject_Hash(key); 1659 if (hash == -1) { 1660 PyErr_Clear(); 1661 return NULL; 1662 } 1663 } 1664 1665 PyThreadState *tstate = _PyThreadState_GET(); 1666#ifdef Py_DEBUG 1667 // bpo-40839: Before Python 3.10, it was possible to call PyDict_GetItem() 1668 // with the GIL released. 1669 _Py_EnsureTstateNotNULL(tstate); 1670#endif 1671 1672 /* Preserve the existing exception */ 1673 PyObject *exc_type, *exc_value, *exc_tb; 1674 PyObject *value; 1675 Py_ssize_t ix; (void)ix; 1676 1677 _PyErr_Fetch(tstate, &exc_type, &exc_value, &exc_tb); 1678 ix = _Py_dict_lookup(mp, key, hash, &value); 1679 1680 /* Ignore any exception raised by the lookup */ 1681 _PyErr_Restore(tstate, exc_type, exc_value, exc_tb); 1682 1683 1684 assert(ix >= 0 || value == NULL); 1685 return value; 1686} 1687 1688Py_ssize_t 1689_PyDict_GetItemHint(PyDictObject *mp, PyObject *key, 1690 Py_ssize_t hint, PyObject **value) 1691{ 1692 assert(*value == NULL); 1693 assert(PyDict_CheckExact((PyObject*)mp)); 1694 assert(PyUnicode_CheckExact(key)); 1695 1696 if (hint >= 0 && hint < mp->ma_keys->dk_nentries) { 1697 PyObject *res = NULL; 1698 1699 if (DK_IS_UNICODE(mp->ma_keys)) { 1700 PyDictUnicodeEntry *ep = DK_UNICODE_ENTRIES(mp->ma_keys) + (size_t)hint; 1701 if (ep->me_key == key) { 1702 if (mp->ma_keys->dk_kind == DICT_KEYS_SPLIT) { 1703 assert(mp->ma_values != NULL); 1704 res = mp->ma_values->values[(size_t)hint]; 1705 } 1706 else { 1707 res = ep->me_value; 1708 } 1709 if (res != NULL) { 1710 *value = res; 1711 return hint; 1712 } 1713 } 1714 } 1715 else { 1716 PyDictKeyEntry *ep = DK_ENTRIES(mp->ma_keys) + (size_t)hint; 1717 if (ep->me_key == key) { 1718 if (mp->ma_keys->dk_kind == DICT_KEYS_SPLIT) { 1719 assert(mp->ma_values != NULL); 1720 res = mp->ma_values->values[(size_t)hint]; 1721 } 1722 else { 1723 res = ep->me_value; 1724 } 1725 if (res != NULL) { 1726 *value = res; 1727 return hint; 1728 } 1729 } 1730 } 1731 } 1732 1733 Py_hash_t hash = unicode_get_hash(key); 1734 if (hash == -1) { 1735 hash = PyObject_Hash(key); 1736 if (hash == -1) { 1737 return -1; 1738 } 1739 } 1740 1741 return _Py_dict_lookup(mp, key, hash, value); 1742} 1743 1744/* Same as PyDict_GetItemWithError() but with hash supplied by caller. 1745 This returns NULL *with* an exception set if an exception occurred. 1746 It returns NULL *without* an exception set if the key wasn't present. 1747*/ 1748PyObject * 1749_PyDict_GetItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash) 1750{ 1751 Py_ssize_t ix; (void)ix; 1752 PyDictObject *mp = (PyDictObject *)op; 1753 PyObject *value; 1754 1755 if (!PyDict_Check(op)) { 1756 PyErr_BadInternalCall(); 1757 return NULL; 1758 } 1759 1760 ix = _Py_dict_lookup(mp, key, hash, &value); 1761 assert(ix >= 0 || value == NULL); 1762 return value; 1763} 1764 1765/* Variant of PyDict_GetItem() that doesn't suppress exceptions. 1766 This returns NULL *with* an exception set if an exception occurred. 1767 It returns NULL *without* an exception set if the key wasn't present. 1768*/ 1769PyObject * 1770PyDict_GetItemWithError(PyObject *op, PyObject *key) 1771{ 1772 Py_ssize_t ix; (void)ix; 1773 Py_hash_t hash; 1774 PyDictObject*mp = (PyDictObject *)op; 1775 PyObject *value; 1776 1777 if (!PyDict_Check(op)) { 1778 PyErr_BadInternalCall(); 1779 return NULL; 1780 } 1781 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) 1782 { 1783 hash = PyObject_Hash(key); 1784 if (hash == -1) { 1785 return NULL; 1786 } 1787 } 1788 1789 ix = _Py_dict_lookup(mp, key, hash, &value); 1790 assert(ix >= 0 || value == NULL); 1791 return value; 1792} 1793 1794PyObject * 1795_PyDict_GetItemWithError(PyObject *dp, PyObject *kv) 1796{ 1797 assert(PyUnicode_CheckExact(kv)); 1798 Py_hash_t hash = kv->ob_type->tp_hash(kv); 1799 if (hash == -1) { 1800 return NULL; 1801 } 1802 return _PyDict_GetItem_KnownHash(dp, kv, hash); 1803} 1804 1805PyObject * 1806_PyDict_GetItemIdWithError(PyObject *dp, _Py_Identifier *key) 1807{ 1808 PyObject *kv; 1809 kv = _PyUnicode_FromId(key); /* borrowed */ 1810 if (kv == NULL) 1811 return NULL; 1812 Py_hash_t hash = unicode_get_hash(kv); 1813 assert (hash != -1); /* interned strings have their hash value initialised */ 1814 return _PyDict_GetItem_KnownHash(dp, kv, hash); 1815} 1816 1817PyObject * 1818_PyDict_GetItemStringWithError(PyObject *v, const char *key) 1819{ 1820 PyObject *kv, *rv; 1821 kv = PyUnicode_FromString(key); 1822 if (kv == NULL) { 1823 return NULL; 1824 } 1825 rv = PyDict_GetItemWithError(v, kv); 1826 Py_DECREF(kv); 1827 return rv; 1828} 1829 1830/* Fast version of global value lookup (LOAD_GLOBAL). 1831 * Lookup in globals, then builtins. 1832 * 1833 * 1834 * 1835 * 1836 * Raise an exception and return NULL if an error occurred (ex: computing the 1837 * key hash failed, key comparison failed, ...). Return NULL if the key doesn't 1838 * exist. Return the value if the key exists. 1839 */ 1840PyObject * 1841_PyDict_LoadGlobal(PyDictObject *globals, PyDictObject *builtins, PyObject *key) 1842{ 1843 Py_ssize_t ix; 1844 Py_hash_t hash; 1845 PyObject *value; 1846 1847 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 1848 hash = PyObject_Hash(key); 1849 if (hash == -1) 1850 return NULL; 1851 } 1852 1853 /* namespace 1: globals */ 1854 ix = _Py_dict_lookup(globals, key, hash, &value); 1855 if (ix == DKIX_ERROR) 1856 return NULL; 1857 if (ix != DKIX_EMPTY && value != NULL) 1858 return value; 1859 1860 /* namespace 2: builtins */ 1861 ix = _Py_dict_lookup(builtins, key, hash, &value); 1862 assert(ix >= 0 || value == NULL); 1863 return value; 1864} 1865 1866/* Consumes references to key and value */ 1867int 1868_PyDict_SetItem_Take2(PyDictObject *mp, PyObject *key, PyObject *value) 1869{ 1870 assert(key); 1871 assert(value); 1872 assert(PyDict_Check(mp)); 1873 Py_hash_t hash; 1874 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 1875 hash = PyObject_Hash(key); 1876 if (hash == -1) { 1877 Py_DECREF(key); 1878 Py_DECREF(value); 1879 return -1; 1880 } 1881 } 1882 if (mp->ma_keys == Py_EMPTY_KEYS) { 1883 return insert_to_emptydict(mp, key, hash, value); 1884 } 1885 /* insertdict() handles any resizing that might be necessary */ 1886 return insertdict(mp, key, hash, value); 1887} 1888 1889/* CAUTION: PyDict_SetItem() must guarantee that it won't resize the 1890 * dictionary if it's merely replacing the value for an existing key. 1891 * This means that it's safe to loop over a dictionary with PyDict_Next() 1892 * and occasionally replace a value -- but you can't insert new keys or 1893 * remove them. 1894 */ 1895int 1896PyDict_SetItem(PyObject *op, PyObject *key, PyObject *value) 1897{ 1898 if (!PyDict_Check(op)) { 1899 PyErr_BadInternalCall(); 1900 return -1; 1901 } 1902 assert(key); 1903 assert(value); 1904 Py_INCREF(key); 1905 Py_INCREF(value); 1906 return _PyDict_SetItem_Take2((PyDictObject *)op, key, value); 1907} 1908 1909int 1910_PyDict_SetItem_KnownHash(PyObject *op, PyObject *key, PyObject *value, 1911 Py_hash_t hash) 1912{ 1913 PyDictObject *mp; 1914 1915 if (!PyDict_Check(op)) { 1916 PyErr_BadInternalCall(); 1917 return -1; 1918 } 1919 assert(key); 1920 assert(value); 1921 assert(hash != -1); 1922 mp = (PyDictObject *)op; 1923 1924 Py_INCREF(key); 1925 Py_INCREF(value); 1926 if (mp->ma_keys == Py_EMPTY_KEYS) { 1927 return insert_to_emptydict(mp, key, hash, value); 1928 } 1929 /* insertdict() handles any resizing that might be necessary */ 1930 return insertdict(mp, key, hash, value); 1931} 1932 1933static void 1934delete_index_from_values(PyDictValues *values, Py_ssize_t ix) 1935{ 1936 uint8_t *size_ptr = ((uint8_t *)values)-2; 1937 int size = *size_ptr; 1938 int i; 1939 for (i = 1; size_ptr[-i] != ix; i++) { 1940 assert(i <= size); 1941 } 1942 assert(i <= size); 1943 for (; i < size; i++) { 1944 size_ptr[-i] = size_ptr[-i-1]; 1945 } 1946 *size_ptr = size -1; 1947} 1948 1949static int 1950delitem_common(PyDictObject *mp, Py_hash_t hash, Py_ssize_t ix, 1951 PyObject *old_value) 1952{ 1953 PyObject *old_key; 1954 1955 Py_ssize_t hashpos = lookdict_index(mp->ma_keys, hash, ix); 1956 assert(hashpos >= 0); 1957 1958 mp->ma_used--; 1959 mp->ma_version_tag = DICT_NEXT_VERSION(); 1960 if (mp->ma_values) { 1961 assert(old_value == mp->ma_values->values[ix]); 1962 mp->ma_values->values[ix] = NULL; 1963 assert(ix < SHARED_KEYS_MAX_SIZE); 1964 /* Update order */ 1965 delete_index_from_values(mp->ma_values, ix); 1966 ASSERT_CONSISTENT(mp); 1967 } 1968 else { 1969 mp->ma_keys->dk_version = 0; 1970 dictkeys_set_index(mp->ma_keys, hashpos, DKIX_DUMMY); 1971 if (DK_IS_UNICODE(mp->ma_keys)) { 1972 PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(mp->ma_keys)[ix]; 1973 old_key = ep->me_key; 1974 ep->me_key = NULL; 1975 ep->me_value = NULL; 1976 } 1977 else { 1978 PyDictKeyEntry *ep = &DK_ENTRIES(mp->ma_keys)[ix]; 1979 old_key = ep->me_key; 1980 ep->me_key = NULL; 1981 ep->me_value = NULL; 1982 ep->me_hash = 0; 1983 } 1984 Py_DECREF(old_key); 1985 } 1986 Py_DECREF(old_value); 1987 1988 ASSERT_CONSISTENT(mp); 1989 return 0; 1990} 1991 1992int 1993PyDict_DelItem(PyObject *op, PyObject *key) 1994{ 1995 Py_hash_t hash; 1996 assert(key); 1997 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 1998 hash = PyObject_Hash(key); 1999 if (hash == -1) 2000 return -1; 2001 } 2002 2003 return _PyDict_DelItem_KnownHash(op, key, hash); 2004} 2005 2006int 2007_PyDict_DelItem_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash) 2008{ 2009 Py_ssize_t ix; 2010 PyDictObject *mp; 2011 PyObject *old_value; 2012 2013 if (!PyDict_Check(op)) { 2014 PyErr_BadInternalCall(); 2015 return -1; 2016 } 2017 assert(key); 2018 assert(hash != -1); 2019 mp = (PyDictObject *)op; 2020 ix = _Py_dict_lookup(mp, key, hash, &old_value); 2021 if (ix == DKIX_ERROR) 2022 return -1; 2023 if (ix == DKIX_EMPTY || old_value == NULL) { 2024 _PyErr_SetKeyError(key); 2025 return -1; 2026 } 2027 2028 return delitem_common(mp, hash, ix, old_value); 2029} 2030 2031/* This function promises that the predicate -> deletion sequence is atomic 2032 * (i.e. protected by the GIL), assuming the predicate itself doesn't 2033 * release the GIL. 2034 */ 2035int 2036_PyDict_DelItemIf(PyObject *op, PyObject *key, 2037 int (*predicate)(PyObject *value)) 2038{ 2039 Py_ssize_t hashpos, ix; 2040 PyDictObject *mp; 2041 Py_hash_t hash; 2042 PyObject *old_value; 2043 int res; 2044 2045 if (!PyDict_Check(op)) { 2046 PyErr_BadInternalCall(); 2047 return -1; 2048 } 2049 assert(key); 2050 hash = PyObject_Hash(key); 2051 if (hash == -1) 2052 return -1; 2053 mp = (PyDictObject *)op; 2054 ix = _Py_dict_lookup(mp, key, hash, &old_value); 2055 if (ix == DKIX_ERROR) 2056 return -1; 2057 if (ix == DKIX_EMPTY || old_value == NULL) { 2058 _PyErr_SetKeyError(key); 2059 return -1; 2060 } 2061 2062 res = predicate(old_value); 2063 if (res == -1) 2064 return -1; 2065 2066 hashpos = lookdict_index(mp->ma_keys, hash, ix); 2067 assert(hashpos >= 0); 2068 2069 if (res > 0) 2070 return delitem_common(mp, hashpos, ix, old_value); 2071 else 2072 return 0; 2073} 2074 2075 2076void 2077PyDict_Clear(PyObject *op) 2078{ 2079 PyDictObject *mp; 2080 PyDictKeysObject *oldkeys; 2081 PyDictValues *oldvalues; 2082 Py_ssize_t i, n; 2083 2084 if (!PyDict_Check(op)) 2085 return; 2086 mp = ((PyDictObject *)op); 2087 oldkeys = mp->ma_keys; 2088 oldvalues = mp->ma_values; 2089 if (oldkeys == Py_EMPTY_KEYS) { 2090 return; 2091 } 2092 /* Empty the dict... */ 2093 dictkeys_incref(Py_EMPTY_KEYS); 2094 mp->ma_keys = Py_EMPTY_KEYS; 2095 mp->ma_values = NULL; 2096 mp->ma_used = 0; 2097 mp->ma_version_tag = DICT_NEXT_VERSION(); 2098 /* ...then clear the keys and values */ 2099 if (oldvalues != NULL) { 2100 n = oldkeys->dk_nentries; 2101 for (i = 0; i < n; i++) 2102 Py_CLEAR(oldvalues->values[i]); 2103 free_values(oldvalues); 2104 dictkeys_decref(oldkeys); 2105 } 2106 else { 2107 assert(oldkeys->dk_refcnt == 1); 2108 dictkeys_decref(oldkeys); 2109 } 2110 ASSERT_CONSISTENT(mp); 2111} 2112 2113/* Internal version of PyDict_Next that returns a hash value in addition 2114 * to the key and value. 2115 * Return 1 on success, return 0 when the reached the end of the dictionary 2116 * (or if op is not a dictionary) 2117 */ 2118int 2119_PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, 2120 PyObject **pvalue, Py_hash_t *phash) 2121{ 2122 Py_ssize_t i; 2123 PyDictObject *mp; 2124 PyObject *key, *value; 2125 Py_hash_t hash; 2126 2127 if (!PyDict_Check(op)) 2128 return 0; 2129 mp = (PyDictObject *)op; 2130 i = *ppos; 2131 if (mp->ma_values) { 2132 assert(mp->ma_used <= SHARED_KEYS_MAX_SIZE); 2133 if (i < 0 || i >= mp->ma_used) 2134 return 0; 2135 int index = get_index_from_order(mp, i); 2136 value = mp->ma_values->values[index]; 2137 2138 key = DK_UNICODE_ENTRIES(mp->ma_keys)[index].me_key; 2139 hash = unicode_get_hash(key); 2140 assert(value != NULL); 2141 } 2142 else { 2143 Py_ssize_t n = mp->ma_keys->dk_nentries; 2144 if (i < 0 || i >= n) 2145 return 0; 2146 if (DK_IS_UNICODE(mp->ma_keys)) { 2147 PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(mp->ma_keys)[i]; 2148 while (i < n && entry_ptr->me_value == NULL) { 2149 entry_ptr++; 2150 i++; 2151 } 2152 if (i >= n) 2153 return 0; 2154 key = entry_ptr->me_key; 2155 hash = unicode_get_hash(entry_ptr->me_key); 2156 value = entry_ptr->me_value; 2157 } 2158 else { 2159 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(mp->ma_keys)[i]; 2160 while (i < n && entry_ptr->me_value == NULL) { 2161 entry_ptr++; 2162 i++; 2163 } 2164 if (i >= n) 2165 return 0; 2166 key = entry_ptr->me_key; 2167 hash = entry_ptr->me_hash; 2168 value = entry_ptr->me_value; 2169 } 2170 } 2171 *ppos = i+1; 2172 if (pkey) 2173 *pkey = key; 2174 if (pvalue) 2175 *pvalue = value; 2176 if (phash) 2177 *phash = hash; 2178 return 1; 2179} 2180 2181/* 2182 * Iterate over a dict. Use like so: 2183 * 2184 * Py_ssize_t i; 2185 * PyObject *key, *value; 2186 * i = 0; # important! i should not otherwise be changed by you 2187 * while (PyDict_Next(yourdict, &i, &key, &value)) { 2188 * Refer to borrowed references in key and value. 2189 * } 2190 * 2191 * Return 1 on success, return 0 when the reached the end of the dictionary 2192 * (or if op is not a dictionary) 2193 * 2194 * CAUTION: In general, it isn't safe to use PyDict_Next in a loop that 2195 * mutates the dict. One exception: it is safe if the loop merely changes 2196 * the values associated with the keys (but doesn't insert new keys or 2197 * delete keys), via PyDict_SetItem(). 2198 */ 2199int 2200PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue) 2201{ 2202 return _PyDict_Next(op, ppos, pkey, pvalue, NULL); 2203} 2204 2205/* Internal version of dict.pop(). */ 2206PyObject * 2207_PyDict_Pop_KnownHash(PyObject *dict, PyObject *key, Py_hash_t hash, PyObject *deflt) 2208{ 2209 Py_ssize_t ix; 2210 PyObject *old_value; 2211 PyDictObject *mp; 2212 2213 assert(PyDict_Check(dict)); 2214 mp = (PyDictObject *)dict; 2215 2216 if (mp->ma_used == 0) { 2217 if (deflt) { 2218 Py_INCREF(deflt); 2219 return deflt; 2220 } 2221 _PyErr_SetKeyError(key); 2222 return NULL; 2223 } 2224 ix = _Py_dict_lookup(mp, key, hash, &old_value); 2225 if (ix == DKIX_ERROR) 2226 return NULL; 2227 if (ix == DKIX_EMPTY || old_value == NULL) { 2228 if (deflt) { 2229 Py_INCREF(deflt); 2230 return deflt; 2231 } 2232 _PyErr_SetKeyError(key); 2233 return NULL; 2234 } 2235 assert(old_value != NULL); 2236 Py_INCREF(old_value); 2237 delitem_common(mp, hash, ix, old_value); 2238 2239 ASSERT_CONSISTENT(mp); 2240 return old_value; 2241} 2242 2243PyObject * 2244_PyDict_Pop(PyObject *dict, PyObject *key, PyObject *deflt) 2245{ 2246 Py_hash_t hash; 2247 2248 if (((PyDictObject *)dict)->ma_used == 0) { 2249 if (deflt) { 2250 Py_INCREF(deflt); 2251 return deflt; 2252 } 2253 _PyErr_SetKeyError(key); 2254 return NULL; 2255 } 2256 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 2257 hash = PyObject_Hash(key); 2258 if (hash == -1) 2259 return NULL; 2260 } 2261 return _PyDict_Pop_KnownHash(dict, key, hash, deflt); 2262} 2263 2264/* Internal version of dict.from_keys(). It is subclass-friendly. */ 2265PyObject * 2266_PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value) 2267{ 2268 PyObject *it; /* iter(iterable) */ 2269 PyObject *key; 2270 PyObject *d; 2271 int status; 2272 2273 d = _PyObject_CallNoArgs(cls); 2274 if (d == NULL) 2275 return NULL; 2276 2277 if (PyDict_CheckExact(d) && ((PyDictObject *)d)->ma_used == 0) { 2278 if (PyDict_CheckExact(iterable)) { 2279 PyDictObject *mp = (PyDictObject *)d; 2280 PyObject *oldvalue; 2281 Py_ssize_t pos = 0; 2282 PyObject *key; 2283 Py_hash_t hash; 2284 2285 int unicode = DK_IS_UNICODE(((PyDictObject*)iterable)->ma_keys); 2286 if (dictresize(mp, estimate_log2_keysize(PyDict_GET_SIZE(iterable)), unicode)) { 2287 Py_DECREF(d); 2288 return NULL; 2289 } 2290 2291 while (_PyDict_Next(iterable, &pos, &key, &oldvalue, &hash)) { 2292 Py_INCREF(key); 2293 Py_INCREF(value); 2294 if (insertdict(mp, key, hash, value)) { 2295 Py_DECREF(d); 2296 return NULL; 2297 } 2298 } 2299 return d; 2300 } 2301 if (PyAnySet_CheckExact(iterable)) { 2302 PyDictObject *mp = (PyDictObject *)d; 2303 Py_ssize_t pos = 0; 2304 PyObject *key; 2305 Py_hash_t hash; 2306 2307 if (dictresize(mp, estimate_log2_keysize(PySet_GET_SIZE(iterable)), 0)) { 2308 Py_DECREF(d); 2309 return NULL; 2310 } 2311 2312 while (_PySet_NextEntry(iterable, &pos, &key, &hash)) { 2313 Py_INCREF(key); 2314 Py_INCREF(value); 2315 if (insertdict(mp, key, hash, value)) { 2316 Py_DECREF(d); 2317 return NULL; 2318 } 2319 } 2320 return d; 2321 } 2322 } 2323 2324 it = PyObject_GetIter(iterable); 2325 if (it == NULL){ 2326 Py_DECREF(d); 2327 return NULL; 2328 } 2329 2330 if (PyDict_CheckExact(d)) { 2331 while ((key = PyIter_Next(it)) != NULL) { 2332 status = PyDict_SetItem(d, key, value); 2333 Py_DECREF(key); 2334 if (status < 0) 2335 goto Fail; 2336 } 2337 } else { 2338 while ((key = PyIter_Next(it)) != NULL) { 2339 status = PyObject_SetItem(d, key, value); 2340 Py_DECREF(key); 2341 if (status < 0) 2342 goto Fail; 2343 } 2344 } 2345 2346 if (PyErr_Occurred()) 2347 goto Fail; 2348 Py_DECREF(it); 2349 return d; 2350 2351Fail: 2352 Py_DECREF(it); 2353 Py_DECREF(d); 2354 return NULL; 2355} 2356 2357/* Methods */ 2358 2359static void 2360dict_dealloc(PyDictObject *mp) 2361{ 2362 PyDictValues *values = mp->ma_values; 2363 PyDictKeysObject *keys = mp->ma_keys; 2364 Py_ssize_t i, n; 2365 2366 /* bpo-31095: UnTrack is needed before calling any callbacks */ 2367 PyObject_GC_UnTrack(mp); 2368 Py_TRASHCAN_BEGIN(mp, dict_dealloc) 2369 if (values != NULL) { 2370 for (i = 0, n = mp->ma_keys->dk_nentries; i < n; i++) { 2371 Py_XDECREF(values->values[i]); 2372 } 2373 free_values(values); 2374 dictkeys_decref(keys); 2375 } 2376 else if (keys != NULL) { 2377 assert(keys->dk_refcnt == 1 || keys == Py_EMPTY_KEYS); 2378 dictkeys_decref(keys); 2379 } 2380#if PyDict_MAXFREELIST > 0 2381 struct _Py_dict_state *state = get_dict_state(); 2382#ifdef Py_DEBUG 2383 // new_dict() must not be called after _PyDict_Fini() 2384 assert(state->numfree != -1); 2385#endif 2386 if (state->numfree < PyDict_MAXFREELIST && Py_IS_TYPE(mp, &PyDict_Type)) { 2387 state->free_list[state->numfree++] = mp; 2388 OBJECT_STAT_INC(to_freelist); 2389 } 2390 else 2391#endif 2392 { 2393 Py_TYPE(mp)->tp_free((PyObject *)mp); 2394 } 2395 Py_TRASHCAN_END 2396} 2397 2398 2399static PyObject * 2400dict_repr(PyDictObject *mp) 2401{ 2402 Py_ssize_t i; 2403 PyObject *key = NULL, *value = NULL; 2404 _PyUnicodeWriter writer; 2405 int first; 2406 2407 i = Py_ReprEnter((PyObject *)mp); 2408 if (i != 0) { 2409 return i > 0 ? PyUnicode_FromString("{...}") : NULL; 2410 } 2411 2412 if (mp->ma_used == 0) { 2413 Py_ReprLeave((PyObject *)mp); 2414 return PyUnicode_FromString("{}"); 2415 } 2416 2417 _PyUnicodeWriter_Init(&writer); 2418 writer.overallocate = 1; 2419 /* "{" + "1: 2" + ", 3: 4" * (len - 1) + "}" */ 2420 writer.min_length = 1 + 4 + (2 + 4) * (mp->ma_used - 1) + 1; 2421 2422 if (_PyUnicodeWriter_WriteChar(&writer, '{') < 0) 2423 goto error; 2424 2425 /* Do repr() on each key+value pair, and insert ": " between them. 2426 Note that repr may mutate the dict. */ 2427 i = 0; 2428 first = 1; 2429 while (PyDict_Next((PyObject *)mp, &i, &key, &value)) { 2430 PyObject *s; 2431 int res; 2432 2433 /* Prevent repr from deleting key or value during key format. */ 2434 Py_INCREF(key); 2435 Py_INCREF(value); 2436 2437 if (!first) { 2438 if (_PyUnicodeWriter_WriteASCIIString(&writer, ", ", 2) < 0) 2439 goto error; 2440 } 2441 first = 0; 2442 2443 s = PyObject_Repr(key); 2444 if (s == NULL) 2445 goto error; 2446 res = _PyUnicodeWriter_WriteStr(&writer, s); 2447 Py_DECREF(s); 2448 if (res < 0) 2449 goto error; 2450 2451 if (_PyUnicodeWriter_WriteASCIIString(&writer, ": ", 2) < 0) 2452 goto error; 2453 2454 s = PyObject_Repr(value); 2455 if (s == NULL) 2456 goto error; 2457 res = _PyUnicodeWriter_WriteStr(&writer, s); 2458 Py_DECREF(s); 2459 if (res < 0) 2460 goto error; 2461 2462 Py_CLEAR(key); 2463 Py_CLEAR(value); 2464 } 2465 2466 writer.overallocate = 0; 2467 if (_PyUnicodeWriter_WriteChar(&writer, '}') < 0) 2468 goto error; 2469 2470 Py_ReprLeave((PyObject *)mp); 2471 2472 return _PyUnicodeWriter_Finish(&writer); 2473 2474error: 2475 Py_ReprLeave((PyObject *)mp); 2476 _PyUnicodeWriter_Dealloc(&writer); 2477 Py_XDECREF(key); 2478 Py_XDECREF(value); 2479 return NULL; 2480} 2481 2482static Py_ssize_t 2483dict_length(PyDictObject *mp) 2484{ 2485 return mp->ma_used; 2486} 2487 2488static PyObject * 2489dict_subscript(PyDictObject *mp, PyObject *key) 2490{ 2491 Py_ssize_t ix; 2492 Py_hash_t hash; 2493 PyObject *value; 2494 2495 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 2496 hash = PyObject_Hash(key); 2497 if (hash == -1) 2498 return NULL; 2499 } 2500 ix = _Py_dict_lookup(mp, key, hash, &value); 2501 if (ix == DKIX_ERROR) 2502 return NULL; 2503 if (ix == DKIX_EMPTY || value == NULL) { 2504 if (!PyDict_CheckExact(mp)) { 2505 /* Look up __missing__ method if we're a subclass. */ 2506 PyObject *missing, *res; 2507 missing = _PyObject_LookupSpecial( 2508 (PyObject *)mp, &_Py_ID(__missing__)); 2509 if (missing != NULL) { 2510 res = PyObject_CallOneArg(missing, key); 2511 Py_DECREF(missing); 2512 return res; 2513 } 2514 else if (PyErr_Occurred()) 2515 return NULL; 2516 } 2517 _PyErr_SetKeyError(key); 2518 return NULL; 2519 } 2520 Py_INCREF(value); 2521 return value; 2522} 2523 2524static int 2525dict_ass_sub(PyDictObject *mp, PyObject *v, PyObject *w) 2526{ 2527 if (w == NULL) 2528 return PyDict_DelItem((PyObject *)mp, v); 2529 else 2530 return PyDict_SetItem((PyObject *)mp, v, w); 2531} 2532 2533static PyMappingMethods dict_as_mapping = { 2534 (lenfunc)dict_length, /*mp_length*/ 2535 (binaryfunc)dict_subscript, /*mp_subscript*/ 2536 (objobjargproc)dict_ass_sub, /*mp_ass_subscript*/ 2537}; 2538 2539static PyObject * 2540dict_keys(PyDictObject *mp) 2541{ 2542 PyObject *v; 2543 Py_ssize_t n; 2544 2545 again: 2546 n = mp->ma_used; 2547 v = PyList_New(n); 2548 if (v == NULL) 2549 return NULL; 2550 if (n != mp->ma_used) { 2551 /* Durnit. The allocations caused the dict to resize. 2552 * Just start over, this shouldn't normally happen. 2553 */ 2554 Py_DECREF(v); 2555 goto again; 2556 } 2557 2558 /* Nothing we do below makes any function calls. */ 2559 Py_ssize_t j = 0, pos = 0; 2560 PyObject *key; 2561 while (_PyDict_Next((PyObject*)mp, &pos, &key, NULL, NULL)) { 2562 assert(j < n); 2563 Py_INCREF(key); 2564 PyList_SET_ITEM(v, j, key); 2565 j++; 2566 } 2567 assert(j == n); 2568 return v; 2569} 2570 2571static PyObject * 2572dict_values(PyDictObject *mp) 2573{ 2574 PyObject *v; 2575 Py_ssize_t n; 2576 2577 again: 2578 n = mp->ma_used; 2579 v = PyList_New(n); 2580 if (v == NULL) 2581 return NULL; 2582 if (n != mp->ma_used) { 2583 /* Durnit. The allocations caused the dict to resize. 2584 * Just start over, this shouldn't normally happen. 2585 */ 2586 Py_DECREF(v); 2587 goto again; 2588 } 2589 2590 /* Nothing we do below makes any function calls. */ 2591 Py_ssize_t j = 0, pos = 0; 2592 PyObject *value; 2593 while (_PyDict_Next((PyObject*)mp, &pos, NULL, &value, NULL)) { 2594 assert(j < n); 2595 Py_INCREF(value); 2596 PyList_SET_ITEM(v, j, value); 2597 j++; 2598 } 2599 assert(j == n); 2600 return v; 2601} 2602 2603static PyObject * 2604dict_items(PyDictObject *mp) 2605{ 2606 PyObject *v; 2607 Py_ssize_t i, n; 2608 PyObject *item; 2609 2610 /* Preallocate the list of tuples, to avoid allocations during 2611 * the loop over the items, which could trigger GC, which 2612 * could resize the dict. :-( 2613 */ 2614 again: 2615 n = mp->ma_used; 2616 v = PyList_New(n); 2617 if (v == NULL) 2618 return NULL; 2619 for (i = 0; i < n; i++) { 2620 item = PyTuple_New(2); 2621 if (item == NULL) { 2622 Py_DECREF(v); 2623 return NULL; 2624 } 2625 PyList_SET_ITEM(v, i, item); 2626 } 2627 if (n != mp->ma_used) { 2628 /* Durnit. The allocations caused the dict to resize. 2629 * Just start over, this shouldn't normally happen. 2630 */ 2631 Py_DECREF(v); 2632 goto again; 2633 } 2634 2635 /* Nothing we do below makes any function calls. */ 2636 Py_ssize_t j = 0, pos = 0; 2637 PyObject *key, *value; 2638 while (_PyDict_Next((PyObject*)mp, &pos, &key, &value, NULL)) { 2639 assert(j < n); 2640 PyObject *item = PyList_GET_ITEM(v, j); 2641 Py_INCREF(key); 2642 PyTuple_SET_ITEM(item, 0, key); 2643 Py_INCREF(value); 2644 PyTuple_SET_ITEM(item, 1, value); 2645 j++; 2646 } 2647 assert(j == n); 2648 return v; 2649} 2650 2651/*[clinic input] 2652@classmethod 2653dict.fromkeys 2654 iterable: object 2655 value: object=None 2656 / 2657 2658Create a new dictionary with keys from iterable and values set to value. 2659[clinic start generated code]*/ 2660 2661static PyObject * 2662dict_fromkeys_impl(PyTypeObject *type, PyObject *iterable, PyObject *value) 2663/*[clinic end generated code: output=8fb98e4b10384999 input=382ba4855d0f74c3]*/ 2664{ 2665 return _PyDict_FromKeys((PyObject *)type, iterable, value); 2666} 2667 2668/* Single-arg dict update; used by dict_update_common and operators. */ 2669static int 2670dict_update_arg(PyObject *self, PyObject *arg) 2671{ 2672 if (PyDict_CheckExact(arg)) { 2673 return PyDict_Merge(self, arg, 1); 2674 } 2675 PyObject *func; 2676 if (_PyObject_LookupAttr(arg, &_Py_ID(keys), &func) < 0) { 2677 return -1; 2678 } 2679 if (func != NULL) { 2680 Py_DECREF(func); 2681 return PyDict_Merge(self, arg, 1); 2682 } 2683 return PyDict_MergeFromSeq2(self, arg, 1); 2684} 2685 2686static int 2687dict_update_common(PyObject *self, PyObject *args, PyObject *kwds, 2688 const char *methname) 2689{ 2690 PyObject *arg = NULL; 2691 int result = 0; 2692 2693 if (!PyArg_UnpackTuple(args, methname, 0, 1, &arg)) { 2694 result = -1; 2695 } 2696 else if (arg != NULL) { 2697 result = dict_update_arg(self, arg); 2698 } 2699 2700 if (result == 0 && kwds != NULL) { 2701 if (PyArg_ValidateKeywordArguments(kwds)) 2702 result = PyDict_Merge(self, kwds, 1); 2703 else 2704 result = -1; 2705 } 2706 return result; 2707} 2708 2709/* Note: dict.update() uses the METH_VARARGS|METH_KEYWORDS calling convention. 2710 Using METH_FASTCALL|METH_KEYWORDS would make dict.update(**dict2) calls 2711 slower, see the issue #29312. */ 2712static PyObject * 2713dict_update(PyObject *self, PyObject *args, PyObject *kwds) 2714{ 2715 if (dict_update_common(self, args, kwds, "update") != -1) 2716 Py_RETURN_NONE; 2717 return NULL; 2718} 2719 2720/* Update unconditionally replaces existing items. 2721 Merge has a 3rd argument 'override'; if set, it acts like Update, 2722 otherwise it leaves existing items unchanged. 2723 2724 PyDict_{Update,Merge} update/merge from a mapping object. 2725 2726 PyDict_MergeFromSeq2 updates/merges from any iterable object 2727 producing iterable objects of length 2. 2728*/ 2729 2730int 2731PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override) 2732{ 2733 PyObject *it; /* iter(seq2) */ 2734 Py_ssize_t i; /* index into seq2 of current element */ 2735 PyObject *item; /* seq2[i] */ 2736 PyObject *fast; /* item as a 2-tuple or 2-list */ 2737 2738 assert(d != NULL); 2739 assert(PyDict_Check(d)); 2740 assert(seq2 != NULL); 2741 2742 it = PyObject_GetIter(seq2); 2743 if (it == NULL) 2744 return -1; 2745 2746 for (i = 0; ; ++i) { 2747 PyObject *key, *value; 2748 Py_ssize_t n; 2749 2750 fast = NULL; 2751 item = PyIter_Next(it); 2752 if (item == NULL) { 2753 if (PyErr_Occurred()) 2754 goto Fail; 2755 break; 2756 } 2757 2758 /* Convert item to sequence, and verify length 2. */ 2759 fast = PySequence_Fast(item, ""); 2760 if (fast == NULL) { 2761 if (PyErr_ExceptionMatches(PyExc_TypeError)) 2762 PyErr_Format(PyExc_TypeError, 2763 "cannot convert dictionary update " 2764 "sequence element #%zd to a sequence", 2765 i); 2766 goto Fail; 2767 } 2768 n = PySequence_Fast_GET_SIZE(fast); 2769 if (n != 2) { 2770 PyErr_Format(PyExc_ValueError, 2771 "dictionary update sequence element #%zd " 2772 "has length %zd; 2 is required", 2773 i, n); 2774 goto Fail; 2775 } 2776 2777 /* Update/merge with this (key, value) pair. */ 2778 key = PySequence_Fast_GET_ITEM(fast, 0); 2779 value = PySequence_Fast_GET_ITEM(fast, 1); 2780 Py_INCREF(key); 2781 Py_INCREF(value); 2782 if (override) { 2783 if (PyDict_SetItem(d, key, value) < 0) { 2784 Py_DECREF(key); 2785 Py_DECREF(value); 2786 goto Fail; 2787 } 2788 } 2789 else { 2790 if (PyDict_SetDefault(d, key, value) == NULL) { 2791 Py_DECREF(key); 2792 Py_DECREF(value); 2793 goto Fail; 2794 } 2795 } 2796 2797 Py_DECREF(key); 2798 Py_DECREF(value); 2799 Py_DECREF(fast); 2800 Py_DECREF(item); 2801 } 2802 2803 i = 0; 2804 ASSERT_CONSISTENT(d); 2805 goto Return; 2806Fail: 2807 Py_XDECREF(item); 2808 Py_XDECREF(fast); 2809 i = -1; 2810Return: 2811 Py_DECREF(it); 2812 return Py_SAFE_DOWNCAST(i, Py_ssize_t, int); 2813} 2814 2815static int 2816dict_merge(PyObject *a, PyObject *b, int override) 2817{ 2818 PyDictObject *mp, *other; 2819 2820 assert(0 <= override && override <= 2); 2821 2822 /* We accept for the argument either a concrete dictionary object, 2823 * or an abstract "mapping" object. For the former, we can do 2824 * things quite efficiently. For the latter, we only require that 2825 * PyMapping_Keys() and PyObject_GetItem() be supported. 2826 */ 2827 if (a == NULL || !PyDict_Check(a) || b == NULL) { 2828 PyErr_BadInternalCall(); 2829 return -1; 2830 } 2831 mp = (PyDictObject*)a; 2832 if (PyDict_Check(b) && (Py_TYPE(b)->tp_iter == (getiterfunc)dict_iter)) { 2833 other = (PyDictObject*)b; 2834 if (other == mp || other->ma_used == 0) 2835 /* a.update(a) or a.update({}); nothing to do */ 2836 return 0; 2837 if (mp->ma_used == 0) { 2838 /* Since the target dict is empty, PyDict_GetItem() 2839 * always returns NULL. Setting override to 1 2840 * skips the unnecessary test. 2841 */ 2842 override = 1; 2843 PyDictKeysObject *okeys = other->ma_keys; 2844 2845 // If other is clean, combined, and just allocated, just clone it. 2846 if (other->ma_values == NULL && 2847 other->ma_used == okeys->dk_nentries && 2848 (DK_LOG_SIZE(okeys) == PyDict_LOG_MINSIZE || 2849 USABLE_FRACTION(DK_SIZE(okeys)/2) < other->ma_used)) { 2850 PyDictKeysObject *keys = clone_combined_dict_keys(other); 2851 if (keys == NULL) { 2852 return -1; 2853 } 2854 2855 dictkeys_decref(mp->ma_keys); 2856 mp->ma_keys = keys; 2857 if (mp->ma_values != NULL) { 2858 free_values(mp->ma_values); 2859 mp->ma_values = NULL; 2860 } 2861 2862 mp->ma_used = other->ma_used; 2863 mp->ma_version_tag = DICT_NEXT_VERSION(); 2864 ASSERT_CONSISTENT(mp); 2865 2866 if (_PyObject_GC_IS_TRACKED(other) && !_PyObject_GC_IS_TRACKED(mp)) { 2867 /* Maintain tracking. */ 2868 _PyObject_GC_TRACK(mp); 2869 } 2870 2871 return 0; 2872 } 2873 } 2874 /* Do one big resize at the start, rather than 2875 * incrementally resizing as we insert new items. Expect 2876 * that there will be no (or few) overlapping keys. 2877 */ 2878 if (USABLE_FRACTION(DK_SIZE(mp->ma_keys)) < other->ma_used) { 2879 int unicode = DK_IS_UNICODE(other->ma_keys); 2880 if (dictresize(mp, estimate_log2_keysize(mp->ma_used + other->ma_used), unicode)) { 2881 return -1; 2882 } 2883 } 2884 2885 Py_ssize_t orig_size = other->ma_keys->dk_nentries; 2886 Py_ssize_t pos = 0; 2887 Py_hash_t hash; 2888 PyObject *key, *value; 2889 2890 while (_PyDict_Next((PyObject*)other, &pos, &key, &value, &hash)) { 2891 int err = 0; 2892 Py_INCREF(key); 2893 Py_INCREF(value); 2894 if (override == 1) { 2895 Py_INCREF(key); 2896 Py_INCREF(value); 2897 err = insertdict(mp, key, hash, value); 2898 } 2899 else { 2900 err = _PyDict_Contains_KnownHash(a, key, hash); 2901 if (err == 0) { 2902 Py_INCREF(key); 2903 Py_INCREF(value); 2904 err = insertdict(mp, key, hash, value); 2905 } 2906 else if (err > 0) { 2907 if (override != 0) { 2908 _PyErr_SetKeyError(key); 2909 Py_DECREF(value); 2910 Py_DECREF(key); 2911 return -1; 2912 } 2913 err = 0; 2914 } 2915 } 2916 Py_DECREF(value); 2917 Py_DECREF(key); 2918 if (err != 0) 2919 return -1; 2920 2921 if (orig_size != other->ma_keys->dk_nentries) { 2922 PyErr_SetString(PyExc_RuntimeError, 2923 "dict mutated during update"); 2924 return -1; 2925 } 2926 } 2927 } 2928 else { 2929 /* Do it the generic, slower way */ 2930 PyObject *keys = PyMapping_Keys(b); 2931 PyObject *iter; 2932 PyObject *key, *value; 2933 int status; 2934 2935 if (keys == NULL) 2936 /* Docstring says this is equivalent to E.keys() so 2937 * if E doesn't have a .keys() method we want 2938 * AttributeError to percolate up. Might as well 2939 * do the same for any other error. 2940 */ 2941 return -1; 2942 2943 iter = PyObject_GetIter(keys); 2944 Py_DECREF(keys); 2945 if (iter == NULL) 2946 return -1; 2947 2948 for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) { 2949 if (override != 1) { 2950 status = PyDict_Contains(a, key); 2951 if (status != 0) { 2952 if (status > 0) { 2953 if (override == 0) { 2954 Py_DECREF(key); 2955 continue; 2956 } 2957 _PyErr_SetKeyError(key); 2958 } 2959 Py_DECREF(key); 2960 Py_DECREF(iter); 2961 return -1; 2962 } 2963 } 2964 value = PyObject_GetItem(b, key); 2965 if (value == NULL) { 2966 Py_DECREF(iter); 2967 Py_DECREF(key); 2968 return -1; 2969 } 2970 status = PyDict_SetItem(a, key, value); 2971 Py_DECREF(key); 2972 Py_DECREF(value); 2973 if (status < 0) { 2974 Py_DECREF(iter); 2975 return -1; 2976 } 2977 } 2978 Py_DECREF(iter); 2979 if (PyErr_Occurred()) 2980 /* Iterator completed, via error */ 2981 return -1; 2982 } 2983 ASSERT_CONSISTENT(a); 2984 return 0; 2985} 2986 2987int 2988PyDict_Update(PyObject *a, PyObject *b) 2989{ 2990 return dict_merge(a, b, 1); 2991} 2992 2993int 2994PyDict_Merge(PyObject *a, PyObject *b, int override) 2995{ 2996 /* XXX Deprecate override not in (0, 1). */ 2997 return dict_merge(a, b, override != 0); 2998} 2999 3000int 3001_PyDict_MergeEx(PyObject *a, PyObject *b, int override) 3002{ 3003 return dict_merge(a, b, override); 3004} 3005 3006static PyObject * 3007dict_copy(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) 3008{ 3009 return PyDict_Copy((PyObject*)mp); 3010} 3011 3012PyObject * 3013PyDict_Copy(PyObject *o) 3014{ 3015 PyObject *copy; 3016 PyDictObject *mp; 3017 Py_ssize_t i, n; 3018 3019 if (o == NULL || !PyDict_Check(o)) { 3020 PyErr_BadInternalCall(); 3021 return NULL; 3022 } 3023 3024 mp = (PyDictObject *)o; 3025 if (mp->ma_used == 0) { 3026 /* The dict is empty; just return a new dict. */ 3027 return PyDict_New(); 3028 } 3029 3030 if (_PyDict_HasSplitTable(mp)) { 3031 PyDictObject *split_copy; 3032 Py_ssize_t size = shared_keys_usable_size(mp->ma_keys); 3033 PyDictValues *newvalues; 3034 newvalues = new_values(size); 3035 if (newvalues == NULL) 3036 return PyErr_NoMemory(); 3037 split_copy = PyObject_GC_New(PyDictObject, &PyDict_Type); 3038 if (split_copy == NULL) { 3039 free_values(newvalues); 3040 return NULL; 3041 } 3042 size_t prefix_size = ((uint8_t *)newvalues)[-1]; 3043 memcpy(((char *)newvalues)-prefix_size, ((char *)mp->ma_values)-prefix_size, prefix_size-1); 3044 split_copy->ma_values = newvalues; 3045 split_copy->ma_keys = mp->ma_keys; 3046 split_copy->ma_used = mp->ma_used; 3047 split_copy->ma_version_tag = DICT_NEXT_VERSION(); 3048 dictkeys_incref(mp->ma_keys); 3049 for (i = 0, n = size; i < n; i++) { 3050 PyObject *value = mp->ma_values->values[i]; 3051 Py_XINCREF(value); 3052 split_copy->ma_values->values[i] = value; 3053 } 3054 if (_PyObject_GC_IS_TRACKED(mp)) 3055 _PyObject_GC_TRACK(split_copy); 3056 return (PyObject *)split_copy; 3057 } 3058 3059 if (Py_TYPE(mp)->tp_iter == (getiterfunc)dict_iter && 3060 mp->ma_values == NULL && 3061 (mp->ma_used >= (mp->ma_keys->dk_nentries * 2) / 3)) 3062 { 3063 /* Use fast-copy if: 3064 3065 (1) type(mp) doesn't override tp_iter; and 3066 3067 (2) 'mp' is not a split-dict; and 3068 3069 (3) if 'mp' is non-compact ('del' operation does not resize dicts), 3070 do fast-copy only if it has at most 1/3 non-used keys. 3071 3072 The last condition (3) is important to guard against a pathological 3073 case when a large dict is almost emptied with multiple del/pop 3074 operations and copied after that. In cases like this, we defer to 3075 PyDict_Merge, which produces a compacted copy. 3076 */ 3077 PyDictKeysObject *keys = clone_combined_dict_keys(mp); 3078 if (keys == NULL) { 3079 return NULL; 3080 } 3081 PyDictObject *new = (PyDictObject *)new_dict(keys, NULL, 0, 0); 3082 if (new == NULL) { 3083 /* In case of an error, `new_dict()` takes care of 3084 cleaning up `keys`. */ 3085 return NULL; 3086 } 3087 3088 new->ma_used = mp->ma_used; 3089 ASSERT_CONSISTENT(new); 3090 if (_PyObject_GC_IS_TRACKED(mp)) { 3091 /* Maintain tracking. */ 3092 _PyObject_GC_TRACK(new); 3093 } 3094 3095 return (PyObject *)new; 3096 } 3097 3098 copy = PyDict_New(); 3099 if (copy == NULL) 3100 return NULL; 3101 if (dict_merge(copy, o, 1) == 0) 3102 return copy; 3103 Py_DECREF(copy); 3104 return NULL; 3105} 3106 3107Py_ssize_t 3108PyDict_Size(PyObject *mp) 3109{ 3110 if (mp == NULL || !PyDict_Check(mp)) { 3111 PyErr_BadInternalCall(); 3112 return -1; 3113 } 3114 return ((PyDictObject *)mp)->ma_used; 3115} 3116 3117PyObject * 3118PyDict_Keys(PyObject *mp) 3119{ 3120 if (mp == NULL || !PyDict_Check(mp)) { 3121 PyErr_BadInternalCall(); 3122 return NULL; 3123 } 3124 return dict_keys((PyDictObject *)mp); 3125} 3126 3127PyObject * 3128PyDict_Values(PyObject *mp) 3129{ 3130 if (mp == NULL || !PyDict_Check(mp)) { 3131 PyErr_BadInternalCall(); 3132 return NULL; 3133 } 3134 return dict_values((PyDictObject *)mp); 3135} 3136 3137PyObject * 3138PyDict_Items(PyObject *mp) 3139{ 3140 if (mp == NULL || !PyDict_Check(mp)) { 3141 PyErr_BadInternalCall(); 3142 return NULL; 3143 } 3144 return dict_items((PyDictObject *)mp); 3145} 3146 3147/* Return 1 if dicts equal, 0 if not, -1 if error. 3148 * Gets out as soon as any difference is detected. 3149 * Uses only Py_EQ comparison. 3150 */ 3151static int 3152dict_equal(PyDictObject *a, PyDictObject *b) 3153{ 3154 Py_ssize_t i; 3155 3156 if (a->ma_used != b->ma_used) 3157 /* can't be equal if # of entries differ */ 3158 return 0; 3159 /* Same # of entries -- check all of 'em. Exit early on any diff. */ 3160 for (i = 0; i < a->ma_keys->dk_nentries; i++) { 3161 PyObject *key, *aval; 3162 Py_hash_t hash; 3163 if (DK_IS_UNICODE(a->ma_keys)) { 3164 PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(a->ma_keys)[i]; 3165 key = ep->me_key; 3166 if (key == NULL) { 3167 continue; 3168 } 3169 hash = unicode_get_hash(key); 3170 if (a->ma_values) 3171 aval = a->ma_values->values[i]; 3172 else 3173 aval = ep->me_value; 3174 } 3175 else { 3176 PyDictKeyEntry *ep = &DK_ENTRIES(a->ma_keys)[i]; 3177 key = ep->me_key; 3178 aval = ep->me_value; 3179 hash = ep->me_hash; 3180 } 3181 if (aval != NULL) { 3182 int cmp; 3183 PyObject *bval; 3184 /* temporarily bump aval's refcount to ensure it stays 3185 alive until we're done with it */ 3186 Py_INCREF(aval); 3187 /* ditto for key */ 3188 Py_INCREF(key); 3189 /* reuse the known hash value */ 3190 _Py_dict_lookup(b, key, hash, &bval); 3191 if (bval == NULL) { 3192 Py_DECREF(key); 3193 Py_DECREF(aval); 3194 if (PyErr_Occurred()) 3195 return -1; 3196 return 0; 3197 } 3198 Py_INCREF(bval); 3199 cmp = PyObject_RichCompareBool(aval, bval, Py_EQ); 3200 Py_DECREF(key); 3201 Py_DECREF(aval); 3202 Py_DECREF(bval); 3203 if (cmp <= 0) /* error or not equal */ 3204 return cmp; 3205 } 3206 } 3207 return 1; 3208} 3209 3210static PyObject * 3211dict_richcompare(PyObject *v, PyObject *w, int op) 3212{ 3213 int cmp; 3214 PyObject *res; 3215 3216 if (!PyDict_Check(v) || !PyDict_Check(w)) { 3217 res = Py_NotImplemented; 3218 } 3219 else if (op == Py_EQ || op == Py_NE) { 3220 cmp = dict_equal((PyDictObject *)v, (PyDictObject *)w); 3221 if (cmp < 0) 3222 return NULL; 3223 res = (cmp == (op == Py_EQ)) ? Py_True : Py_False; 3224 } 3225 else 3226 res = Py_NotImplemented; 3227 Py_INCREF(res); 3228 return res; 3229} 3230 3231/*[clinic input] 3232 3233@coexist 3234dict.__contains__ 3235 3236 key: object 3237 / 3238 3239True if the dictionary has the specified key, else False. 3240[clinic start generated code]*/ 3241 3242static PyObject * 3243dict___contains__(PyDictObject *self, PyObject *key) 3244/*[clinic end generated code: output=a3d03db709ed6e6b input=fe1cb42ad831e820]*/ 3245{ 3246 register PyDictObject *mp = self; 3247 Py_hash_t hash; 3248 Py_ssize_t ix; 3249 PyObject *value; 3250 3251 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 3252 hash = PyObject_Hash(key); 3253 if (hash == -1) 3254 return NULL; 3255 } 3256 ix = _Py_dict_lookup(mp, key, hash, &value); 3257 if (ix == DKIX_ERROR) 3258 return NULL; 3259 if (ix == DKIX_EMPTY || value == NULL) 3260 Py_RETURN_FALSE; 3261 Py_RETURN_TRUE; 3262} 3263 3264/*[clinic input] 3265dict.get 3266 3267 key: object 3268 default: object = None 3269 / 3270 3271Return the value for key if key is in the dictionary, else default. 3272[clinic start generated code]*/ 3273 3274static PyObject * 3275dict_get_impl(PyDictObject *self, PyObject *key, PyObject *default_value) 3276/*[clinic end generated code: output=bba707729dee05bf input=279ddb5790b6b107]*/ 3277{ 3278 PyObject *val = NULL; 3279 Py_hash_t hash; 3280 Py_ssize_t ix; 3281 3282 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 3283 hash = PyObject_Hash(key); 3284 if (hash == -1) 3285 return NULL; 3286 } 3287 ix = _Py_dict_lookup(self, key, hash, &val); 3288 if (ix == DKIX_ERROR) 3289 return NULL; 3290 if (ix == DKIX_EMPTY || val == NULL) { 3291 val = default_value; 3292 } 3293 Py_INCREF(val); 3294 return val; 3295} 3296 3297PyObject * 3298PyDict_SetDefault(PyObject *d, PyObject *key, PyObject *defaultobj) 3299{ 3300 PyDictObject *mp = (PyDictObject *)d; 3301 PyObject *value; 3302 Py_hash_t hash; 3303 3304 if (!PyDict_Check(d)) { 3305 PyErr_BadInternalCall(); 3306 return NULL; 3307 } 3308 3309 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 3310 hash = PyObject_Hash(key); 3311 if (hash == -1) 3312 return NULL; 3313 } 3314 3315 if (mp->ma_keys == Py_EMPTY_KEYS) { 3316 Py_INCREF(key); 3317 Py_INCREF(defaultobj); 3318 if (insert_to_emptydict(mp, key, hash, defaultobj) < 0) { 3319 return NULL; 3320 } 3321 return defaultobj; 3322 } 3323 3324 if (!PyUnicode_CheckExact(key) && DK_IS_UNICODE(mp->ma_keys)) { 3325 if (insertion_resize(mp, 0) < 0) { 3326 return NULL; 3327 } 3328 } 3329 3330 Py_ssize_t ix = _Py_dict_lookup(mp, key, hash, &value); 3331 if (ix == DKIX_ERROR) 3332 return NULL; 3333 3334 if (ix == DKIX_EMPTY) { 3335 mp->ma_keys->dk_version = 0; 3336 value = defaultobj; 3337 if (mp->ma_keys->dk_usable <= 0) { 3338 if (insertion_resize(mp, 1) < 0) { 3339 return NULL; 3340 } 3341 } 3342 Py_ssize_t hashpos = find_empty_slot(mp->ma_keys, hash); 3343 dictkeys_set_index(mp->ma_keys, hashpos, mp->ma_keys->dk_nentries); 3344 if (DK_IS_UNICODE(mp->ma_keys)) { 3345 assert(PyUnicode_CheckExact(key)); 3346 PyDictUnicodeEntry *ep = &DK_UNICODE_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries]; 3347 ep->me_key = key; 3348 if (_PyDict_HasSplitTable(mp)) { 3349 Py_ssize_t index = (int)mp->ma_keys->dk_nentries; 3350 assert(index < SHARED_KEYS_MAX_SIZE); 3351 assert(mp->ma_values->values[index] == NULL); 3352 mp->ma_values->values[index] = value; 3353 _PyDictValues_AddToInsertionOrder(mp->ma_values, index); 3354 } 3355 else { 3356 ep->me_value = value; 3357 } 3358 } 3359 else { 3360 PyDictKeyEntry *ep = &DK_ENTRIES(mp->ma_keys)[mp->ma_keys->dk_nentries]; 3361 ep->me_key = key; 3362 ep->me_hash = hash; 3363 ep->me_value = value; 3364 } 3365 Py_INCREF(key); 3366 Py_INCREF(value); 3367 MAINTAIN_TRACKING(mp, key, value); 3368 mp->ma_used++; 3369 mp->ma_version_tag = DICT_NEXT_VERSION(); 3370 mp->ma_keys->dk_usable--; 3371 mp->ma_keys->dk_nentries++; 3372 assert(mp->ma_keys->dk_usable >= 0); 3373 } 3374 else if (value == NULL) { 3375 value = defaultobj; 3376 assert(_PyDict_HasSplitTable(mp)); 3377 assert(mp->ma_values->values[ix] == NULL); 3378 Py_INCREF(value); 3379 MAINTAIN_TRACKING(mp, key, value); 3380 mp->ma_values->values[ix] = value; 3381 _PyDictValues_AddToInsertionOrder(mp->ma_values, ix); 3382 mp->ma_used++; 3383 mp->ma_version_tag = DICT_NEXT_VERSION(); 3384 } 3385 3386 ASSERT_CONSISTENT(mp); 3387 return value; 3388} 3389 3390/*[clinic input] 3391dict.setdefault 3392 3393 key: object 3394 default: object = None 3395 / 3396 3397Insert key with a value of default if key is not in the dictionary. 3398 3399Return the value for key if key is in the dictionary, else default. 3400[clinic start generated code]*/ 3401 3402static PyObject * 3403dict_setdefault_impl(PyDictObject *self, PyObject *key, 3404 PyObject *default_value) 3405/*[clinic end generated code: output=f8c1101ebf69e220 input=0f063756e815fd9d]*/ 3406{ 3407 PyObject *val; 3408 3409 val = PyDict_SetDefault((PyObject *)self, key, default_value); 3410 Py_XINCREF(val); 3411 return val; 3412} 3413 3414static PyObject * 3415dict_clear(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) 3416{ 3417 PyDict_Clear((PyObject *)mp); 3418 Py_RETURN_NONE; 3419} 3420 3421/*[clinic input] 3422dict.pop 3423 3424 key: object 3425 default: object = NULL 3426 / 3427 3428D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 3429 3430If the key is not found, return the default if given; otherwise, 3431raise a KeyError. 3432[clinic start generated code]*/ 3433 3434static PyObject * 3435dict_pop_impl(PyDictObject *self, PyObject *key, PyObject *default_value) 3436/*[clinic end generated code: output=3abb47b89f24c21c input=e221baa01044c44c]*/ 3437{ 3438 return _PyDict_Pop((PyObject*)self, key, default_value); 3439} 3440 3441/*[clinic input] 3442dict.popitem 3443 3444Remove and return a (key, value) pair as a 2-tuple. 3445 3446Pairs are returned in LIFO (last-in, first-out) order. 3447Raises KeyError if the dict is empty. 3448[clinic start generated code]*/ 3449 3450static PyObject * 3451dict_popitem_impl(PyDictObject *self) 3452/*[clinic end generated code: output=e65fcb04420d230d input=1c38a49f21f64941]*/ 3453{ 3454 Py_ssize_t i, j; 3455 PyObject *res; 3456 3457 /* Allocate the result tuple before checking the size. Believe it 3458 * or not, this allocation could trigger a garbage collection which 3459 * could empty the dict, so if we checked the size first and that 3460 * happened, the result would be an infinite loop (searching for an 3461 * entry that no longer exists). Note that the usual popitem() 3462 * idiom is "while d: k, v = d.popitem()". so needing to throw the 3463 * tuple away if the dict *is* empty isn't a significant 3464 * inefficiency -- possible, but unlikely in practice. 3465 */ 3466 res = PyTuple_New(2); 3467 if (res == NULL) 3468 return NULL; 3469 if (self->ma_used == 0) { 3470 Py_DECREF(res); 3471 PyErr_SetString(PyExc_KeyError, "popitem(): dictionary is empty"); 3472 return NULL; 3473 } 3474 /* Convert split table to combined table */ 3475 if (self->ma_keys->dk_kind == DICT_KEYS_SPLIT) { 3476 if (dictresize(self, DK_LOG_SIZE(self->ma_keys), 1)) { 3477 Py_DECREF(res); 3478 return NULL; 3479 } 3480 } 3481 self->ma_keys->dk_version = 0; 3482 3483 /* Pop last item */ 3484 PyObject *key, *value; 3485 Py_hash_t hash; 3486 if (DK_IS_UNICODE(self->ma_keys)) { 3487 PyDictUnicodeEntry *ep0 = DK_UNICODE_ENTRIES(self->ma_keys); 3488 i = self->ma_keys->dk_nentries - 1; 3489 while (i >= 0 && ep0[i].me_value == NULL) { 3490 i--; 3491 } 3492 assert(i >= 0); 3493 3494 key = ep0[i].me_key; 3495 hash = unicode_get_hash(key); 3496 value = ep0[i].me_value; 3497 ep0[i].me_key = NULL; 3498 ep0[i].me_value = NULL; 3499 } 3500 else { 3501 PyDictKeyEntry *ep0 = DK_ENTRIES(self->ma_keys); 3502 i = self->ma_keys->dk_nentries - 1; 3503 while (i >= 0 && ep0[i].me_value == NULL) { 3504 i--; 3505 } 3506 assert(i >= 0); 3507 3508 key = ep0[i].me_key; 3509 hash = ep0[i].me_hash; 3510 value = ep0[i].me_value; 3511 ep0[i].me_key = NULL; 3512 ep0[i].me_hash = -1; 3513 ep0[i].me_value = NULL; 3514 } 3515 3516 j = lookdict_index(self->ma_keys, hash, i); 3517 assert(j >= 0); 3518 assert(dictkeys_get_index(self->ma_keys, j) == i); 3519 dictkeys_set_index(self->ma_keys, j, DKIX_DUMMY); 3520 3521 PyTuple_SET_ITEM(res, 0, key); 3522 PyTuple_SET_ITEM(res, 1, value); 3523 /* We can't dk_usable++ since there is DKIX_DUMMY in indices */ 3524 self->ma_keys->dk_nentries = i; 3525 self->ma_used--; 3526 self->ma_version_tag = DICT_NEXT_VERSION(); 3527 ASSERT_CONSISTENT(self); 3528 return res; 3529} 3530 3531static int 3532dict_traverse(PyObject *op, visitproc visit, void *arg) 3533{ 3534 PyDictObject *mp = (PyDictObject *)op; 3535 PyDictKeysObject *keys = mp->ma_keys; 3536 Py_ssize_t i, n = keys->dk_nentries; 3537 3538 if (DK_IS_UNICODE(keys)) { 3539 if (mp->ma_values != NULL) { 3540 for (i = 0; i < n; i++) { 3541 Py_VISIT(mp->ma_values->values[i]); 3542 } 3543 } 3544 else { 3545 PyDictUnicodeEntry *entries = DK_UNICODE_ENTRIES(keys); 3546 for (i = 0; i < n; i++) { 3547 Py_VISIT(entries[i].me_value); 3548 } 3549 } 3550 } 3551 else { 3552 PyDictKeyEntry *entries = DK_ENTRIES(keys); 3553 for (i = 0; i < n; i++) { 3554 if (entries[i].me_value != NULL) { 3555 Py_VISIT(entries[i].me_value); 3556 Py_VISIT(entries[i].me_key); 3557 } 3558 } 3559 } 3560 return 0; 3561} 3562 3563static int 3564dict_tp_clear(PyObject *op) 3565{ 3566 PyDict_Clear(op); 3567 return 0; 3568} 3569 3570static PyObject *dictiter_new(PyDictObject *, PyTypeObject *); 3571 3572Py_ssize_t 3573_PyDict_SizeOf(PyDictObject *mp) 3574{ 3575 Py_ssize_t res; 3576 3577 res = _PyObject_SIZE(Py_TYPE(mp)); 3578 if (mp->ma_values) { 3579 res += shared_keys_usable_size(mp->ma_keys) * sizeof(PyObject*); 3580 } 3581 /* If the dictionary is split, the keys portion is accounted-for 3582 in the type object. */ 3583 if (mp->ma_keys->dk_refcnt == 1) { 3584 res += _PyDict_KeysSize(mp->ma_keys); 3585 } 3586 return res; 3587} 3588 3589Py_ssize_t 3590_PyDict_KeysSize(PyDictKeysObject *keys) 3591{ 3592 size_t es = keys->dk_kind == DICT_KEYS_GENERAL 3593 ? sizeof(PyDictKeyEntry) : sizeof(PyDictUnicodeEntry); 3594 return (sizeof(PyDictKeysObject) 3595 + ((size_t)1 << keys->dk_log2_index_bytes) 3596 + USABLE_FRACTION(DK_SIZE(keys)) * es); 3597} 3598 3599static PyObject * 3600dict_sizeof(PyDictObject *mp, PyObject *Py_UNUSED(ignored)) 3601{ 3602 return PyLong_FromSsize_t(_PyDict_SizeOf(mp)); 3603} 3604 3605static PyObject * 3606dict_or(PyObject *self, PyObject *other) 3607{ 3608 if (!PyDict_Check(self) || !PyDict_Check(other)) { 3609 Py_RETURN_NOTIMPLEMENTED; 3610 } 3611 PyObject *new = PyDict_Copy(self); 3612 if (new == NULL) { 3613 return NULL; 3614 } 3615 if (dict_update_arg(new, other)) { 3616 Py_DECREF(new); 3617 return NULL; 3618 } 3619 return new; 3620} 3621 3622static PyObject * 3623dict_ior(PyObject *self, PyObject *other) 3624{ 3625 if (dict_update_arg(self, other)) { 3626 return NULL; 3627 } 3628 Py_INCREF(self); 3629 return self; 3630} 3631 3632PyDoc_STRVAR(getitem__doc__, "x.__getitem__(y) <==> x[y]"); 3633 3634PyDoc_STRVAR(sizeof__doc__, 3635"D.__sizeof__() -> size of D in memory, in bytes"); 3636 3637PyDoc_STRVAR(update__doc__, 3638"D.update([E, ]**F) -> None. Update D from dict/iterable E and F.\n\ 3639If E is present and has a .keys() method, then does: for k in E: D[k] = E[k]\n\ 3640If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v\n\ 3641In either case, this is followed by: for k in F: D[k] = F[k]"); 3642 3643PyDoc_STRVAR(clear__doc__, 3644"D.clear() -> None. Remove all items from D."); 3645 3646PyDoc_STRVAR(copy__doc__, 3647"D.copy() -> a shallow copy of D"); 3648 3649/* Forward */ 3650static PyObject *dictkeys_new(PyObject *, PyObject *); 3651static PyObject *dictitems_new(PyObject *, PyObject *); 3652static PyObject *dictvalues_new(PyObject *, PyObject *); 3653 3654PyDoc_STRVAR(keys__doc__, 3655 "D.keys() -> a set-like object providing a view on D's keys"); 3656PyDoc_STRVAR(items__doc__, 3657 "D.items() -> a set-like object providing a view on D's items"); 3658PyDoc_STRVAR(values__doc__, 3659 "D.values() -> an object providing a view on D's values"); 3660 3661static PyMethodDef mapp_methods[] = { 3662 DICT___CONTAINS___METHODDEF 3663 {"__getitem__", _PyCFunction_CAST(dict_subscript), METH_O | METH_COEXIST, 3664 getitem__doc__}, 3665 {"__sizeof__", _PyCFunction_CAST(dict_sizeof), METH_NOARGS, 3666 sizeof__doc__}, 3667 DICT_GET_METHODDEF 3668 DICT_SETDEFAULT_METHODDEF 3669 DICT_POP_METHODDEF 3670 DICT_POPITEM_METHODDEF 3671 {"keys", dictkeys_new, METH_NOARGS, 3672 keys__doc__}, 3673 {"items", dictitems_new, METH_NOARGS, 3674 items__doc__}, 3675 {"values", dictvalues_new, METH_NOARGS, 3676 values__doc__}, 3677 {"update", _PyCFunction_CAST(dict_update), METH_VARARGS | METH_KEYWORDS, 3678 update__doc__}, 3679 DICT_FROMKEYS_METHODDEF 3680 {"clear", (PyCFunction)dict_clear, METH_NOARGS, 3681 clear__doc__}, 3682 {"copy", (PyCFunction)dict_copy, METH_NOARGS, 3683 copy__doc__}, 3684 DICT___REVERSED___METHODDEF 3685 {"__class_getitem__", Py_GenericAlias, METH_O|METH_CLASS, PyDoc_STR("See PEP 585")}, 3686 {NULL, NULL} /* sentinel */ 3687}; 3688 3689/* Return 1 if `key` is in dict `op`, 0 if not, and -1 on error. */ 3690int 3691PyDict_Contains(PyObject *op, PyObject *key) 3692{ 3693 Py_hash_t hash; 3694 Py_ssize_t ix; 3695 PyDictObject *mp = (PyDictObject *)op; 3696 PyObject *value; 3697 3698 if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) { 3699 hash = PyObject_Hash(key); 3700 if (hash == -1) 3701 return -1; 3702 } 3703 ix = _Py_dict_lookup(mp, key, hash, &value); 3704 if (ix == DKIX_ERROR) 3705 return -1; 3706 return (ix != DKIX_EMPTY && value != NULL); 3707} 3708 3709/* Internal version of PyDict_Contains used when the hash value is already known */ 3710int 3711_PyDict_Contains_KnownHash(PyObject *op, PyObject *key, Py_hash_t hash) 3712{ 3713 PyDictObject *mp = (PyDictObject *)op; 3714 PyObject *value; 3715 Py_ssize_t ix; 3716 3717 ix = _Py_dict_lookup(mp, key, hash, &value); 3718 if (ix == DKIX_ERROR) 3719 return -1; 3720 return (ix != DKIX_EMPTY && value != NULL); 3721} 3722 3723int 3724_PyDict_ContainsId(PyObject *op, _Py_Identifier *key) 3725{ 3726 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */ 3727 if (kv == NULL) { 3728 return -1; 3729 } 3730 return PyDict_Contains(op, kv); 3731} 3732 3733/* Hack to implement "key in dict" */ 3734static PySequenceMethods dict_as_sequence = { 3735 0, /* sq_length */ 3736 0, /* sq_concat */ 3737 0, /* sq_repeat */ 3738 0, /* sq_item */ 3739 0, /* sq_slice */ 3740 0, /* sq_ass_item */ 3741 0, /* sq_ass_slice */ 3742 PyDict_Contains, /* sq_contains */ 3743 0, /* sq_inplace_concat */ 3744 0, /* sq_inplace_repeat */ 3745}; 3746 3747static PyNumberMethods dict_as_number = { 3748 .nb_or = dict_or, 3749 .nb_inplace_or = dict_ior, 3750}; 3751 3752static PyObject * 3753dict_new(PyTypeObject *type, PyObject *args, PyObject *kwds) 3754{ 3755 assert(type != NULL); 3756 assert(type->tp_alloc != NULL); 3757 // dict subclasses must implement the GC protocol 3758 assert(_PyType_IS_GC(type)); 3759 3760 PyObject *self = type->tp_alloc(type, 0); 3761 if (self == NULL) { 3762 return NULL; 3763 } 3764 PyDictObject *d = (PyDictObject *)self; 3765 3766 d->ma_used = 0; 3767 d->ma_version_tag = DICT_NEXT_VERSION(); 3768 dictkeys_incref(Py_EMPTY_KEYS); 3769 d->ma_keys = Py_EMPTY_KEYS; 3770 d->ma_values = NULL; 3771 ASSERT_CONSISTENT(d); 3772 3773 if (type != &PyDict_Type) { 3774 // Don't track if a subclass tp_alloc is PyType_GenericAlloc() 3775 if (!_PyObject_GC_IS_TRACKED(d)) { 3776 _PyObject_GC_TRACK(d); 3777 } 3778 } 3779 else { 3780 // _PyType_AllocNoTrack() does not track the created object 3781 assert(!_PyObject_GC_IS_TRACKED(d)); 3782 } 3783 return self; 3784} 3785 3786static int 3787dict_init(PyObject *self, PyObject *args, PyObject *kwds) 3788{ 3789 return dict_update_common(self, args, kwds, "dict"); 3790} 3791 3792static PyObject * 3793dict_vectorcall(PyObject *type, PyObject * const*args, 3794 size_t nargsf, PyObject *kwnames) 3795{ 3796 Py_ssize_t nargs = PyVectorcall_NARGS(nargsf); 3797 if (!_PyArg_CheckPositional("dict", nargs, 0, 1)) { 3798 return NULL; 3799 } 3800 3801 PyObject *self = dict_new(_PyType_CAST(type), NULL, NULL); 3802 if (self == NULL) { 3803 return NULL; 3804 } 3805 if (nargs == 1) { 3806 if (dict_update_arg(self, args[0]) < 0) { 3807 Py_DECREF(self); 3808 return NULL; 3809 } 3810 args++; 3811 } 3812 if (kwnames != NULL) { 3813 for (Py_ssize_t i = 0; i < PyTuple_GET_SIZE(kwnames); i++) { 3814 if (PyDict_SetItem(self, PyTuple_GET_ITEM(kwnames, i), args[i]) < 0) { 3815 Py_DECREF(self); 3816 return NULL; 3817 } 3818 } 3819 } 3820 return self; 3821} 3822 3823static PyObject * 3824dict_iter(PyDictObject *dict) 3825{ 3826 return dictiter_new(dict, &PyDictIterKey_Type); 3827} 3828 3829PyDoc_STRVAR(dictionary_doc, 3830"dict() -> new empty dictionary\n" 3831"dict(mapping) -> new dictionary initialized from a mapping object's\n" 3832" (key, value) pairs\n" 3833"dict(iterable) -> new dictionary initialized as if via:\n" 3834" d = {}\n" 3835" for k, v in iterable:\n" 3836" d[k] = v\n" 3837"dict(**kwargs) -> new dictionary initialized with the name=value pairs\n" 3838" in the keyword argument list. For example: dict(one=1, two=2)"); 3839 3840PyTypeObject PyDict_Type = { 3841 PyVarObject_HEAD_INIT(&PyType_Type, 0) 3842 "dict", 3843 sizeof(PyDictObject), 3844 0, 3845 (destructor)dict_dealloc, /* tp_dealloc */ 3846 0, /* tp_vectorcall_offset */ 3847 0, /* tp_getattr */ 3848 0, /* tp_setattr */ 3849 0, /* tp_as_async */ 3850 (reprfunc)dict_repr, /* tp_repr */ 3851 &dict_as_number, /* tp_as_number */ 3852 &dict_as_sequence, /* tp_as_sequence */ 3853 &dict_as_mapping, /* tp_as_mapping */ 3854 PyObject_HashNotImplemented, /* tp_hash */ 3855 0, /* tp_call */ 3856 0, /* tp_str */ 3857 PyObject_GenericGetAttr, /* tp_getattro */ 3858 0, /* tp_setattro */ 3859 0, /* tp_as_buffer */ 3860 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | 3861 Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DICT_SUBCLASS | 3862 _Py_TPFLAGS_MATCH_SELF | Py_TPFLAGS_MAPPING, /* tp_flags */ 3863 dictionary_doc, /* tp_doc */ 3864 dict_traverse, /* tp_traverse */ 3865 dict_tp_clear, /* tp_clear */ 3866 dict_richcompare, /* tp_richcompare */ 3867 0, /* tp_weaklistoffset */ 3868 (getiterfunc)dict_iter, /* tp_iter */ 3869 0, /* tp_iternext */ 3870 mapp_methods, /* tp_methods */ 3871 0, /* tp_members */ 3872 0, /* tp_getset */ 3873 0, /* tp_base */ 3874 0, /* tp_dict */ 3875 0, /* tp_descr_get */ 3876 0, /* tp_descr_set */ 3877 0, /* tp_dictoffset */ 3878 dict_init, /* tp_init */ 3879 _PyType_AllocNoTrack, /* tp_alloc */ 3880 dict_new, /* tp_new */ 3881 PyObject_GC_Del, /* tp_free */ 3882 .tp_vectorcall = dict_vectorcall, 3883}; 3884 3885/* For backward compatibility with old dictionary interface */ 3886 3887PyObject * 3888PyDict_GetItemString(PyObject *v, const char *key) 3889{ 3890 PyObject *kv, *rv; 3891 kv = PyUnicode_FromString(key); 3892 if (kv == NULL) { 3893 PyErr_Clear(); 3894 return NULL; 3895 } 3896 rv = PyDict_GetItem(v, kv); 3897 Py_DECREF(kv); 3898 return rv; 3899} 3900 3901int 3902_PyDict_SetItemId(PyObject *v, _Py_Identifier *key, PyObject *item) 3903{ 3904 PyObject *kv; 3905 kv = _PyUnicode_FromId(key); /* borrowed */ 3906 if (kv == NULL) 3907 return -1; 3908 return PyDict_SetItem(v, kv, item); 3909} 3910 3911int 3912PyDict_SetItemString(PyObject *v, const char *key, PyObject *item) 3913{ 3914 PyObject *kv; 3915 int err; 3916 kv = PyUnicode_FromString(key); 3917 if (kv == NULL) 3918 return -1; 3919 PyUnicode_InternInPlace(&kv); /* XXX Should we really? */ 3920 err = PyDict_SetItem(v, kv, item); 3921 Py_DECREF(kv); 3922 return err; 3923} 3924 3925int 3926_PyDict_DelItemId(PyObject *v, _Py_Identifier *key) 3927{ 3928 PyObject *kv = _PyUnicode_FromId(key); /* borrowed */ 3929 if (kv == NULL) 3930 return -1; 3931 return PyDict_DelItem(v, kv); 3932} 3933 3934int 3935PyDict_DelItemString(PyObject *v, const char *key) 3936{ 3937 PyObject *kv; 3938 int err; 3939 kv = PyUnicode_FromString(key); 3940 if (kv == NULL) 3941 return -1; 3942 err = PyDict_DelItem(v, kv); 3943 Py_DECREF(kv); 3944 return err; 3945} 3946 3947/* Dictionary iterator types */ 3948 3949typedef struct { 3950 PyObject_HEAD 3951 PyDictObject *di_dict; /* Set to NULL when iterator is exhausted */ 3952 Py_ssize_t di_used; 3953 Py_ssize_t di_pos; 3954 PyObject* di_result; /* reusable result tuple for iteritems */ 3955 Py_ssize_t len; 3956} dictiterobject; 3957 3958static PyObject * 3959dictiter_new(PyDictObject *dict, PyTypeObject *itertype) 3960{ 3961 dictiterobject *di; 3962 di = PyObject_GC_New(dictiterobject, itertype); 3963 if (di == NULL) { 3964 return NULL; 3965 } 3966 Py_INCREF(dict); 3967 di->di_dict = dict; 3968 di->di_used = dict->ma_used; 3969 di->len = dict->ma_used; 3970 if (itertype == &PyDictRevIterKey_Type || 3971 itertype == &PyDictRevIterItem_Type || 3972 itertype == &PyDictRevIterValue_Type) { 3973 if (dict->ma_values) { 3974 di->di_pos = dict->ma_used - 1; 3975 } 3976 else { 3977 di->di_pos = dict->ma_keys->dk_nentries - 1; 3978 } 3979 } 3980 else { 3981 di->di_pos = 0; 3982 } 3983 if (itertype == &PyDictIterItem_Type || 3984 itertype == &PyDictRevIterItem_Type) { 3985 di->di_result = PyTuple_Pack(2, Py_None, Py_None); 3986 if (di->di_result == NULL) { 3987 Py_DECREF(di); 3988 return NULL; 3989 } 3990 } 3991 else { 3992 di->di_result = NULL; 3993 } 3994 _PyObject_GC_TRACK(di); 3995 return (PyObject *)di; 3996} 3997 3998static void 3999dictiter_dealloc(dictiterobject *di) 4000{ 4001 /* bpo-31095: UnTrack is needed before calling any callbacks */ 4002 _PyObject_GC_UNTRACK(di); 4003 Py_XDECREF(di->di_dict); 4004 Py_XDECREF(di->di_result); 4005 PyObject_GC_Del(di); 4006} 4007 4008static int 4009dictiter_traverse(dictiterobject *di, visitproc visit, void *arg) 4010{ 4011 Py_VISIT(di->di_dict); 4012 Py_VISIT(di->di_result); 4013 return 0; 4014} 4015 4016static PyObject * 4017dictiter_len(dictiterobject *di, PyObject *Py_UNUSED(ignored)) 4018{ 4019 Py_ssize_t len = 0; 4020 if (di->di_dict != NULL && di->di_used == di->di_dict->ma_used) 4021 len = di->len; 4022 return PyLong_FromSize_t(len); 4023} 4024 4025PyDoc_STRVAR(length_hint_doc, 4026 "Private method returning an estimate of len(list(it))."); 4027 4028static PyObject * 4029dictiter_reduce(dictiterobject *di, PyObject *Py_UNUSED(ignored)); 4030 4031PyDoc_STRVAR(reduce_doc, "Return state information for pickling."); 4032 4033static PyMethodDef dictiter_methods[] = { 4034 {"__length_hint__", _PyCFunction_CAST(dictiter_len), METH_NOARGS, 4035 length_hint_doc}, 4036 {"__reduce__", _PyCFunction_CAST(dictiter_reduce), METH_NOARGS, 4037 reduce_doc}, 4038 {NULL, NULL} /* sentinel */ 4039}; 4040 4041static PyObject* 4042dictiter_iternextkey(dictiterobject *di) 4043{ 4044 PyObject *key; 4045 Py_ssize_t i; 4046 PyDictKeysObject *k; 4047 PyDictObject *d = di->di_dict; 4048 4049 if (d == NULL) 4050 return NULL; 4051 assert (PyDict_Check(d)); 4052 4053 if (di->di_used != d->ma_used) { 4054 PyErr_SetString(PyExc_RuntimeError, 4055 "dictionary changed size during iteration"); 4056 di->di_used = -1; /* Make this state sticky */ 4057 return NULL; 4058 } 4059 4060 i = di->di_pos; 4061 k = d->ma_keys; 4062 assert(i >= 0); 4063 if (d->ma_values) { 4064 if (i >= d->ma_used) 4065 goto fail; 4066 int index = get_index_from_order(d, i); 4067 key = DK_UNICODE_ENTRIES(k)[index].me_key; 4068 assert(d->ma_values->values[index] != NULL); 4069 } 4070 else { 4071 Py_ssize_t n = k->dk_nentries; 4072 if (DK_IS_UNICODE(k)) { 4073 PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(k)[i]; 4074 while (i < n && entry_ptr->me_value == NULL) { 4075 entry_ptr++; 4076 i++; 4077 } 4078 if (i >= n) 4079 goto fail; 4080 key = entry_ptr->me_key; 4081 } 4082 else { 4083 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i]; 4084 while (i < n && entry_ptr->me_value == NULL) { 4085 entry_ptr++; 4086 i++; 4087 } 4088 if (i >= n) 4089 goto fail; 4090 key = entry_ptr->me_key; 4091 } 4092 } 4093 // We found an element (key), but did not expect it 4094 if (di->len == 0) { 4095 PyErr_SetString(PyExc_RuntimeError, 4096 "dictionary keys changed during iteration"); 4097 goto fail; 4098 } 4099 di->di_pos = i+1; 4100 di->len--; 4101 Py_INCREF(key); 4102 return key; 4103 4104fail: 4105 di->di_dict = NULL; 4106 Py_DECREF(d); 4107 return NULL; 4108} 4109 4110PyTypeObject PyDictIterKey_Type = { 4111 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4112 "dict_keyiterator", /* tp_name */ 4113 sizeof(dictiterobject), /* tp_basicsize */ 4114 0, /* tp_itemsize */ 4115 /* methods */ 4116 (destructor)dictiter_dealloc, /* tp_dealloc */ 4117 0, /* tp_vectorcall_offset */ 4118 0, /* tp_getattr */ 4119 0, /* tp_setattr */ 4120 0, /* tp_as_async */ 4121 0, /* tp_repr */ 4122 0, /* tp_as_number */ 4123 0, /* tp_as_sequence */ 4124 0, /* tp_as_mapping */ 4125 0, /* tp_hash */ 4126 0, /* tp_call */ 4127 0, /* tp_str */ 4128 PyObject_GenericGetAttr, /* tp_getattro */ 4129 0, /* tp_setattro */ 4130 0, /* tp_as_buffer */ 4131 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 4132 0, /* tp_doc */ 4133 (traverseproc)dictiter_traverse, /* tp_traverse */ 4134 0, /* tp_clear */ 4135 0, /* tp_richcompare */ 4136 0, /* tp_weaklistoffset */ 4137 PyObject_SelfIter, /* tp_iter */ 4138 (iternextfunc)dictiter_iternextkey, /* tp_iternext */ 4139 dictiter_methods, /* tp_methods */ 4140 0, 4141}; 4142 4143static PyObject * 4144dictiter_iternextvalue(dictiterobject *di) 4145{ 4146 PyObject *value; 4147 Py_ssize_t i; 4148 PyDictObject *d = di->di_dict; 4149 4150 if (d == NULL) 4151 return NULL; 4152 assert (PyDict_Check(d)); 4153 4154 if (di->di_used != d->ma_used) { 4155 PyErr_SetString(PyExc_RuntimeError, 4156 "dictionary changed size during iteration"); 4157 di->di_used = -1; /* Make this state sticky */ 4158 return NULL; 4159 } 4160 4161 i = di->di_pos; 4162 assert(i >= 0); 4163 if (d->ma_values) { 4164 if (i >= d->ma_used) 4165 goto fail; 4166 int index = get_index_from_order(d, i); 4167 value = d->ma_values->values[index]; 4168 assert(value != NULL); 4169 } 4170 else { 4171 Py_ssize_t n = d->ma_keys->dk_nentries; 4172 if (DK_IS_UNICODE(d->ma_keys)) { 4173 PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(d->ma_keys)[i]; 4174 while (i < n && entry_ptr->me_value == NULL) { 4175 entry_ptr++; 4176 i++; 4177 } 4178 if (i >= n) 4179 goto fail; 4180 value = entry_ptr->me_value; 4181 } 4182 else { 4183 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i]; 4184 while (i < n && entry_ptr->me_value == NULL) { 4185 entry_ptr++; 4186 i++; 4187 } 4188 if (i >= n) 4189 goto fail; 4190 value = entry_ptr->me_value; 4191 } 4192 } 4193 // We found an element, but did not expect it 4194 if (di->len == 0) { 4195 PyErr_SetString(PyExc_RuntimeError, 4196 "dictionary keys changed during iteration"); 4197 goto fail; 4198 } 4199 di->di_pos = i+1; 4200 di->len--; 4201 Py_INCREF(value); 4202 return value; 4203 4204fail: 4205 di->di_dict = NULL; 4206 Py_DECREF(d); 4207 return NULL; 4208} 4209 4210PyTypeObject PyDictIterValue_Type = { 4211 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4212 "dict_valueiterator", /* tp_name */ 4213 sizeof(dictiterobject), /* tp_basicsize */ 4214 0, /* tp_itemsize */ 4215 /* methods */ 4216 (destructor)dictiter_dealloc, /* tp_dealloc */ 4217 0, /* tp_vectorcall_offset */ 4218 0, /* tp_getattr */ 4219 0, /* tp_setattr */ 4220 0, /* tp_as_async */ 4221 0, /* tp_repr */ 4222 0, /* tp_as_number */ 4223 0, /* tp_as_sequence */ 4224 0, /* tp_as_mapping */ 4225 0, /* tp_hash */ 4226 0, /* tp_call */ 4227 0, /* tp_str */ 4228 PyObject_GenericGetAttr, /* tp_getattro */ 4229 0, /* tp_setattro */ 4230 0, /* tp_as_buffer */ 4231 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /* tp_flags */ 4232 0, /* tp_doc */ 4233 (traverseproc)dictiter_traverse, /* tp_traverse */ 4234 0, /* tp_clear */ 4235 0, /* tp_richcompare */ 4236 0, /* tp_weaklistoffset */ 4237 PyObject_SelfIter, /* tp_iter */ 4238 (iternextfunc)dictiter_iternextvalue, /* tp_iternext */ 4239 dictiter_methods, /* tp_methods */ 4240 0, 4241}; 4242 4243static PyObject * 4244dictiter_iternextitem(dictiterobject *di) 4245{ 4246 PyObject *key, *value, *result; 4247 Py_ssize_t i; 4248 PyDictObject *d = di->di_dict; 4249 4250 if (d == NULL) 4251 return NULL; 4252 assert (PyDict_Check(d)); 4253 4254 if (di->di_used != d->ma_used) { 4255 PyErr_SetString(PyExc_RuntimeError, 4256 "dictionary changed size during iteration"); 4257 di->di_used = -1; /* Make this state sticky */ 4258 return NULL; 4259 } 4260 4261 i = di->di_pos; 4262 assert(i >= 0); 4263 if (d->ma_values) { 4264 if (i >= d->ma_used) 4265 goto fail; 4266 int index = get_index_from_order(d, i); 4267 key = DK_UNICODE_ENTRIES(d->ma_keys)[index].me_key; 4268 value = d->ma_values->values[index]; 4269 assert(value != NULL); 4270 } 4271 else { 4272 Py_ssize_t n = d->ma_keys->dk_nentries; 4273 if (DK_IS_UNICODE(d->ma_keys)) { 4274 PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(d->ma_keys)[i]; 4275 while (i < n && entry_ptr->me_value == NULL) { 4276 entry_ptr++; 4277 i++; 4278 } 4279 if (i >= n) 4280 goto fail; 4281 key = entry_ptr->me_key; 4282 value = entry_ptr->me_value; 4283 } 4284 else { 4285 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(d->ma_keys)[i]; 4286 while (i < n && entry_ptr->me_value == NULL) { 4287 entry_ptr++; 4288 i++; 4289 } 4290 if (i >= n) 4291 goto fail; 4292 key = entry_ptr->me_key; 4293 value = entry_ptr->me_value; 4294 } 4295 } 4296 // We found an element, but did not expect it 4297 if (di->len == 0) { 4298 PyErr_SetString(PyExc_RuntimeError, 4299 "dictionary keys changed during iteration"); 4300 goto fail; 4301 } 4302 di->di_pos = i+1; 4303 di->len--; 4304 Py_INCREF(key); 4305 Py_INCREF(value); 4306 result = di->di_result; 4307 if (Py_REFCNT(result) == 1) { 4308 PyObject *oldkey = PyTuple_GET_ITEM(result, 0); 4309 PyObject *oldvalue = PyTuple_GET_ITEM(result, 1); 4310 PyTuple_SET_ITEM(result, 0, key); /* steals reference */ 4311 PyTuple_SET_ITEM(result, 1, value); /* steals reference */ 4312 Py_INCREF(result); 4313 Py_DECREF(oldkey); 4314 Py_DECREF(oldvalue); 4315 // bpo-42536: The GC may have untracked this result tuple. Since we're 4316 // recycling it, make sure it's tracked again: 4317 if (!_PyObject_GC_IS_TRACKED(result)) { 4318 _PyObject_GC_TRACK(result); 4319 } 4320 } 4321 else { 4322 result = PyTuple_New(2); 4323 if (result == NULL) 4324 return NULL; 4325 PyTuple_SET_ITEM(result, 0, key); /* steals reference */ 4326 PyTuple_SET_ITEM(result, 1, value); /* steals reference */ 4327 } 4328 return result; 4329 4330fail: 4331 di->di_dict = NULL; 4332 Py_DECREF(d); 4333 return NULL; 4334} 4335 4336PyTypeObject PyDictIterItem_Type = { 4337 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4338 "dict_itemiterator", /* tp_name */ 4339 sizeof(dictiterobject), /* tp_basicsize */ 4340 0, /* tp_itemsize */ 4341 /* methods */ 4342 (destructor)dictiter_dealloc, /* tp_dealloc */ 4343 0, /* tp_vectorcall_offset */ 4344 0, /* tp_getattr */ 4345 0, /* tp_setattr */ 4346 0, /* tp_as_async */ 4347 0, /* tp_repr */ 4348 0, /* tp_as_number */ 4349 0, /* tp_as_sequence */ 4350 0, /* tp_as_mapping */ 4351 0, /* tp_hash */ 4352 0, /* tp_call */ 4353 0, /* tp_str */ 4354 PyObject_GenericGetAttr, /* tp_getattro */ 4355 0, /* tp_setattro */ 4356 0, /* tp_as_buffer */ 4357 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 4358 0, /* tp_doc */ 4359 (traverseproc)dictiter_traverse, /* tp_traverse */ 4360 0, /* tp_clear */ 4361 0, /* tp_richcompare */ 4362 0, /* tp_weaklistoffset */ 4363 PyObject_SelfIter, /* tp_iter */ 4364 (iternextfunc)dictiter_iternextitem, /* tp_iternext */ 4365 dictiter_methods, /* tp_methods */ 4366 0, 4367}; 4368 4369 4370/* dictreviter */ 4371 4372static PyObject * 4373dictreviter_iternext(dictiterobject *di) 4374{ 4375 PyDictObject *d = di->di_dict; 4376 4377 if (d == NULL) { 4378 return NULL; 4379 } 4380 assert (PyDict_Check(d)); 4381 4382 if (di->di_used != d->ma_used) { 4383 PyErr_SetString(PyExc_RuntimeError, 4384 "dictionary changed size during iteration"); 4385 di->di_used = -1; /* Make this state sticky */ 4386 return NULL; 4387 } 4388 4389 Py_ssize_t i = di->di_pos; 4390 PyDictKeysObject *k = d->ma_keys; 4391 PyObject *key, *value, *result; 4392 4393 if (i < 0) { 4394 goto fail; 4395 } 4396 if (d->ma_values) { 4397 int index = get_index_from_order(d, i); 4398 key = DK_UNICODE_ENTRIES(k)[index].me_key; 4399 value = d->ma_values->values[index]; 4400 assert (value != NULL); 4401 } 4402 else { 4403 if (DK_IS_UNICODE(k)) { 4404 PyDictUnicodeEntry *entry_ptr = &DK_UNICODE_ENTRIES(k)[i]; 4405 while (entry_ptr->me_value == NULL) { 4406 if (--i < 0) { 4407 goto fail; 4408 } 4409 entry_ptr--; 4410 } 4411 key = entry_ptr->me_key; 4412 value = entry_ptr->me_value; 4413 } 4414 else { 4415 PyDictKeyEntry *entry_ptr = &DK_ENTRIES(k)[i]; 4416 while (entry_ptr->me_value == NULL) { 4417 if (--i < 0) { 4418 goto fail; 4419 } 4420 entry_ptr--; 4421 } 4422 key = entry_ptr->me_key; 4423 value = entry_ptr->me_value; 4424 } 4425 } 4426 di->di_pos = i-1; 4427 di->len--; 4428 4429 if (Py_IS_TYPE(di, &PyDictRevIterKey_Type)) { 4430 Py_INCREF(key); 4431 return key; 4432 } 4433 else if (Py_IS_TYPE(di, &PyDictRevIterValue_Type)) { 4434 Py_INCREF(value); 4435 return value; 4436 } 4437 else if (Py_IS_TYPE(di, &PyDictRevIterItem_Type)) { 4438 Py_INCREF(key); 4439 Py_INCREF(value); 4440 result = di->di_result; 4441 if (Py_REFCNT(result) == 1) { 4442 PyObject *oldkey = PyTuple_GET_ITEM(result, 0); 4443 PyObject *oldvalue = PyTuple_GET_ITEM(result, 1); 4444 PyTuple_SET_ITEM(result, 0, key); /* steals reference */ 4445 PyTuple_SET_ITEM(result, 1, value); /* steals reference */ 4446 Py_INCREF(result); 4447 Py_DECREF(oldkey); 4448 Py_DECREF(oldvalue); 4449 // bpo-42536: The GC may have untracked this result tuple. Since 4450 // we're recycling it, make sure it's tracked again: 4451 if (!_PyObject_GC_IS_TRACKED(result)) { 4452 _PyObject_GC_TRACK(result); 4453 } 4454 } 4455 else { 4456 result = PyTuple_New(2); 4457 if (result == NULL) { 4458 return NULL; 4459 } 4460 PyTuple_SET_ITEM(result, 0, key); /* steals reference */ 4461 PyTuple_SET_ITEM(result, 1, value); /* steals reference */ 4462 } 4463 return result; 4464 } 4465 else { 4466 Py_UNREACHABLE(); 4467 } 4468 4469fail: 4470 di->di_dict = NULL; 4471 Py_DECREF(d); 4472 return NULL; 4473} 4474 4475PyTypeObject PyDictRevIterKey_Type = { 4476 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4477 "dict_reversekeyiterator", 4478 sizeof(dictiterobject), 4479 .tp_dealloc = (destructor)dictiter_dealloc, 4480 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, 4481 .tp_traverse = (traverseproc)dictiter_traverse, 4482 .tp_iter = PyObject_SelfIter, 4483 .tp_iternext = (iternextfunc)dictreviter_iternext, 4484 .tp_methods = dictiter_methods 4485}; 4486 4487 4488/*[clinic input] 4489dict.__reversed__ 4490 4491Return a reverse iterator over the dict keys. 4492[clinic start generated code]*/ 4493 4494static PyObject * 4495dict___reversed___impl(PyDictObject *self) 4496/*[clinic end generated code: output=e674483336d1ed51 input=23210ef3477d8c4d]*/ 4497{ 4498 assert (PyDict_Check(self)); 4499 return dictiter_new(self, &PyDictRevIterKey_Type); 4500} 4501 4502static PyObject * 4503dictiter_reduce(dictiterobject *di, PyObject *Py_UNUSED(ignored)) 4504{ 4505 /* copy the iterator state */ 4506 dictiterobject tmp = *di; 4507 Py_XINCREF(tmp.di_dict); 4508 4509 PyObject *list = PySequence_List((PyObject*)&tmp); 4510 Py_XDECREF(tmp.di_dict); 4511 if (list == NULL) { 4512 return NULL; 4513 } 4514 return Py_BuildValue("N(N)", _PyEval_GetBuiltin(&_Py_ID(iter)), list); 4515} 4516 4517PyTypeObject PyDictRevIterItem_Type = { 4518 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4519 "dict_reverseitemiterator", 4520 sizeof(dictiterobject), 4521 .tp_dealloc = (destructor)dictiter_dealloc, 4522 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, 4523 .tp_traverse = (traverseproc)dictiter_traverse, 4524 .tp_iter = PyObject_SelfIter, 4525 .tp_iternext = (iternextfunc)dictreviter_iternext, 4526 .tp_methods = dictiter_methods 4527}; 4528 4529PyTypeObject PyDictRevIterValue_Type = { 4530 PyVarObject_HEAD_INIT(&PyType_Type, 0) 4531 "dict_reversevalueiterator", 4532 sizeof(dictiterobject), 4533 .tp_dealloc = (destructor)dictiter_dealloc, 4534 .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, 4535 .tp_traverse = (traverseproc)dictiter_traverse, 4536 .tp_iter = PyObject_SelfIter, 4537 .tp_iternext = (iternextfunc)dictreviter_iternext, 4538 .tp_methods = dictiter_methods 4539}; 4540 4541/***********************************************/ 4542/* View objects for keys(), items(), values(). */ 4543/***********************************************/ 4544 4545/* The instance lay-out is the same for all three; but the type differs. */ 4546 4547static void 4548dictview_dealloc(_PyDictViewObject *dv) 4549{ 4550 /* bpo-31095: UnTrack is needed before calling any callbacks */ 4551 _PyObject_GC_UNTRACK(dv); 4552 Py_XDECREF(dv->dv_dict); 4553 PyObject_GC_Del(dv); 4554} 4555 4556static int 4557dictview_traverse(_PyDictViewObject *dv, visitproc visit, void *arg) 4558{ 4559 Py_VISIT(dv->dv_dict); 4560 return 0; 4561} 4562 4563static Py_ssize_t 4564dictview_len(_PyDictViewObject *dv) 4565{ 4566 Py_ssize_t len = 0; 4567 if (dv->dv_dict != NULL) 4568 len = dv->dv_dict->ma_used; 4569 return len; 4570} 4571 4572PyObject * 4573_PyDictView_New(PyObject *dict, PyTypeObject *type) 4574{ 4575 _PyDictViewObject *dv; 4576 if (dict == NULL) { 4577 PyErr_BadInternalCall(); 4578 return NULL; 4579 } 4580 if (!PyDict_Check(dict)) { 4581 /* XXX Get rid of this restriction later */ 4582 PyErr_Format(PyExc_TypeError, 4583 "%s() requires a dict argument, not '%s'", 4584 type->tp_name, Py_TYPE(dict)->tp_name); 4585 return NULL; 4586 } 4587 dv = PyObject_GC_New(_PyDictViewObject, type); 4588 if (dv == NULL) 4589 return NULL; 4590 Py_INCREF(dict); 4591 dv->dv_dict = (PyDictObject *)dict; 4592 _PyObject_GC_TRACK(dv); 4593 return (PyObject *)dv; 4594} 4595 4596static PyObject * 4597dictview_mapping(PyObject *view, void *Py_UNUSED(ignored)) { 4598 assert(view != NULL); 4599 assert(PyDictKeys_Check(view) 4600 || PyDictValues_Check(view) 4601 || PyDictItems_Check(view)); 4602 PyObject *mapping = (PyObject *)((_PyDictViewObject *)view)->dv_dict; 4603 return PyDictProxy_New(mapping); 4604} 4605 4606static PyGetSetDef dictview_getset[] = { 4607 {"mapping", dictview_mapping, (setter)NULL, 4608 "dictionary that this view refers to", NULL}, 4609 {0} 4610}; 4611 4612/* TODO(guido): The views objects are not complete: 4613 4614 * support more set operations 4615 * support arbitrary mappings? 4616 - either these should be static or exported in dictobject.h 4617 - if public then they should probably be in builtins 4618*/ 4619 4620/* Return 1 if self is a subset of other, iterating over self; 4621 0 if not; -1 if an error occurred. */ 4622static int 4623all_contained_in(PyObject *self, PyObject *other) 4624{ 4625 PyObject *iter = PyObject_GetIter(self); 4626 int ok = 1; 4627 4628 if (iter == NULL) 4629 return -1; 4630 for (;;) { 4631 PyObject *next = PyIter_Next(iter); 4632 if (next == NULL) { 4633 if (PyErr_Occurred()) 4634 ok = -1; 4635 break; 4636 } 4637 ok = PySequence_Contains(other, next); 4638 Py_DECREF(next); 4639 if (ok <= 0) 4640 break; 4641 } 4642 Py_DECREF(iter); 4643 return ok; 4644} 4645 4646static PyObject * 4647dictview_richcompare(PyObject *self, PyObject *other, int op) 4648{ 4649 Py_ssize_t len_self, len_other; 4650 int ok; 4651 PyObject *result; 4652 4653 assert(self != NULL); 4654 assert(PyDictViewSet_Check(self)); 4655 assert(other != NULL); 4656 4657 if (!PyAnySet_Check(other) && !PyDictViewSet_Check(other)) 4658 Py_RETURN_NOTIMPLEMENTED; 4659 4660 len_self = PyObject_Size(self); 4661 if (len_self < 0) 4662 return NULL; 4663 len_other = PyObject_Size(other); 4664 if (len_other < 0) 4665 return NULL; 4666 4667 ok = 0; 4668 switch(op) { 4669 4670 case Py_NE: 4671 case Py_EQ: 4672 if (len_self == len_other) 4673 ok = all_contained_in(self, other); 4674 if (op == Py_NE && ok >= 0) 4675 ok = !ok; 4676 break; 4677 4678 case Py_LT: 4679 if (len_self < len_other) 4680 ok = all_contained_in(self, other); 4681 break; 4682 4683 case Py_LE: 4684 if (len_self <= len_other) 4685 ok = all_contained_in(self, other); 4686 break; 4687 4688 case Py_GT: 4689 if (len_self > len_other) 4690 ok = all_contained_in(other, self); 4691 break; 4692 4693 case Py_GE: 4694 if (len_self >= len_other) 4695 ok = all_contained_in(other, self); 4696 break; 4697 4698 } 4699 if (ok < 0) 4700 return NULL; 4701 result = ok ? Py_True : Py_False; 4702 Py_INCREF(result); 4703 return result; 4704} 4705 4706static PyObject * 4707dictview_repr(_PyDictViewObject *dv) 4708{ 4709 PyObject *seq; 4710 PyObject *result = NULL; 4711 Py_ssize_t rc; 4712 4713 rc = Py_ReprEnter((PyObject *)dv); 4714 if (rc != 0) { 4715 return rc > 0 ? PyUnicode_FromString("...") : NULL; 4716 } 4717 seq = PySequence_List((PyObject *)dv); 4718 if (seq == NULL) { 4719 goto Done; 4720 } 4721 result = PyUnicode_FromFormat("%s(%R)", Py_TYPE(dv)->tp_name, seq); 4722 Py_DECREF(seq); 4723 4724Done: 4725 Py_ReprLeave((PyObject *)dv); 4726 return result; 4727} 4728 4729/*** dict_keys ***/ 4730 4731static PyObject * 4732dictkeys_iter(_PyDictViewObject *dv) 4733{ 4734 if (dv->dv_dict == NULL) { 4735 Py_RETURN_NONE; 4736 } 4737 return dictiter_new(dv->dv_dict, &PyDictIterKey_Type); 4738} 4739 4740static int 4741dictkeys_contains(_PyDictViewObject *dv, PyObject *obj) 4742{ 4743 if (dv->dv_dict == NULL) 4744 return 0; 4745 return PyDict_Contains((PyObject *)dv->dv_dict, obj); 4746} 4747 4748static PySequenceMethods dictkeys_as_sequence = { 4749 (lenfunc)dictview_len, /* sq_length */ 4750 0, /* sq_concat */ 4751 0, /* sq_repeat */ 4752 0, /* sq_item */ 4753 0, /* sq_slice */ 4754 0, /* sq_ass_item */ 4755 0, /* sq_ass_slice */ 4756 (objobjproc)dictkeys_contains, /* sq_contains */ 4757}; 4758 4759// Create an set object from dictviews object. 4760// Returns a new reference. 4761// This utility function is used by set operations. 4762static PyObject* 4763dictviews_to_set(PyObject *self) 4764{ 4765 PyObject *left = self; 4766 if (PyDictKeys_Check(self)) { 4767 // PySet_New() has fast path for the dict object. 4768 PyObject *dict = (PyObject *)((_PyDictViewObject *)self)->dv_dict; 4769 if (PyDict_CheckExact(dict)) { 4770 left = dict; 4771 } 4772 } 4773 return PySet_New(left); 4774} 4775 4776static PyObject* 4777dictviews_sub(PyObject *self, PyObject *other) 4778{ 4779 PyObject *result = dictviews_to_set(self); 4780 if (result == NULL) { 4781 return NULL; 4782 } 4783 4784 PyObject *tmp = PyObject_CallMethodOneArg( 4785 result, &_Py_ID(difference_update), other); 4786 if (tmp == NULL) { 4787 Py_DECREF(result); 4788 return NULL; 4789 } 4790 4791 Py_DECREF(tmp); 4792 return result; 4793} 4794 4795static int 4796dictitems_contains(_PyDictViewObject *dv, PyObject *obj); 4797 4798PyObject * 4799_PyDictView_Intersect(PyObject* self, PyObject *other) 4800{ 4801 PyObject *result; 4802 PyObject *it; 4803 PyObject *key; 4804 Py_ssize_t len_self; 4805 int rv; 4806 int (*dict_contains)(_PyDictViewObject *, PyObject *); 4807 4808 /* Python interpreter swaps parameters when dict view 4809 is on right side of & */ 4810 if (!PyDictViewSet_Check(self)) { 4811 PyObject *tmp = other; 4812 other = self; 4813 self = tmp; 4814 } 4815 4816 len_self = dictview_len((_PyDictViewObject *)self); 4817 4818 /* if other is a set and self is smaller than other, 4819 reuse set intersection logic */ 4820 if (PySet_CheckExact(other) && len_self <= PyObject_Size(other)) { 4821 return PyObject_CallMethodObjArgs( 4822 other, &_Py_ID(intersection), self, NULL); 4823 } 4824 4825 /* if other is another dict view, and it is bigger than self, 4826 swap them */ 4827 if (PyDictViewSet_Check(other)) { 4828 Py_ssize_t len_other = dictview_len((_PyDictViewObject *)other); 4829 if (len_other > len_self) { 4830 PyObject *tmp = other; 4831 other = self; 4832 self = tmp; 4833 } 4834 } 4835 4836 /* at this point, two things should be true 4837 1. self is a dictview 4838 2. if other is a dictview then it is smaller than self */ 4839 result = PySet_New(NULL); 4840 if (result == NULL) 4841 return NULL; 4842 4843 it = PyObject_GetIter(other); 4844 if (it == NULL) { 4845 Py_DECREF(result); 4846 return NULL; 4847 } 4848 4849 if (PyDictKeys_Check(self)) { 4850 dict_contains = dictkeys_contains; 4851 } 4852 /* else PyDictItems_Check(self) */ 4853 else { 4854 dict_contains = dictitems_contains; 4855 } 4856 4857 while ((key = PyIter_Next(it)) != NULL) { 4858 rv = dict_contains((_PyDictViewObject *)self, key); 4859 if (rv < 0) { 4860 goto error; 4861 } 4862 if (rv) { 4863 if (PySet_Add(result, key)) { 4864 goto error; 4865 } 4866 } 4867 Py_DECREF(key); 4868 } 4869 Py_DECREF(it); 4870 if (PyErr_Occurred()) { 4871 Py_DECREF(result); 4872 return NULL; 4873 } 4874 return result; 4875 4876error: 4877 Py_DECREF(it); 4878 Py_DECREF(result); 4879 Py_DECREF(key); 4880 return NULL; 4881} 4882 4883static PyObject* 4884dictviews_or(PyObject* self, PyObject *other) 4885{ 4886 PyObject *result = dictviews_to_set(self); 4887 if (result == NULL) { 4888 return NULL; 4889 } 4890 4891 if (_PySet_Update(result, other) < 0) { 4892 Py_DECREF(result); 4893 return NULL; 4894 } 4895 return result; 4896} 4897 4898static PyObject * 4899dictitems_xor(PyObject *self, PyObject *other) 4900{ 4901 assert(PyDictItems_Check(self)); 4902 assert(PyDictItems_Check(other)); 4903 PyObject *d1 = (PyObject *)((_PyDictViewObject *)self)->dv_dict; 4904 PyObject *d2 = (PyObject *)((_PyDictViewObject *)other)->dv_dict; 4905 4906 PyObject *temp_dict = PyDict_Copy(d1); 4907 if (temp_dict == NULL) { 4908 return NULL; 4909 } 4910 PyObject *result_set = PySet_New(NULL); 4911 if (result_set == NULL) { 4912 Py_CLEAR(temp_dict); 4913 return NULL; 4914 } 4915 4916 PyObject *key = NULL, *val1 = NULL, *val2 = NULL; 4917 Py_ssize_t pos = 0; 4918 Py_hash_t hash; 4919 4920 while (_PyDict_Next(d2, &pos, &key, &val2, &hash)) { 4921 Py_INCREF(key); 4922 Py_INCREF(val2); 4923 val1 = _PyDict_GetItem_KnownHash(temp_dict, key, hash); 4924 4925 int to_delete; 4926 if (val1 == NULL) { 4927 if (PyErr_Occurred()) { 4928 goto error; 4929 } 4930 to_delete = 0; 4931 } 4932 else { 4933 Py_INCREF(val1); 4934 to_delete = PyObject_RichCompareBool(val1, val2, Py_EQ); 4935 if (to_delete < 0) { 4936 goto error; 4937 } 4938 } 4939 4940 if (to_delete) { 4941 if (_PyDict_DelItem_KnownHash(temp_dict, key, hash) < 0) { 4942 goto error; 4943 } 4944 } 4945 else { 4946 PyObject *pair = PyTuple_Pack(2, key, val2); 4947 if (pair == NULL) { 4948 goto error; 4949 } 4950 if (PySet_Add(result_set, pair) < 0) { 4951 Py_DECREF(pair); 4952 goto error; 4953 } 4954 Py_DECREF(pair); 4955 } 4956 Py_DECREF(key); 4957 Py_XDECREF(val1); 4958 Py_DECREF(val2); 4959 } 4960 key = val1 = val2 = NULL; 4961 4962 PyObject *remaining_pairs = PyObject_CallMethodNoArgs( 4963 temp_dict, &_Py_ID(items)); 4964 if (remaining_pairs == NULL) { 4965 goto error; 4966 } 4967 if (_PySet_Update(result_set, remaining_pairs) < 0) { 4968 Py_DECREF(remaining_pairs); 4969 goto error; 4970 } 4971 Py_DECREF(temp_dict); 4972 Py_DECREF(remaining_pairs); 4973 return result_set; 4974 4975error: 4976 Py_XDECREF(temp_dict); 4977 Py_XDECREF(result_set); 4978 Py_XDECREF(key); 4979 Py_XDECREF(val1); 4980 Py_XDECREF(val2); 4981 return NULL; 4982} 4983 4984static PyObject* 4985dictviews_xor(PyObject* self, PyObject *other) 4986{ 4987 if (PyDictItems_Check(self) && PyDictItems_Check(other)) { 4988 return dictitems_xor(self, other); 4989 } 4990 PyObject *result = dictviews_to_set(self); 4991 if (result == NULL) { 4992 return NULL; 4993 } 4994 4995 PyObject *tmp = PyObject_CallMethodOneArg( 4996 result, &_Py_ID(symmetric_difference_update), other); 4997 if (tmp == NULL) { 4998 Py_DECREF(result); 4999 return NULL; 5000 } 5001 5002 Py_DECREF(tmp); 5003 return result; 5004} 5005 5006static PyNumberMethods dictviews_as_number = { 5007 0, /*nb_add*/ 5008 (binaryfunc)dictviews_sub, /*nb_subtract*/ 5009 0, /*nb_multiply*/ 5010 0, /*nb_remainder*/ 5011 0, /*nb_divmod*/ 5012 0, /*nb_power*/ 5013 0, /*nb_negative*/ 5014 0, /*nb_positive*/ 5015 0, /*nb_absolute*/ 5016 0, /*nb_bool*/ 5017 0, /*nb_invert*/ 5018 0, /*nb_lshift*/ 5019 0, /*nb_rshift*/ 5020 (binaryfunc)_PyDictView_Intersect, /*nb_and*/ 5021 (binaryfunc)dictviews_xor, /*nb_xor*/ 5022 (binaryfunc)dictviews_or, /*nb_or*/ 5023}; 5024 5025static PyObject* 5026dictviews_isdisjoint(PyObject *self, PyObject *other) 5027{ 5028 PyObject *it; 5029 PyObject *item = NULL; 5030 5031 if (self == other) { 5032 if (dictview_len((_PyDictViewObject *)self) == 0) 5033 Py_RETURN_TRUE; 5034 else 5035 Py_RETURN_FALSE; 5036 } 5037 5038 /* Iterate over the shorter object (only if other is a set, 5039 * because PySequence_Contains may be expensive otherwise): */ 5040 if (PyAnySet_Check(other) || PyDictViewSet_Check(other)) { 5041 Py_ssize_t len_self = dictview_len((_PyDictViewObject *)self); 5042 Py_ssize_t len_other = PyObject_Size(other); 5043 if (len_other == -1) 5044 return NULL; 5045 5046 if ((len_other > len_self)) { 5047 PyObject *tmp = other; 5048 other = self; 5049 self = tmp; 5050 } 5051 } 5052 5053 it = PyObject_GetIter(other); 5054 if (it == NULL) 5055 return NULL; 5056 5057 while ((item = PyIter_Next(it)) != NULL) { 5058 int contains = PySequence_Contains(self, item); 5059 Py_DECREF(item); 5060 if (contains == -1) { 5061 Py_DECREF(it); 5062 return NULL; 5063 } 5064 5065 if (contains) { 5066 Py_DECREF(it); 5067 Py_RETURN_FALSE; 5068 } 5069 } 5070 Py_DECREF(it); 5071 if (PyErr_Occurred()) 5072 return NULL; /* PyIter_Next raised an exception. */ 5073 Py_RETURN_TRUE; 5074} 5075 5076PyDoc_STRVAR(isdisjoint_doc, 5077"Return True if the view and the given iterable have a null intersection."); 5078 5079static PyObject* dictkeys_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)); 5080 5081PyDoc_STRVAR(reversed_keys_doc, 5082"Return a reverse iterator over the dict keys."); 5083 5084static PyMethodDef dictkeys_methods[] = { 5085 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O, 5086 isdisjoint_doc}, 5087 {"__reversed__", _PyCFunction_CAST(dictkeys_reversed), METH_NOARGS, 5088 reversed_keys_doc}, 5089 {NULL, NULL} /* sentinel */ 5090}; 5091 5092PyTypeObject PyDictKeys_Type = { 5093 PyVarObject_HEAD_INIT(&PyType_Type, 0) 5094 "dict_keys", /* tp_name */ 5095 sizeof(_PyDictViewObject), /* tp_basicsize */ 5096 0, /* tp_itemsize */ 5097 /* methods */ 5098 (destructor)dictview_dealloc, /* tp_dealloc */ 5099 0, /* tp_vectorcall_offset */ 5100 0, /* tp_getattr */ 5101 0, /* tp_setattr */ 5102 0, /* tp_as_async */ 5103 (reprfunc)dictview_repr, /* tp_repr */ 5104 &dictviews_as_number, /* tp_as_number */ 5105 &dictkeys_as_sequence, /* tp_as_sequence */ 5106 0, /* tp_as_mapping */ 5107 0, /* tp_hash */ 5108 0, /* tp_call */ 5109 0, /* tp_str */ 5110 PyObject_GenericGetAttr, /* tp_getattro */ 5111 0, /* tp_setattro */ 5112 0, /* tp_as_buffer */ 5113 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 5114 0, /* tp_doc */ 5115 (traverseproc)dictview_traverse, /* tp_traverse */ 5116 0, /* tp_clear */ 5117 dictview_richcompare, /* tp_richcompare */ 5118 0, /* tp_weaklistoffset */ 5119 (getiterfunc)dictkeys_iter, /* tp_iter */ 5120 0, /* tp_iternext */ 5121 dictkeys_methods, /* tp_methods */ 5122 .tp_getset = dictview_getset, 5123}; 5124 5125static PyObject * 5126dictkeys_new(PyObject *dict, PyObject *Py_UNUSED(ignored)) 5127{ 5128 return _PyDictView_New(dict, &PyDictKeys_Type); 5129} 5130 5131static PyObject * 5132dictkeys_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) 5133{ 5134 if (dv->dv_dict == NULL) { 5135 Py_RETURN_NONE; 5136 } 5137 return dictiter_new(dv->dv_dict, &PyDictRevIterKey_Type); 5138} 5139 5140/*** dict_items ***/ 5141 5142static PyObject * 5143dictitems_iter(_PyDictViewObject *dv) 5144{ 5145 if (dv->dv_dict == NULL) { 5146 Py_RETURN_NONE; 5147 } 5148 return dictiter_new(dv->dv_dict, &PyDictIterItem_Type); 5149} 5150 5151static int 5152dictitems_contains(_PyDictViewObject *dv, PyObject *obj) 5153{ 5154 int result; 5155 PyObject *key, *value, *found; 5156 if (dv->dv_dict == NULL) 5157 return 0; 5158 if (!PyTuple_Check(obj) || PyTuple_GET_SIZE(obj) != 2) 5159 return 0; 5160 key = PyTuple_GET_ITEM(obj, 0); 5161 value = PyTuple_GET_ITEM(obj, 1); 5162 found = PyDict_GetItemWithError((PyObject *)dv->dv_dict, key); 5163 if (found == NULL) { 5164 if (PyErr_Occurred()) 5165 return -1; 5166 return 0; 5167 } 5168 Py_INCREF(found); 5169 result = PyObject_RichCompareBool(found, value, Py_EQ); 5170 Py_DECREF(found); 5171 return result; 5172} 5173 5174static PySequenceMethods dictitems_as_sequence = { 5175 (lenfunc)dictview_len, /* sq_length */ 5176 0, /* sq_concat */ 5177 0, /* sq_repeat */ 5178 0, /* sq_item */ 5179 0, /* sq_slice */ 5180 0, /* sq_ass_item */ 5181 0, /* sq_ass_slice */ 5182 (objobjproc)dictitems_contains, /* sq_contains */ 5183}; 5184 5185static PyObject* dictitems_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)); 5186 5187PyDoc_STRVAR(reversed_items_doc, 5188"Return a reverse iterator over the dict items."); 5189 5190static PyMethodDef dictitems_methods[] = { 5191 {"isdisjoint", (PyCFunction)dictviews_isdisjoint, METH_O, 5192 isdisjoint_doc}, 5193 {"__reversed__", (PyCFunction)dictitems_reversed, METH_NOARGS, 5194 reversed_items_doc}, 5195 {NULL, NULL} /* sentinel */ 5196}; 5197 5198PyTypeObject PyDictItems_Type = { 5199 PyVarObject_HEAD_INIT(&PyType_Type, 0) 5200 "dict_items", /* tp_name */ 5201 sizeof(_PyDictViewObject), /* tp_basicsize */ 5202 0, /* tp_itemsize */ 5203 /* methods */ 5204 (destructor)dictview_dealloc, /* tp_dealloc */ 5205 0, /* tp_vectorcall_offset */ 5206 0, /* tp_getattr */ 5207 0, /* tp_setattr */ 5208 0, /* tp_as_async */ 5209 (reprfunc)dictview_repr, /* tp_repr */ 5210 &dictviews_as_number, /* tp_as_number */ 5211 &dictitems_as_sequence, /* tp_as_sequence */ 5212 0, /* tp_as_mapping */ 5213 0, /* tp_hash */ 5214 0, /* tp_call */ 5215 0, /* tp_str */ 5216 PyObject_GenericGetAttr, /* tp_getattro */ 5217 0, /* tp_setattro */ 5218 0, /* tp_as_buffer */ 5219 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 5220 0, /* tp_doc */ 5221 (traverseproc)dictview_traverse, /* tp_traverse */ 5222 0, /* tp_clear */ 5223 dictview_richcompare, /* tp_richcompare */ 5224 0, /* tp_weaklistoffset */ 5225 (getiterfunc)dictitems_iter, /* tp_iter */ 5226 0, /* tp_iternext */ 5227 dictitems_methods, /* tp_methods */ 5228 .tp_getset = dictview_getset, 5229}; 5230 5231static PyObject * 5232dictitems_new(PyObject *dict, PyObject *Py_UNUSED(ignored)) 5233{ 5234 return _PyDictView_New(dict, &PyDictItems_Type); 5235} 5236 5237static PyObject * 5238dictitems_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) 5239{ 5240 if (dv->dv_dict == NULL) { 5241 Py_RETURN_NONE; 5242 } 5243 return dictiter_new(dv->dv_dict, &PyDictRevIterItem_Type); 5244} 5245 5246/*** dict_values ***/ 5247 5248static PyObject * 5249dictvalues_iter(_PyDictViewObject *dv) 5250{ 5251 if (dv->dv_dict == NULL) { 5252 Py_RETURN_NONE; 5253 } 5254 return dictiter_new(dv->dv_dict, &PyDictIterValue_Type); 5255} 5256 5257static PySequenceMethods dictvalues_as_sequence = { 5258 (lenfunc)dictview_len, /* sq_length */ 5259 0, /* sq_concat */ 5260 0, /* sq_repeat */ 5261 0, /* sq_item */ 5262 0, /* sq_slice */ 5263 0, /* sq_ass_item */ 5264 0, /* sq_ass_slice */ 5265 (objobjproc)0, /* sq_contains */ 5266}; 5267 5268static PyObject* dictvalues_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)); 5269 5270PyDoc_STRVAR(reversed_values_doc, 5271"Return a reverse iterator over the dict values."); 5272 5273static PyMethodDef dictvalues_methods[] = { 5274 {"__reversed__", (PyCFunction)dictvalues_reversed, METH_NOARGS, 5275 reversed_values_doc}, 5276 {NULL, NULL} /* sentinel */ 5277}; 5278 5279PyTypeObject PyDictValues_Type = { 5280 PyVarObject_HEAD_INIT(&PyType_Type, 0) 5281 "dict_values", /* tp_name */ 5282 sizeof(_PyDictViewObject), /* tp_basicsize */ 5283 0, /* tp_itemsize */ 5284 /* methods */ 5285 (destructor)dictview_dealloc, /* tp_dealloc */ 5286 0, /* tp_vectorcall_offset */ 5287 0, /* tp_getattr */ 5288 0, /* tp_setattr */ 5289 0, /* tp_as_async */ 5290 (reprfunc)dictview_repr, /* tp_repr */ 5291 0, /* tp_as_number */ 5292 &dictvalues_as_sequence, /* tp_as_sequence */ 5293 0, /* tp_as_mapping */ 5294 0, /* tp_hash */ 5295 0, /* tp_call */ 5296 0, /* tp_str */ 5297 PyObject_GenericGetAttr, /* tp_getattro */ 5298 0, /* tp_setattro */ 5299 0, /* tp_as_buffer */ 5300 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */ 5301 0, /* tp_doc */ 5302 (traverseproc)dictview_traverse, /* tp_traverse */ 5303 0, /* tp_clear */ 5304 0, /* tp_richcompare */ 5305 0, /* tp_weaklistoffset */ 5306 (getiterfunc)dictvalues_iter, /* tp_iter */ 5307 0, /* tp_iternext */ 5308 dictvalues_methods, /* tp_methods */ 5309 .tp_getset = dictview_getset, 5310}; 5311 5312static PyObject * 5313dictvalues_new(PyObject *dict, PyObject *Py_UNUSED(ignored)) 5314{ 5315 return _PyDictView_New(dict, &PyDictValues_Type); 5316} 5317 5318static PyObject * 5319dictvalues_reversed(_PyDictViewObject *dv, PyObject *Py_UNUSED(ignored)) 5320{ 5321 if (dv->dv_dict == NULL) { 5322 Py_RETURN_NONE; 5323 } 5324 return dictiter_new(dv->dv_dict, &PyDictRevIterValue_Type); 5325} 5326 5327 5328/* Returns NULL if cannot allocate a new PyDictKeysObject, 5329 but does not set an error */ 5330PyDictKeysObject * 5331_PyDict_NewKeysForClass(void) 5332{ 5333 PyDictKeysObject *keys = new_keys_object(NEXT_LOG2_SHARED_KEYS_MAX_SIZE, 1); 5334 if (keys == NULL) { 5335 PyErr_Clear(); 5336 } 5337 else { 5338 assert(keys->dk_nentries == 0); 5339 /* Set to max size+1 as it will shrink by one before each new object */ 5340 keys->dk_usable = SHARED_KEYS_MAX_SIZE; 5341 keys->dk_kind = DICT_KEYS_SPLIT; 5342 } 5343 return keys; 5344} 5345 5346#define CACHED_KEYS(tp) (((PyHeapTypeObject*)tp)->ht_cached_keys) 5347 5348static int 5349init_inline_values(PyObject *obj, PyTypeObject *tp) 5350{ 5351 assert(tp->tp_flags & Py_TPFLAGS_HEAPTYPE); 5352 // assert(type->tp_dictoffset > 0); -- TO DO Update this assert. 5353 assert(tp->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5354 PyDictKeysObject *keys = CACHED_KEYS(tp); 5355 assert(keys != NULL); 5356 if (keys->dk_usable > 1) { 5357 keys->dk_usable--; 5358 } 5359 Py_ssize_t size = shared_keys_usable_size(keys); 5360 assert(size > 0); 5361 PyDictValues *values = new_values(size); 5362 if (values == NULL) { 5363 PyErr_NoMemory(); 5364 return -1; 5365 } 5366 assert(((uint8_t *)values)[-1] >= size+2); 5367 ((uint8_t *)values)[-2] = 0; 5368 for (int i = 0; i < size; i++) { 5369 values->values[i] = NULL; 5370 } 5371 *_PyObject_ValuesPointer(obj) = values; 5372 return 0; 5373} 5374 5375int 5376_PyObject_InitializeDict(PyObject *obj) 5377{ 5378 PyTypeObject *tp = Py_TYPE(obj); 5379 if (tp->tp_dictoffset == 0) { 5380 return 0; 5381 } 5382 if (tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) { 5383 OBJECT_STAT_INC(new_values); 5384 return init_inline_values(obj, tp); 5385 } 5386 PyObject *dict; 5387 if (_PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) { 5388 dictkeys_incref(CACHED_KEYS(tp)); 5389 dict = new_dict_with_shared_keys(CACHED_KEYS(tp)); 5390 } 5391 else { 5392 dict = PyDict_New(); 5393 } 5394 if (dict == NULL) { 5395 return -1; 5396 } 5397 PyObject **dictptr = _PyObject_DictPointer(obj); 5398 *dictptr = dict; 5399 return 0; 5400} 5401 5402static PyObject * 5403make_dict_from_instance_attributes(PyDictKeysObject *keys, PyDictValues *values) 5404{ 5405 dictkeys_incref(keys); 5406 Py_ssize_t used = 0; 5407 Py_ssize_t track = 0; 5408 for (Py_ssize_t i = 0; i < shared_keys_usable_size(keys); i++) { 5409 PyObject *val = values->values[i]; 5410 if (val != NULL) { 5411 used += 1; 5412 track += _PyObject_GC_MAY_BE_TRACKED(val); 5413 } 5414 } 5415 PyObject *res = new_dict(keys, values, used, 0); 5416 if (track && res) { 5417 _PyObject_GC_TRACK(res); 5418 } 5419 return res; 5420} 5421 5422PyObject * 5423_PyObject_MakeDictFromInstanceAttributes(PyObject *obj, PyDictValues *values) 5424{ 5425 assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5426 PyDictKeysObject *keys = CACHED_KEYS(Py_TYPE(obj)); 5427 OBJECT_STAT_INC(dict_materialized_on_request); 5428 return make_dict_from_instance_attributes(keys, values); 5429} 5430 5431int 5432_PyObject_StoreInstanceAttribute(PyObject *obj, PyDictValues *values, 5433 PyObject *name, PyObject *value) 5434{ 5435 PyDictKeysObject *keys = CACHED_KEYS(Py_TYPE(obj)); 5436 assert(keys != NULL); 5437 assert(values != NULL); 5438 assert(Py_TYPE(obj)->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5439 Py_ssize_t ix = DKIX_EMPTY; 5440 if (PyUnicode_CheckExact(name)) { 5441 ix = insert_into_dictkeys(keys, name); 5442 } 5443 if (ix == DKIX_EMPTY) { 5444#ifdef Py_STATS 5445 if (PyUnicode_CheckExact(name)) { 5446 if (shared_keys_usable_size(keys) == SHARED_KEYS_MAX_SIZE) { 5447 OBJECT_STAT_INC(dict_materialized_too_big); 5448 } 5449 else { 5450 OBJECT_STAT_INC(dict_materialized_new_key); 5451 } 5452 } 5453 else { 5454 OBJECT_STAT_INC(dict_materialized_str_subclass); 5455 } 5456#endif 5457 PyObject *dict = make_dict_from_instance_attributes(keys, values); 5458 if (dict == NULL) { 5459 return -1; 5460 } 5461 *_PyObject_ValuesPointer(obj) = NULL; 5462 *_PyObject_ManagedDictPointer(obj) = dict; 5463 if (value == NULL) { 5464 return PyDict_DelItem(dict, name); 5465 } 5466 else { 5467 return PyDict_SetItem(dict, name, value); 5468 } 5469 } 5470 PyObject *old_value = values->values[ix]; 5471 Py_XINCREF(value); 5472 values->values[ix] = value; 5473 if (old_value == NULL) { 5474 if (value == NULL) { 5475 PyErr_Format(PyExc_AttributeError, 5476 "'%.100s' object has no attribute '%U'", 5477 Py_TYPE(obj)->tp_name, name); 5478 return -1; 5479 } 5480 _PyDictValues_AddToInsertionOrder(values, ix); 5481 } 5482 else { 5483 if (value == NULL) { 5484 delete_index_from_values(values, ix); 5485 } 5486 Py_DECREF(old_value); 5487 } 5488 return 0; 5489} 5490 5491PyObject * 5492_PyObject_GetInstanceAttribute(PyObject *obj, PyDictValues *values, 5493 PyObject *name) 5494{ 5495 assert(PyUnicode_CheckExact(name)); 5496 PyDictKeysObject *keys = CACHED_KEYS(Py_TYPE(obj)); 5497 assert(keys != NULL); 5498 Py_ssize_t ix = _PyDictKeys_StringLookup(keys, name); 5499 if (ix == DKIX_EMPTY) { 5500 return NULL; 5501 } 5502 PyObject *value = values->values[ix]; 5503 Py_XINCREF(value); 5504 return value; 5505} 5506 5507int 5508_PyObject_IsInstanceDictEmpty(PyObject *obj) 5509{ 5510 PyTypeObject *tp = Py_TYPE(obj); 5511 if (tp->tp_dictoffset == 0) { 5512 return 1; 5513 } 5514 PyObject **dictptr; 5515 if (tp->tp_flags & Py_TPFLAGS_MANAGED_DICT) { 5516 PyDictValues *values = *_PyObject_ValuesPointer(obj); 5517 if (values) { 5518 PyDictKeysObject *keys = CACHED_KEYS(tp); 5519 for (Py_ssize_t i = 0; i < keys->dk_nentries; i++) { 5520 if (values->values[i] != NULL) { 5521 return 0; 5522 } 5523 } 5524 return 1; 5525 } 5526 dictptr = _PyObject_ManagedDictPointer(obj); 5527 } 5528 else { 5529 dictptr = _PyObject_DictPointer(obj); 5530 } 5531 PyObject *dict = *dictptr; 5532 if (dict == NULL) { 5533 return 1; 5534 } 5535 return ((PyDictObject *)dict)->ma_used == 0; 5536} 5537 5538 5539int 5540_PyObject_VisitInstanceAttributes(PyObject *self, visitproc visit, void *arg) 5541{ 5542 PyTypeObject *tp = Py_TYPE(self); 5543 assert(Py_TYPE(self)->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5544 PyDictValues **values_ptr = _PyObject_ValuesPointer(self); 5545 if (*values_ptr == NULL) { 5546 return 0; 5547 } 5548 PyDictKeysObject *keys = CACHED_KEYS(tp); 5549 for (Py_ssize_t i = 0; i < keys->dk_nentries; i++) { 5550 Py_VISIT((*values_ptr)->values[i]); 5551 } 5552 return 0; 5553} 5554 5555void 5556_PyObject_ClearInstanceAttributes(PyObject *self) 5557{ 5558 PyTypeObject *tp = Py_TYPE(self); 5559 assert(Py_TYPE(self)->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5560 PyDictValues **values_ptr = _PyObject_ValuesPointer(self); 5561 if (*values_ptr == NULL) { 5562 return; 5563 } 5564 PyDictKeysObject *keys = CACHED_KEYS(tp); 5565 for (Py_ssize_t i = 0; i < keys->dk_nentries; i++) { 5566 Py_CLEAR((*values_ptr)->values[i]); 5567 } 5568} 5569 5570void 5571_PyObject_FreeInstanceAttributes(PyObject *self) 5572{ 5573 PyTypeObject *tp = Py_TYPE(self); 5574 assert(Py_TYPE(self)->tp_flags & Py_TPFLAGS_MANAGED_DICT); 5575 PyDictValues **values_ptr = _PyObject_ValuesPointer(self); 5576 PyDictValues *values = *values_ptr; 5577 if (values == NULL) { 5578 return; 5579 } 5580 *values_ptr = NULL; 5581 PyDictKeysObject *keys = CACHED_KEYS(tp); 5582 for (Py_ssize_t i = 0; i < keys->dk_nentries; i++) { 5583 Py_XDECREF(values->values[i]); 5584 } 5585 free_values(values); 5586} 5587 5588PyObject * 5589PyObject_GenericGetDict(PyObject *obj, void *context) 5590{ 5591 PyObject *dict; 5592 PyTypeObject *tp = Py_TYPE(obj); 5593 if (_PyType_HasFeature(tp, Py_TPFLAGS_MANAGED_DICT)) { 5594 PyDictValues **values_ptr = _PyObject_ValuesPointer(obj); 5595 PyObject **dictptr = _PyObject_ManagedDictPointer(obj); 5596 if (*values_ptr) { 5597 assert(*dictptr == NULL); 5598 OBJECT_STAT_INC(dict_materialized_on_request); 5599 *dictptr = dict = make_dict_from_instance_attributes(CACHED_KEYS(tp), *values_ptr); 5600 if (dict != NULL) { 5601 *values_ptr = NULL; 5602 } 5603 } 5604 else if (*dictptr == NULL) { 5605 *dictptr = dict = PyDict_New(); 5606 } 5607 else { 5608 dict = *dictptr; 5609 } 5610 } 5611 else { 5612 PyObject **dictptr = _PyObject_DictPointer(obj); 5613 if (dictptr == NULL) { 5614 PyErr_SetString(PyExc_AttributeError, 5615 "This object has no __dict__"); 5616 return NULL; 5617 } 5618 dict = *dictptr; 5619 if (dict == NULL) { 5620 PyTypeObject *tp = Py_TYPE(obj); 5621 if (_PyType_HasFeature(tp, Py_TPFLAGS_HEAPTYPE) && CACHED_KEYS(tp)) { 5622 dictkeys_incref(CACHED_KEYS(tp)); 5623 *dictptr = dict = new_dict_with_shared_keys(CACHED_KEYS(tp)); 5624 } 5625 else { 5626 *dictptr = dict = PyDict_New(); 5627 } 5628 } 5629 } 5630 Py_XINCREF(dict); 5631 return dict; 5632} 5633 5634int 5635_PyObjectDict_SetItem(PyTypeObject *tp, PyObject **dictptr, 5636 PyObject *key, PyObject *value) 5637{ 5638 PyObject *dict; 5639 int res; 5640 PyDictKeysObject *cached; 5641 5642 assert(dictptr != NULL); 5643 if ((tp->tp_flags & Py_TPFLAGS_HEAPTYPE) && (cached = CACHED_KEYS(tp))) { 5644 assert(dictptr != NULL); 5645 dict = *dictptr; 5646 if (dict == NULL) { 5647 dictkeys_incref(cached); 5648 dict = new_dict_with_shared_keys(cached); 5649 if (dict == NULL) 5650 return -1; 5651 *dictptr = dict; 5652 } 5653 if (value == NULL) { 5654 res = PyDict_DelItem(dict, key); 5655 } 5656 else { 5657 res = PyDict_SetItem(dict, key, value); 5658 } 5659 } else { 5660 dict = *dictptr; 5661 if (dict == NULL) { 5662 dict = PyDict_New(); 5663 if (dict == NULL) 5664 return -1; 5665 *dictptr = dict; 5666 } 5667 if (value == NULL) { 5668 res = PyDict_DelItem(dict, key); 5669 } else { 5670 res = PyDict_SetItem(dict, key, value); 5671 } 5672 } 5673 ASSERT_CONSISTENT(dict); 5674 return res; 5675} 5676 5677void 5678_PyDictKeys_DecRef(PyDictKeysObject *keys) 5679{ 5680 dictkeys_decref(keys); 5681} 5682 5683static uint32_t next_dict_keys_version = 2; 5684 5685uint32_t _PyDictKeys_GetVersionForCurrentState(PyDictKeysObject *dictkeys) 5686{ 5687 if (dictkeys->dk_version != 0) { 5688 return dictkeys->dk_version; 5689 } 5690 if (next_dict_keys_version == 0) { 5691 return 0; 5692 } 5693 uint32_t v = next_dict_keys_version++; 5694 dictkeys->dk_version = v; 5695 return v; 5696} 5697