@@ -2111,7 +2111,7 @@ _PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey,
2111
2111
if (i >= n )
2112
2112
return 0 ;
2113
2113
key = entry_ptr -> me_key ;
2114
- hash = (( PyASCIIObject * ) key ) -> hash ;
2114
+ hash = unicode_get_hash ( entry_ptr -> me_key ) ;
2115
2115
value = entry_ptr -> me_value ;
2116
2116
}
2117
2117
else {
@@ -2518,36 +2518,15 @@ dict_keys(PyDictObject *mp)
2518
2518
Py_DECREF (v );
2519
2519
goto again ;
2520
2520
}
2521
- if (DK_IS_UNICODE (mp -> ma_keys )) {
2522
- PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (mp -> ma_keys );
2523
- key_ptr = & ep -> me_key ;
2524
- key_offset = sizeof (PyDictUnicodeEntry );
2525
2521
2526
- if (mp -> ma_values ) {
2527
- value_ptr = mp -> ma_values -> values ;
2528
- value_offset = sizeof (PyObject * );
2529
- }
2530
- else {
2531
- value_ptr = & ep -> me_value ;
2532
- value_offset = key_offset ;
2533
- }
2534
- }
2535
- else {
2536
- PyDictKeyEntry * ep = DK_ENTRIES (mp -> ma_keys );
2537
- key_ptr = & ep -> me_key ;
2538
- value_ptr = & ep -> me_value ;
2539
- key_offset = value_offset = sizeof (PyDictKeyEntry );
2540
- }
2541
-
2542
- for (i = 0 , j = 0 ; j < n ; i ++ ) {
2543
- if (* value_ptr != NULL ) {
2544
- PyObject * key = * key_ptr ;
2545
- Py_INCREF (key );
2546
- PyList_SET_ITEM (v , j , key );
2547
- j ++ ;
2548
- }
2549
- key_ptr = (PyObject * * )(((char * )key_ptr ) + key_offset );
2550
- value_ptr = (PyObject * * )(((char * )value_ptr ) + value_offset );
2522
+ /* Nothing we do below makes any function calls. */
2523
+ Py_ssize_t j = 0 , pos = 0 ;
2524
+ PyObject * key ;
2525
+ while (_PyDict_Next ((PyObject * )mp , & pos , & key , NULL , NULL )) {
2526
+ assert (j < n );
2527
+ Py_INCREF (key );
2528
+ PyList_SET_ITEM (v , j , key );
2529
+ j ++ ;
2551
2530
}
2552
2531
assert (j == n );
2553
2532
return v ;
@@ -2557,9 +2536,7 @@ static PyObject *
2557
2536
dict_values (PyDictObject * mp )
2558
2537
{
2559
2538
PyObject * v ;
2560
- Py_ssize_t i , j ;
2561
- Py_ssize_t n , offset ;
2562
- PyObject * * value_ptr ;
2539
+ Py_ssize_t n ;
2563
2540
2564
2541
again :
2565
2542
n = mp -> ma_used ;
@@ -2573,31 +2550,15 @@ dict_values(PyDictObject *mp)
2573
2550
Py_DECREF (v );
2574
2551
goto again ;
2575
2552
}
2576
- if (DK_IS_UNICODE (mp -> ma_keys )) {
2577
- if (mp -> ma_values ) {
2578
- value_ptr = mp -> ma_values -> values ;
2579
- offset = sizeof (PyObject * );
2580
- }
2581
- else {
2582
- PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (mp -> ma_keys );
2583
- value_ptr = & ep -> me_value ;
2584
- offset = sizeof (PyDictUnicodeEntry );
2585
- }
2586
- }
2587
- else {
2588
- PyDictKeyEntry * ep = DK_ENTRIES (mp -> ma_keys );
2589
- value_ptr = & ep -> me_value ;
2590
- offset = sizeof (PyDictKeyEntry );
2591
- }
2592
2553
2593
- for ( i = 0 , j = 0 ; j < n ; i ++ ) {
2594
- PyObject * value = * value_ptr ;
2595
- value_ptr = ( PyObject * * )((( char * ) value_ptr ) + offset ) ;
2596
- if ( value != NULL ) {
2597
- Py_INCREF ( value );
2598
- PyList_SET_ITEM ( v , j , value );
2599
- j ++ ;
2600
- }
2554
+ /* Nothing we do below makes any function calls. */
2555
+ Py_ssize_t j = 0 , pos = 0 ;
2556
+ PyObject * value ;
2557
+ while ( _PyDict_Next (( PyObject * ) mp , & pos , NULL , & value , NULL ) ) {
2558
+ assert ( j < n );
2559
+ Py_INCREF ( value );
2560
+ PyList_SET_ITEM ( v , j , value ) ;
2561
+ j ++ ;
2601
2562
}
2602
2563
assert (j == n );
2603
2564
return v ;
@@ -2609,8 +2570,6 @@ dict_items(PyDictObject *mp)
2609
2570
PyObject * v ;
2610
2571
Py_ssize_t i , j , n ;
2611
2572
PyObject * item ;
2612
- PyObject * * key_ptr , * * value_ptr ;
2613
- Py_ssize_t key_offset , value_offset ;
2614
2573
2615
2574
/* Preallocate the list of tuples, to avoid allocations during
2616
2575
* the loop over the items, which could trigger GC, which
@@ -2636,37 +2595,18 @@ dict_items(PyDictObject *mp)
2636
2595
Py_DECREF (v );
2637
2596
goto again ;
2638
2597
}
2639
- /* Nothing we do below makes any function calls. */
2640
- if (DK_IS_UNICODE (mp -> ma_keys )) {
2641
- PyDictUnicodeEntry * ep = DK_UNICODE_ENTRIES (mp -> ma_keys );
2642
- key_ptr = & ep -> me_key ;
2643
- value_ptr = & ep -> me_value ;
2644
- key_offset = value_offset = sizeof (PyDictUnicodeEntry );
2645
- if (mp -> ma_values ) {
2646
- value_ptr = mp -> ma_values -> values ;
2647
- value_offset = sizeof (PyObject * );
2648
- }
2649
- }
2650
- else {
2651
- PyDictKeyEntry * ep = DK_ENTRIES (mp -> ma_keys );
2652
- key_ptr = & ep -> me_key ;
2653
- value_ptr = & ep -> me_value ;
2654
- key_offset = value_offset = sizeof (PyDictKeyEntry );
2655
- }
2656
2598
2657
- for (i = 0 , j = 0 ; j < n ; i ++ ) {
2658
- PyObject * value = * value_ptr ;
2659
- PyObject * key = * key_ptr ;
2660
- key_ptr = (PyObject * * )(((char * )key_ptr ) + key_offset );
2661
- value_ptr = (PyObject * * )(((char * )value_ptr ) + value_offset );
2662
- if (value != NULL ) {
2663
- item = PyList_GET_ITEM (v , j );
2664
- Py_INCREF (key );
2665
- PyTuple_SET_ITEM (item , 0 , key );
2666
- Py_INCREF (value );
2667
- PyTuple_SET_ITEM (item , 1 , value );
2668
- j ++ ;
2669
- }
2599
+ /* Nothing we do below makes any function calls. */
2600
+ Py_ssize_t j = 0 , pos = 0 ;
2601
+ PyObject * key , * value ;
2602
+ while (_PyDict_Next ((PyObject * )mp , & pos , & key , & value , NULL )) {
2603
+ assert (j < n );
2604
+ PyObject * item = PyList_GET_ITEM (v , j );
2605
+ Py_INCREF (key );
2606
+ PyTuple_SET_ITEM (item , 0 , key );
2607
+ Py_INCREF (value );
2608
+ PyTuple_SET_ITEM (item , 1 , value );
2609
+ j ++ ;
2670
2610
}
2671
2611
assert (j == n );
2672
2612
return v ;
0 commit comments