@@ -1437,12 +1437,14 @@ static int
14371437heapmanaged_traverse (PyObject * self , visitproc visit , void * arg )
14381438{
14391439 Py_VISIT (Py_TYPE (self ));
1440+ // Test PyObject_VisitManagedDict()
14401441 return PyObject_VisitManagedDict (self , visit , arg );
14411442}
14421443
14431444static int
14441445heapmanaged_clear (PyObject * self )
14451446{
1447+ // Test PyObject_ClearManagedDict()
14461448 PyObject_ClearManagedDict (self );
14471449 return 0 ;
14481450}
@@ -1475,6 +1477,7 @@ static PyType_Spec HeapCTypeWithManagedDict_spec = {
14751477static PyObject *
14761478test_managed_dict (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
14771479{
1480+ // Test PyObject_VisitManagedDict() and PyObject_ClearManagedDict()
14781481 PyObject * type = PyType_FromSpec (& HeapCTypeWithManagedDict_spec );
14791482 if (type == NULL ) {
14801483 return NULL ;
@@ -1926,6 +1929,48 @@ test_bytes(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
19261929}
19271930
19281931
1932+ static PyObject *
1933+ test_iter (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
1934+ {
1935+ // Test PyIter_NextItem()
1936+ PyObject * tuple = Py_BuildValue ("(i)" , 123 );
1937+ if (tuple == NULL ) {
1938+ return NULL ;
1939+ }
1940+ PyObject * iter = PyObject_GetIter (tuple );
1941+ Py_DECREF (tuple );
1942+ if (iter == NULL ) {
1943+ return NULL ;
1944+ }
1945+
1946+ // first item
1947+ PyObject * item = UNINITIALIZED_OBJ ;
1948+ assert (PyIter_NextItem (iter , & item ) == 1 );
1949+ {
1950+ PyObject * expected = PyLong_FromLong (123 );
1951+ assert (PyObject_RichCompareBool (item , expected , Py_EQ ) == 1 );
1952+ assert (expected != NULL );
1953+ Py_DECREF (expected );
1954+ }
1955+
1956+ // StopIteration
1957+ item = UNINITIALIZED_OBJ ;
1958+ assert (PyIter_NextItem (iter , & item ) == 0 );
1959+ assert (item == NULL );
1960+ assert (!PyErr_Occurred ());
1961+
1962+ // non-iterable object
1963+ item = UNINITIALIZED_OBJ ;
1964+ assert (PyIter_NextItem (Py_None , & item ) == -1 );
1965+ assert (item == NULL );
1966+ assert (PyErr_ExceptionMatches (PyExc_TypeError ));
1967+ PyErr_Clear ();
1968+
1969+ Py_DECREF (iter );
1970+ Py_RETURN_NONE ;
1971+ }
1972+
1973+
19291974static struct PyMethodDef methods [] = {
19301975 {"test_object" , test_object , METH_NOARGS , _Py_NULL },
19311976 {"test_py_is" , test_py_is , METH_NOARGS , _Py_NULL },
@@ -1970,6 +2015,7 @@ static struct PyMethodDef methods[] = {
19702015 {"test_unicodewriter_format" , test_unicodewriter_format , METH_NOARGS , _Py_NULL },
19712016#endif
19722017 {"test_bytes" , test_bytes , METH_NOARGS , _Py_NULL },
2018+ {"test_iter" , test_iter , METH_NOARGS , _Py_NULL },
19732019 {_Py_NULL , _Py_NULL , 0 , _Py_NULL }
19742020};
19752021
0 commit comments