mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +00:00 
			
		
		
		
	Fix _PyDict_Pop() on pending key
Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang.
This commit is contained in:
		
							parent
							
								
									9926480b6a
								
							
						
					
					
						commit
						d0ad11f6b4
					
				
					 3 changed files with 13 additions and 1 deletions
				
			
		| 
						 | 
				
			
			@ -891,6 +891,15 @@ def test_splittable_pop(self):
 | 
			
		|||
        self.assertEqual(list(a), ['x', 'z', 'y'])
 | 
			
		||||
        self.assertEqual(list(b), ['x', 'y', 'z'])
 | 
			
		||||
 | 
			
		||||
    @support.cpython_only
 | 
			
		||||
    def test_splittable_pop_pending(self):
 | 
			
		||||
        """pop a pending key in a splitted table should not crash"""
 | 
			
		||||
        a, b = self.make_shared_key_dict(2)
 | 
			
		||||
 | 
			
		||||
        a['a'] = 4
 | 
			
		||||
        with self.assertRaises(KeyError):
 | 
			
		||||
            b.pop('a')
 | 
			
		||||
 | 
			
		||||
    @support.cpython_only
 | 
			
		||||
    def test_splittable_popitem(self):
 | 
			
		||||
        """split table must be combined when d.popitem()"""
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,9 @@ What's New in Python 3.6.0 beta 2
 | 
			
		|||
Core and Builtins
 | 
			
		||||
-----------------
 | 
			
		||||
 | 
			
		||||
- Issue #28120: Fix dict.pop() for splitted dictionary when trying to remove a
 | 
			
		||||
  "pending key" (Not yet inserted in split-table). Patch by Xiang Zhang.
 | 
			
		||||
 | 
			
		||||
Library
 | 
			
		||||
-------
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1721,7 +1721,7 @@ _PyDict_Pop(PyDictObject *mp, PyObject *key, PyObject *deflt)
 | 
			
		|||
    ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos);
 | 
			
		||||
    if (ix == DKIX_ERROR)
 | 
			
		||||
        return NULL;
 | 
			
		||||
    if (ix == DKIX_EMPTY) {
 | 
			
		||||
    if (ix == DKIX_EMPTY || *value_addr == NULL) {
 | 
			
		||||
        if (deflt) {
 | 
			
		||||
            Py_INCREF(deflt);
 | 
			
		||||
            return deflt;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue