@@ -1329,6 +1329,62 @@ test_dict_pop(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
13291329}
13301330
13311331
1332+ static PyObject *
1333+ test_dict_setdefault (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
1334+ {
1335+ PyObject * dict = PyDict_New ();
1336+ if (dict == NULL ) {
1337+ return NULL ;
1338+ }
1339+ PyObject * key = PyUnicode_FromString ("key" );
1340+ assert (key != NULL );
1341+ PyObject * value = PyUnicode_FromString ("abc" );
1342+ assert (value != NULL );
1343+ PyObject * invalid_key = PyList_New (0 ); // not hashable key
1344+ assert (invalid_key != NULL );
1345+
1346+ // insert item
1347+ PyObject * result = UNINITIALIZED_OBJ ;
1348+ assert (PyDict_SetDefaultRef (dict , key , value , & result ) == 0 );
1349+ assert (result == value );
1350+ Py_DECREF (result );
1351+
1352+ // item already present
1353+ result = UNINITIALIZED_OBJ ;
1354+ assert (PyDict_SetDefaultRef (dict , key , value , & result ) == 1 );
1355+ assert (result == value );
1356+ Py_DECREF (result );
1357+
1358+ // error: invalid key
1359+ assert (!PyErr_Occurred ());
1360+ result = UNINITIALIZED_OBJ ;
1361+ assert (PyDict_SetDefaultRef (dict , invalid_key , value , & result ) == -1 );
1362+ assert (result == NULL );
1363+ assert (PyErr_Occurred ());
1364+ PyErr_Clear ();
1365+
1366+ // insert item with NULL result
1367+ assert (PyDict_Pop (dict , key , NULL ) == 1 );
1368+ assert (PyDict_SetDefaultRef (dict , key , value , NULL ) == 0 );
1369+
1370+ // item already present with NULL result
1371+ assert (PyDict_SetDefaultRef (dict , key , value , NULL ) == 1 );
1372+
1373+ // error: invalid key with NULL result
1374+ assert (!PyErr_Occurred ());
1375+ assert (PyDict_SetDefaultRef (dict , invalid_key , value , NULL ) == -1 );
1376+ assert (PyErr_Occurred ());
1377+ PyErr_Clear ();
1378+
1379+ // exit
1380+ Py_DECREF (dict );
1381+ Py_DECREF (key );
1382+ Py_DECREF (value );
1383+ Py_DECREF (invalid_key );
1384+ Py_RETURN_NONE ;
1385+ }
1386+
1387+
13321388static PyObject *
13331389test_long_api (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
13341390{
@@ -1694,6 +1750,7 @@ static struct PyMethodDef methods[] = {
16941750 {"test_getitem" , test_getitem , METH_NOARGS , _Py_NULL },
16951751 {"test_dict_api" , test_dict_api , METH_NOARGS , _Py_NULL },
16961752 {"test_dict_pop" , test_dict_pop , METH_NOARGS , _Py_NULL },
1753+ {"test_dict_setdefault" , test_dict_setdefault , METH_NOARGS , _Py_NULL },
16971754 {"test_long_api" , test_long_api , METH_NOARGS , _Py_NULL },
16981755#ifdef TEST_MANAGED_DICT
16991756 {"test_managed_dict" , test_managed_dict , METH_NOARGS , _Py_NULL },
0 commit comments