@@ -2226,64 +2226,102 @@ 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 ) ;
2238
+ if (result ) {
2239
+ * result = NULL ;
2244
2240
}
2245
- _PyErr_SetKeyError (key );
2246
- return NULL ;
2241
+ return 0 ;
2247
2242
}
2248
- ix = _Py_dict_lookup (mp , key , hash , & old_value );
2249
- if (ix == DKIX_ERROR )
2250
- return NULL ;
2243
+
2244
+ PyObject * old_value ;
2245
+ Py_ssize_t ix = _Py_dict_lookup (mp , key , hash , & old_value );
2246
+ if (ix == DKIX_ERROR ) {
2247
+ if (result ) {
2248
+ * result = NULL ;
2249
+ }
2250
+ return -1 ;
2251
+ }
2252
+
2251
2253
if (ix == DKIX_EMPTY || old_value == NULL ) {
2252
- if (deflt ) {
2253
- return Py_NewRef ( deflt ) ;
2254
+ if (result ) {
2255
+ * result = NULL ;
2254
2256
}
2255
- _PyErr_SetKeyError (key );
2256
- return NULL ;
2257
+ return 0 ;
2257
2258
}
2259
+
2258
2260
assert (old_value != NULL );
2261
+ PyInterpreterState * interp = _PyInterpreterState_GET ();
2259
2262
uint64_t new_version = _PyDict_NotifyEvent (
2260
2263
interp , PyDict_EVENT_DELETED , mp , key , NULL );
2261
2264
delitem_common (mp , hash , ix , Py_NewRef (old_value ), new_version );
2262
2265
2263
2266
ASSERT_CONSISTENT (mp );
2264
- return old_value ;
2267
+ if (result ) {
2268
+ * result = old_value ;
2269
+ }
2270
+ else {
2271
+ Py_DECREF (old_value );
2272
+ }
2273
+ return 1 ;
2265
2274
}
2266
2275
2267
- PyObject *
2268
- _PyDict_Pop (PyObject * dict , PyObject * key , PyObject * deflt )
2276
+
2277
+ int
2278
+ PyDict_Pop (PyObject * op , PyObject * key , PyObject * * result )
2269
2279
{
2270
- Py_hash_t hash ;
2280
+ if (!PyDict_Check (op )) {
2281
+ if (result ) {
2282
+ * result = NULL ;
2283
+ }
2284
+ PyErr_BadInternalCall ();
2285
+ return -1 ;
2286
+ }
2287
+ PyDictObject * dict = (PyDictObject * )op ;
2271
2288
2272
- if ((( PyDictObject * ) dict ) -> ma_used == 0 ) {
2273
- if (deflt ) {
2274
- return Py_NewRef ( deflt ) ;
2289
+ if (dict -> ma_used == 0 ) {
2290
+ if (result ) {
2291
+ * result = NULL ;
2275
2292
}
2276
- _PyErr_SetKeyError (key );
2277
- return NULL ;
2293
+ return 0 ;
2278
2294
}
2295
+
2296
+ Py_hash_t hash ;
2279
2297
if (!PyUnicode_CheckExact (key ) || (hash = unicode_get_hash (key )) == -1 ) {
2280
2298
hash = PyObject_Hash (key );
2281
- if (hash == -1 )
2282
- return NULL ;
2299
+ if (hash == -1 ) {
2300
+ if (result ) {
2301
+ * result = NULL ;
2302
+ }
2303
+ return -1 ;
2304
+ }
2283
2305
}
2284
- return _PyDict_Pop_KnownHash (dict , key , hash , deflt );
2306
+ return _PyDict_Pop_KnownHash (dict , key , hash , result );
2285
2307
}
2286
2308
2309
+
2310
+ PyObject *
2311
+ _PyDict_Pop (PyObject * dict , PyObject * key , PyObject * default_value )
2312
+ {
2313
+ PyObject * result ;
2314
+ if (PyDict_Pop (dict , key , & result ) == 0 ) {
2315
+ if (default_value != NULL ) {
2316
+ return Py_NewRef (default_value );
2317
+ }
2318
+ _PyErr_SetKeyError (key );
2319
+ return NULL ;
2320
+ }
2321
+ return result ;
2322
+ }
2323
+
2324
+
2287
2325
/* Internal version of dict.from_keys(). It is subclass-friendly. */
2288
2326
PyObject *
2289
2327
_PyDict_FromKeys (PyObject * cls , PyObject * iterable , PyObject * value )
0 commit comments