@@ -1573,6 +1573,91 @@ test_time(PyObject *Py_UNUSED(module), PyObject *Py_UNUSED(args))
15731573#endif
15741574
15751575
1576+ static void
1577+ check_get_constant (PyObject * (* get_constant )(unsigned int ), int borrowed )
1578+ {
1579+ #define CLEAR (var ) if (!borrowed) { Py_DECREF(var); }
1580+
1581+ PyObject * obj , * expected ;
1582+
1583+ // Py_CONSTANT_NONE
1584+ obj = get_constant (Py_CONSTANT_NONE );
1585+ assert (obj == Py_None );
1586+ CLEAR (obj );
1587+
1588+ // Py_CONSTANT_FALSE
1589+ obj = get_constant (Py_CONSTANT_FALSE );
1590+ assert (obj = Py_False );
1591+ CLEAR (obj );
1592+
1593+ // Py_CONSTANT_TRUE
1594+ obj = get_constant (Py_CONSTANT_TRUE );
1595+ assert (obj == Py_True );
1596+ CLEAR (obj );
1597+
1598+ // Py_CONSTANT_ELLIPSIS
1599+ obj = get_constant (Py_CONSTANT_ELLIPSIS );
1600+ assert (obj == Py_Ellipsis );
1601+ CLEAR (obj );
1602+
1603+ // Py_CONSTANT_NOT_IMPLEMENTED
1604+ obj = get_constant (Py_CONSTANT_NOT_IMPLEMENTED );
1605+ assert (obj == Py_NotImplemented );
1606+ CLEAR (obj );
1607+
1608+ // Py_CONSTANT_ZERO
1609+ obj = get_constant (Py_CONSTANT_ZERO );
1610+ expected = PyLong_FromLong (0 );
1611+ assert (expected != NULL );
1612+ assert (Py_TYPE (obj ) == & PyLong_Type );
1613+ assert (PyObject_RichCompareBool (obj , expected , Py_EQ ) == 1 );
1614+ CLEAR (obj );
1615+ Py_DECREF (expected );
1616+
1617+ // Py_CONSTANT_ONE
1618+ obj = get_constant (Py_CONSTANT_ONE );
1619+ expected = PyLong_FromLong (1 );
1620+ assert (expected != NULL );
1621+ assert (Py_TYPE (obj ) == & PyLong_Type );
1622+ assert (PyObject_RichCompareBool (obj , expected , Py_EQ ) == 1 );
1623+ CLEAR (obj );
1624+ Py_DECREF (expected );
1625+
1626+ // Py_CONSTANT_EMPTY_STR
1627+ obj = get_constant (Py_CONSTANT_EMPTY_STR );
1628+ assert (Py_TYPE (obj ) == & PyUnicode_Type );
1629+ #if PY_VERSION_HEX >= 0x03030000
1630+ assert (PyUnicode_GetLength (obj ) == 0 );
1631+ #else
1632+ assert (PyUnicode_GetSize (obj ) == 0 );
1633+ #endif
1634+ CLEAR (obj );
1635+
1636+ // Py_CONSTANT_EMPTY_BYTES
1637+ obj = get_constant (Py_CONSTANT_EMPTY_BYTES );
1638+ assert (Py_TYPE (obj ) == & PyBytes_Type );
1639+ assert (PyBytes_Size (obj ) == 0 );
1640+ CLEAR (obj );
1641+
1642+ // Py_CONSTANT_EMPTY_TUPLE
1643+ obj = get_constant (Py_CONSTANT_EMPTY_TUPLE );
1644+ assert (Py_TYPE (obj ) == & PyTuple_Type );
1645+ assert (PyTuple_Size (obj ) == 0 );
1646+ CLEAR (obj );
1647+
1648+ #undef CLEAR
1649+ }
1650+
1651+
1652+ static PyObject *
1653+ test_get_constant (PyObject * Py_UNUSED (module ), PyObject * Py_UNUSED (args ))
1654+ {
1655+ check_get_constant (Py_GetConstant , 0 );
1656+ check_get_constant (Py_GetConstantBorrowed , 1 );
1657+ Py_RETURN_NONE ;
1658+ }
1659+
1660+
15761661static struct PyMethodDef methods [] = {
15771662 {"test_object" , test_object , METH_NOARGS , _Py_NULL },
15781663 {"test_py_is" , test_py_is , METH_NOARGS , _Py_NULL },
@@ -1609,6 +1694,7 @@ static struct PyMethodDef methods[] = {
16091694#ifdef TEST_PYTIME
16101695 {"test_time" , test_time , METH_NOARGS , _Py_NULL },
16111696#endif
1697+ {"test_get_constant" , test_get_constant , METH_NOARGS , _Py_NULL },
16121698 {_Py_NULL , _Py_NULL , 0 , _Py_NULL }
16131699};
16141700
0 commit comments