@@ -2226,64 +2226,85 @@ PyDict_Next(PyObject *op, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue)
2226
2226
return _PyDict_Next (op , ppos , pkey , pvalue , NULL );
2227
2227
}
2228
2228
2229
+
2229
2230
/* Internal version of dict.pop(). */
2230
- PyObject *
2231
- _PyDict_Pop_KnownHash (PyObject * dict , PyObject * key , Py_hash_t hash , PyObject * deflt )
2231
+ int
2232
+ _PyDict_Pop_KnownHash (PyDictObject * mp , PyObject * key , Py_hash_t hash ,
2233
+ PyObject * * result )
2232
2234
{
2233
- Py_ssize_t ix ;
2234
- PyObject * old_value ;
2235
- PyDictObject * mp ;
2236
- PyInterpreterState * interp = _PyInterpreterState_GET ();
2237
-
2238
- assert (PyDict_Check (dict ));
2239
- mp = (PyDictObject * )dict ;
2235
+ assert (PyDict_Check (mp ));
2240
2236
2241
2237
if (mp -> ma_used == 0 ) {
2242
- if (deflt ) {
2243
- return Py_NewRef (deflt );
2244
- }
2245
- _PyErr_SetKeyError (key );
2246
- return NULL ;
2238
+ * result = NULL ;
2239
+ return 0 ;
2247
2240
}
2248
- ix = _Py_dict_lookup (mp , key , hash , & old_value );
2249
- if (ix == DKIX_ERROR )
2250
- return NULL ;
2241
+
2242
+ PyObject * old_value ;
2243
+ Py_ssize_t ix = _Py_dict_lookup (mp , key , hash , & old_value );
2244
+ if (ix == DKIX_ERROR ) {
2245
+ * result = NULL ;
2246
+ return -1 ;
2247
+ }
2248
+
2251
2249
if (ix == DKIX_EMPTY || old_value == NULL ) {
2252
- if (deflt ) {
2253
- return Py_NewRef (deflt );
2254
- }
2255
- _PyErr_SetKeyError (key );
2256
- return NULL ;
2250
+ * result = NULL ;
2251
+ return 0 ;
2257
2252
}
2253
+
2258
2254
assert (old_value != NULL );
2255
+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2259
2256
uint64_t new_version = _PyDict_NotifyEvent (
2260
2257
interp , PyDict_EVENT_DELETED , mp , key , NULL );
2261
2258
delitem_common (mp , hash , ix , Py_NewRef (old_value ), new_version );
2262
2259
2263
2260
ASSERT_CONSISTENT (mp );
2264
- return old_value ;
2261
+ * result = old_value ;
2262
+ return 1 ;
2265
2263
}
2266
2264
2267
- PyObject *
2268
- _PyDict_Pop (PyObject * dict , PyObject * key , PyObject * deflt )
2265
+
2266
+ int
2267
+ PyDict_Pop (PyObject * op , PyObject * key , PyObject * * result )
2269
2268
{
2269
+ if (!PyDict_Check (op )) {
2270
+ * result = NULL ;
2271
+ PyErr_BadInternalCall ();
2272
+ return -1 ;
2273
+ }
2274
+ PyDictObject * dict = (PyDictObject * )op ;
2275
+
2276
+ if (dict -> ma_used == 0 ) {
2277
+ * result = NULL ;
2278
+ return 0 ;
2279
+ }
2280
+
2270
2281
Py_hash_t hash ;
2282
+ if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2283
+ hash = PyObject_Hash (key );
2284
+ if (hash == -1 ) {
2285
+ * result = NULL ;
2286
+ return -1 ;
2287
+ }
2288
+ }
2289
+ return _PyDict_Pop_KnownHash (dict , key , hash , result );
2290
+ }
2291
+
2271
2292
2272
- if (((PyDictObject * )dict )-> ma_used == 0 ) {
2273
- if (deflt ) {
2274
- return Py_NewRef (deflt );
2293
+ PyObject *
2294
+ _PyDict_Pop (PyObject * dict , PyObject * key , PyObject * default_value )
2295
+ {
2296
+ PyObject * result ;
2297
+ if (PyDict_Pop (dict , key , & result ) == 0 ) {
2298
+ if (default_value != NULL ) {
2299
+ return Py_NewRef (default_value );
2275
2300
}
2276
2301
_PyErr_SetKeyError (key );
2277
2302
return NULL ;
2278
2303
}
2279
- if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2280
- hash = PyObject_Hash (key );
2281
- if (hash == -1 )
2282
- return NULL ;
2283
- }
2284
- return _PyDict_Pop_KnownHash (dict , key , hash , deflt );
2304
+ return result ;
2285
2305
}
2286
2306
2307
+
2287
2308
/* Internal version of dict.from_keys(). It is subclass-friendly. */
2288
2309
PyObject *
2289
2310
_PyDict_FromKeys (PyObject * cls , PyObject * iterable , PyObject * value )
0 commit comments