@@ -573,19 +573,19 @@ static PyObject *
573573test_get_type_name (PyObject * self , PyObject * Py_UNUSED (ignored ))
574574{
575575 PyObject * tp_name = PyType_GetName (& PyLong_Type );
576- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "int" ) == 0 );
576+ assert (PyUnicode_EqualToUTF8 ( tp_name , "int" ));
577577 Py_DECREF (tp_name );
578578
579579 tp_name = PyType_GetName (& PyModule_Type );
580- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "module" ) == 0 );
580+ assert (PyUnicode_EqualToUTF8 ( tp_name , "module" ));
581581 Py_DECREF (tp_name );
582582
583583 PyObject * HeapTypeNameType = PyType_FromSpec (& HeapTypeNameType_Spec );
584584 if (HeapTypeNameType == NULL ) {
585585 Py_RETURN_NONE ;
586586 }
587587 tp_name = PyType_GetName ((PyTypeObject * )HeapTypeNameType );
588- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "HeapTypeNameType" ) == 0 );
588+ assert (PyUnicode_EqualToUTF8 ( tp_name , "HeapTypeNameType" ));
589589 Py_DECREF (tp_name );
590590
591591 PyObject * name = PyUnicode_FromString ("test_name" );
@@ -597,7 +597,7 @@ test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
597597 goto done ;
598598 }
599599 tp_name = PyType_GetName ((PyTypeObject * )HeapTypeNameType );
600- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "test_name" ) == 0 );
600+ assert (PyUnicode_EqualToUTF8 ( tp_name , "test_name" ));
601601 Py_DECREF (name );
602602 Py_DECREF (tp_name );
603603
@@ -611,19 +611,19 @@ static PyObject *
611611test_get_type_qualname (PyObject * self , PyObject * Py_UNUSED (ignored ))
612612{
613613 PyObject * tp_qualname = PyType_GetQualName (& PyLong_Type );
614- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "int" ) == 0 );
614+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "int" ));
615615 Py_DECREF (tp_qualname );
616616
617617 tp_qualname = PyType_GetQualName (& PyODict_Type );
618- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "OrderedDict" ) == 0 );
618+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "OrderedDict" ));
619619 Py_DECREF (tp_qualname );
620620
621621 PyObject * HeapTypeNameType = PyType_FromSpec (& HeapTypeNameType_Spec );
622622 if (HeapTypeNameType == NULL ) {
623623 Py_RETURN_NONE ;
624624 }
625625 tp_qualname = PyType_GetQualName ((PyTypeObject * )HeapTypeNameType );
626- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "HeapTypeNameType" ) == 0 );
626+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "HeapTypeNameType" ));
627627 Py_DECREF (tp_qualname );
628628
629629 PyObject * spec_name = PyUnicode_FromString (HeapTypeNameType_Spec .name );
@@ -636,8 +636,7 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
636636 goto done ;
637637 }
638638 tp_qualname = PyType_GetQualName ((PyTypeObject * )HeapTypeNameType );
639- assert (strcmp (PyUnicode_AsUTF8 (tp_qualname ),
640- "_testcapi.HeapTypeNameType" ) == 0 );
639+ assert (PyUnicode_EqualToUTF8 (tp_qualname , "_testcapi.HeapTypeNameType" ));
641640 Py_DECREF (spec_name );
642641 Py_DECREF (tp_qualname );
643642
@@ -646,6 +645,42 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
646645 Py_RETURN_NONE ;
647646}
648647
648+ static PyObject *
649+ test_get_type_fullyqualname (PyObject * self , PyObject * Py_UNUSED (ignored ))
650+ {
651+ PyObject * name = PyType_GetFullyQualName (& PyLong_Type );
652+ assert (PyUnicode_EqualToUTF8 (name , "int" ));
653+ Py_DECREF (name );
654+
655+ name = PyType_GetFullyQualName (& PyODict_Type );
656+ assert (PyUnicode_EqualToUTF8 (name , "collections.OrderedDict" ));
657+ Py_DECREF (name );
658+
659+ PyObject * HeapTypeNameType = PyType_FromSpec (& HeapTypeNameType_Spec );
660+ if (HeapTypeNameType == NULL ) {
661+ Py_RETURN_NONE ;
662+ }
663+ name = PyType_GetFullyQualName ((PyTypeObject * )HeapTypeNameType );
664+ assert (PyUnicode_EqualToUTF8 (name , "_testcapi.HeapTypeNameType" ));
665+ Py_DECREF (name );
666+
667+ PyObject * new_name = PyUnicode_FromString ("override_name" );
668+ if (new_name == NULL ) {
669+ goto done ;
670+ }
671+
672+ int res = PyObject_SetAttrString (HeapTypeNameType ,
673+ "__fullyqualname__" , new_name );
674+ Py_DECREF (new_name );
675+ assert (res < 0 );
676+ assert (PyErr_ExceptionMatches (PyExc_AttributeError ));
677+ PyErr_Clear ();
678+
679+ done :
680+ Py_DECREF (HeapTypeNameType );
681+ Py_RETURN_NONE ;
682+ }
683+
649684static PyObject *
650685test_get_type_dict (PyObject * self , PyObject * Py_UNUSED (ignored ))
651686{
@@ -3212,6 +3247,7 @@ static PyMethodDef TestMethods[] = {
32123247 {"test_get_statictype_slots" , test_get_statictype_slots , METH_NOARGS },
32133248 {"test_get_type_name" , test_get_type_name , METH_NOARGS },
32143249 {"test_get_type_qualname" , test_get_type_qualname , METH_NOARGS },
3250+ {"test_get_type_fullyqualname" , test_get_type_fullyqualname , METH_NOARGS },
32153251 {"test_get_type_dict" , test_get_type_dict , METH_NOARGS },
32163252 {"_test_thread_state" , test_thread_state , METH_VARARGS },
32173253#ifndef MS_WINDOWS
0 commit comments