@@ -1253,6 +1253,82 @@ test_dict_api(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
12531253}
12541254
12551255
1256+ static PyObject *
1257+ test_dict_pop (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
1258+ {
1259+ PyObject * dict = PyDict_New ();
1260+ if (dict == NULL ) {
1261+ return NULL ;
1262+ }
1263+
1264+ PyObject * key = PyUnicode_FromString ("key" );
1265+ assert (key != NULL );
1266+ PyObject * value = PyUnicode_FromString ("abc" );
1267+ assert (value != NULL );
1268+
1269+ // test PyDict_Pop(), get the removed value, key is present
1270+ assert (PyDict_SetItem (dict , key , value ) == 0 );
1271+ PyObject * removed = UNINITIALIZED_OBJ ;
1272+ assert (PyDict_Pop (dict , key , & removed ) == 1 );
1273+ assert (removed == value );
1274+ Py_DECREF (removed );
1275+
1276+ // test PyDict_Pop(), ignore the removed value, key is present
1277+ assert (PyDict_SetItem (dict , key , value ) == 0 );
1278+ assert (PyDict_Pop (dict , key , NULL ) == 1 );
1279+
1280+ // test PyDict_Pop(), key is missing
1281+ removed = UNINITIALIZED_OBJ ;
1282+ assert (PyDict_Pop (dict , key , & removed ) == 0 );
1283+ assert (removed == NULL );
1284+ assert (PyDict_Pop (dict , key , NULL ) == 0 );
1285+
1286+ // test PyDict_PopString(), get the removed value, key is present
1287+ assert (PyDict_SetItem (dict , key , value ) == 0 );
1288+ removed = UNINITIALIZED_OBJ ;
1289+ assert (PyDict_PopString (dict , "key" , & removed ) == 1 );
1290+ assert (removed == value );
1291+ Py_DECREF (removed );
1292+
1293+ // test PyDict_PopString(), ignore the removed value, key is present
1294+ assert (PyDict_SetItem (dict , key , value ) == 0 );
1295+ assert (PyDict_PopString (dict , "key" , NULL ) == 1 );
1296+
1297+ // test PyDict_PopString(), key is missing
1298+ removed = UNINITIALIZED_OBJ ;
1299+ assert (PyDict_PopString (dict , "key" , & removed ) == 0 );
1300+ assert (removed == NULL );
1301+ assert (PyDict_PopString (dict , "key" , NULL ) == 0 );
1302+
1303+ // dict error
1304+ removed = UNINITIALIZED_OBJ ;
1305+ assert (PyDict_Pop (key , key , & removed ) == -1 );
1306+ assert (removed == NULL );
1307+ assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1308+ PyErr_Clear ();
1309+
1310+ assert (PyDict_Pop (key , key , NULL ) == -1 );
1311+ assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1312+ PyErr_Clear ();
1313+
1314+ removed = UNINITIALIZED_OBJ ;
1315+ assert (PyDict_PopString (key , "key" , & removed ) == -1 );
1316+ assert (removed == NULL );
1317+ assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1318+ PyErr_Clear ();
1319+
1320+ assert (PyDict_PopString (key , "key" , NULL ) == -1 );
1321+ assert (PyErr_ExceptionMatches (PyExc_SystemError ));
1322+ PyErr_Clear ();
1323+
1324+ // exit
1325+ Py_DECREF (dict );
1326+ Py_DECREF (key );
1327+ Py_DECREF (value );
1328+ Py_RETURN_NONE ;
1329+ }
1330+
1331+
12561332static PyObject *
12571333test_long_api (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
12581334{
@@ -1447,6 +1523,7 @@ static struct PyMethodDef methods[] = {
14471523 {"test_getattr" , test_getattr , METH_NOARGS , _Py_NULL },
14481524 {"test_getitem" , test_getitem , METH_NOARGS , _Py_NULL },
14491525 {"test_dict_api" , test_dict_api , METH_NOARGS , _Py_NULL },
1526+ {"test_dict_pop" , test_dict_pop , METH_NOARGS , _Py_NULL },
14501527 {"test_long_api" , test_long_api , METH_NOARGS , _Py_NULL },
14511528#ifdef TEST_MANAGED_DICT
14521529 {"test_managed_dict" , test_managed_dict , METH_NOARGS , _Py_NULL },
0 commit comments