@@ -573,19 +573,19 @@ static PyObject *
573
573
test_get_type_name (PyObject * self , PyObject * Py_UNUSED (ignored ))
574
574
{
575
575
PyObject * tp_name = PyType_GetName (& PyLong_Type );
576
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "int" ) == 0 );
576
+ assert (PyUnicode_EqualToUTF8 ( tp_name , "int" ));
577
577
Py_DECREF (tp_name );
578
578
579
579
tp_name = PyType_GetName (& PyModule_Type );
580
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "module" ) == 0 );
580
+ assert (PyUnicode_EqualToUTF8 ( tp_name , "module" ));
581
581
Py_DECREF (tp_name );
582
582
583
583
PyObject * HeapTypeNameType = PyType_FromSpec (& HeapTypeNameType_Spec );
584
584
if (HeapTypeNameType == NULL ) {
585
585
Py_RETURN_NONE ;
586
586
}
587
587
tp_name = PyType_GetName ((PyTypeObject * )HeapTypeNameType );
588
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "HeapTypeNameType" ) == 0 );
588
+ assert (PyUnicode_EqualToUTF8 ( tp_name , "HeapTypeNameType" ));
589
589
Py_DECREF (tp_name );
590
590
591
591
PyObject * name = PyUnicode_FromString ("test_name" );
@@ -597,7 +597,7 @@ test_get_type_name(PyObject *self, PyObject *Py_UNUSED(ignored))
597
597
goto done ;
598
598
}
599
599
tp_name = PyType_GetName ((PyTypeObject * )HeapTypeNameType );
600
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_name ) , "test_name" ) == 0 );
600
+ assert (PyUnicode_EqualToUTF8 ( tp_name , "test_name" ));
601
601
Py_DECREF (name );
602
602
Py_DECREF (tp_name );
603
603
@@ -611,19 +611,19 @@ static PyObject *
611
611
test_get_type_qualname (PyObject * self , PyObject * Py_UNUSED (ignored ))
612
612
{
613
613
PyObject * tp_qualname = PyType_GetQualName (& PyLong_Type );
614
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "int" ) == 0 );
614
+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "int" ));
615
615
Py_DECREF (tp_qualname );
616
616
617
617
tp_qualname = PyType_GetQualName (& PyODict_Type );
618
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "OrderedDict" ) == 0 );
618
+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "OrderedDict" ));
619
619
Py_DECREF (tp_qualname );
620
620
621
621
PyObject * HeapTypeNameType = PyType_FromSpec (& HeapTypeNameType_Spec );
622
622
if (HeapTypeNameType == NULL ) {
623
623
Py_RETURN_NONE ;
624
624
}
625
625
tp_qualname = PyType_GetQualName ((PyTypeObject * )HeapTypeNameType );
626
- assert (strcmp ( PyUnicode_AsUTF8 ( tp_qualname ) , "HeapTypeNameType" ) == 0 );
626
+ assert (PyUnicode_EqualToUTF8 ( tp_qualname , "HeapTypeNameType" ));
627
627
Py_DECREF (tp_qualname );
628
628
629
629
PyObject * spec_name = PyUnicode_FromString (HeapTypeNameType_Spec .name );
@@ -636,8 +636,7 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
636
636
goto done ;
637
637
}
638
638
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" ));
641
640
Py_DECREF (spec_name );
642
641
Py_DECREF (tp_qualname );
643
642
@@ -646,6 +645,42 @@ test_get_type_qualname(PyObject *self, PyObject *Py_UNUSED(ignored))
646
645
Py_RETURN_NONE ;
647
646
}
648
647
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
+
649
684
static PyObject *
650
685
test_get_type_dict (PyObject * self , PyObject * Py_UNUSED (ignored ))
651
686
{
@@ -3212,6 +3247,7 @@ static PyMethodDef TestMethods[] = {
3212
3247
{"test_get_statictype_slots" , test_get_statictype_slots , METH_NOARGS },
3213
3248
{"test_get_type_name" , test_get_type_name , METH_NOARGS },
3214
3249
{"test_get_type_qualname" , test_get_type_qualname , METH_NOARGS },
3250
+ {"test_get_type_fullyqualname" , test_get_type_fullyqualname , METH_NOARGS },
3215
3251
{"test_get_type_dict" , test_get_type_dict , METH_NOARGS },
3216
3252
{"_test_thread_state" , test_thread_state , METH_VARARGS },
3217
3253
#ifndef MS_WINDOWS
0 commit comments