]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43916: Remove _disabled_new() function (GH-25745)
authorVictor Stinner <vstinner@python.org>
Fri, 30 Apr 2021 12:06:49 +0000 (14:06 +0200)
committerGitHub <noreply@github.com>
Fri, 30 Apr 2021 12:06:49 +0000 (14:06 +0200)
posix and _hashlib use the new Py_TPFLAGS_DISALLOW_INSTANTIATION
flag on their heap types, rather than using a custom tp_new function
(_disabled_new).

Lib/test/test_hashlib.py
Lib/test/test_hmac.py
Modules/_hashopenssl.c
Modules/posixmodule.c

index 9e9c874445c27dca33b2d499abfd181edacacd42..1236aa723b19950e4670697b661b7d29f9b30747 100644 (file)
@@ -905,11 +905,11 @@ class HashLibTestCase(unittest.TestCase):
     def test_internal_types(self):
         # internal types like _hashlib.HASH are not constructable
         with self.assertRaisesRegex(
-            TypeError, "cannot create 'HASH' instance"
+            TypeError, "cannot create '_hashlib.HASH' instance"
         ):
             HASH()
         with self.assertRaisesRegex(
-            TypeError, "cannot create 'HASHXOF' instance"
+            TypeError, "cannot create '_hashlib.HASHXOF' instance"
         ):
             HASHXOF()
 
index adf52adbf22afa61e4c71074e5a24ba29d92b5b5..22d74e9a1138a1218a237474a24a648fb7bc9e5b 100644 (file)
@@ -440,7 +440,7 @@ class ConstructorTestCase(unittest.TestCase):
     def test_internal_types(self):
         # internal types like _hashlib.C_HMAC are not constructable
         with self.assertRaisesRegex(
-            TypeError, "cannot create 'HMAC' instance"
+            TypeError, "cannot create '_hashlib.HMAC' instance"
         ):
             C_HMAC()
 
index 870ee89fdafc63f3f4aa2450489b9368c6284ea6..de9bdd4f3062d592cb68cdcf02f2f95cdd004723 100644 (file)
@@ -118,15 +118,6 @@ _setException(PyObject *exc)
 }
 /* LCOV_EXCL_STOP */
 
-/* {Py_tp_new, NULL} doesn't block __new__ */
-static PyObject *
-_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
-    PyErr_Format(PyExc_TypeError,
-        "cannot create '%.100s' instances", _PyType_Name(type));
-    return NULL;
-}
-
 static PyObject*
 py_digest_name(const EVP_MD *md)
 {
@@ -590,7 +581,6 @@ static PyType_Slot EVPtype_slots[] = {
     {Py_tp_doc, (char *)hashtype_doc},
     {Py_tp_methods, EVP_methods},
     {Py_tp_getset, EVP_getseters},
-    {Py_tp_new, _disabled_new},
     {0, 0},
 };
 
@@ -598,7 +588,7 @@ static PyType_Spec EVPtype_spec = {
     "_hashlib.HASH",    /*tp_name*/
     sizeof(EVPobject),  /*tp_basicsize*/
     0,                  /*tp_itemsize*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
     EVPtype_slots
 };
 
@@ -740,7 +730,6 @@ static PyType_Slot EVPXOFtype_slots[] = {
     {Py_tp_doc, (char *)hashxoftype_doc},
     {Py_tp_methods, EVPXOF_methods},
     {Py_tp_getset, EVPXOF_getseters},
-    {Py_tp_new, _disabled_new},
     {0, 0},
 };
 
@@ -748,7 +737,7 @@ static PyType_Spec EVPXOFtype_spec = {
     "_hashlib.HASHXOF",    /*tp_name*/
     sizeof(EVPobject),  /*tp_basicsize*/
     0,                  /*tp_itemsize*/
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_DISALLOW_INSTANTIATION,
     EVPXOFtype_slots
 };
 
@@ -1734,14 +1723,13 @@ static PyType_Slot HMACtype_slots[] = {
     {Py_tp_dealloc,(destructor)_hmac_dealloc},
     {Py_tp_methods, HMAC_methods},
     {Py_tp_getset, HMAC_getset},
-    {Py_tp_new, _disabled_new},
     {0, NULL}
 };
 
 PyType_Spec HMACtype_spec = {
     "_hashlib.HMAC",    /* name */
     sizeof(HMACobject),     /* basicsize */
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
     .slots = HMACtype_slots,
 };
 
index ecd210e4babf54b404bf58af81c9488d794515a7..25ddc82cb893ab33660e575a48e9e0352323c581 100644 (file)
@@ -13415,14 +13415,6 @@ typedef struct {
 #endif
 } DirEntry;
 
-static PyObject *
-_disabled_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)
-{
-    PyErr_Format(PyExc_TypeError,
-        "cannot create '%.100s' instances", _PyType_Name(type));
-    return NULL;
-}
-
 static void
 DirEntry_dealloc(DirEntry *entry)
 {
@@ -13781,7 +13773,6 @@ static PyMethodDef DirEntry_methods[] = {
 };
 
 static PyType_Slot DirEntryType_slots[] = {
-    {Py_tp_new, _disabled_new},
     {Py_tp_dealloc, DirEntry_dealloc},
     {Py_tp_repr, DirEntry_repr},
     {Py_tp_methods, DirEntry_methods},
@@ -13793,7 +13784,7 @@ static PyType_Spec DirEntryType_spec = {
     MODNAME ".DirEntry",
     sizeof(DirEntry),
     0,
-    Py_TPFLAGS_DEFAULT,
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
     DirEntryType_slots
 };
 
@@ -14213,7 +14204,6 @@ static PyMethodDef ScandirIterator_methods[] = {
 };
 
 static PyType_Slot ScandirIteratorType_slots[] = {
-    {Py_tp_new, _disabled_new},
     {Py_tp_dealloc, ScandirIterator_dealloc},
     {Py_tp_finalize, ScandirIterator_finalize},
     {Py_tp_iter, PyObject_SelfIter},
@@ -14228,7 +14218,8 @@ static PyType_Spec ScandirIteratorType_spec = {
     0,
     // bpo-40549: Py_TPFLAGS_BASETYPE should not be used, since
     // PyType_GetModule(Py_TYPE(self)) doesn't work on a subclass instance.
-    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE,
+    (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE
+        | Py_TPFLAGS_DISALLOW_INSTANTIATION),
     ScandirIteratorType_slots
 };