@@ -1329,6 +1329,62 @@ test_dict_pop(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
1329
1329
}
1330
1330
1331
1331
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
+
1332
1388
static PyObject *
1333
1389
test_long_api (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
1334
1390
{
@@ -1694,6 +1750,7 @@ static struct PyMethodDef methods[] = {
1694
1750
{"test_getitem" , test_getitem , METH_NOARGS , _Py_NULL },
1695
1751
{"test_dict_api" , test_dict_api , METH_NOARGS , _Py_NULL },
1696
1752
{"test_dict_pop" , test_dict_pop , METH_NOARGS , _Py_NULL },
1753
+ {"test_dict_setdefault" , test_dict_setdefault , METH_NOARGS , _Py_NULL },
1697
1754
{"test_long_api" , test_long_api , METH_NOARGS , _Py_NULL },
1698
1755
#ifdef TEST_MANAGED_DICT
1699
1756
{"test_managed_dict" , test_managed_dict , METH_NOARGS , _Py_NULL },
0 commit comments