]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-43908: Make re types immutable (GH-25697)
authorErlend Egeberg Aasland <erlend.aasland@innova.no>
Thu, 29 Apr 2021 06:47:11 +0000 (08:47 +0200)
committerGitHub <noreply@github.com>
Thu, 29 Apr 2021 06:47:11 +0000 (08:47 +0200)
Co-authored-by: Victor Stinner <vstinner@python.org>
Lib/test/test_re.py
Misc/NEWS.d/next/Core and Builtins/2021-04-26-21-20-41.bpo-43908.2L51nO.rst [new file with mode: 0644]
Modules/_sre.c

index bd689582523c32ca5e497c4ca05ff351a140be0f..96d0cdb17a7ee3447e452831fa40372688c445e9 100644 (file)
@@ -2190,6 +2190,18 @@ class ImplementationTest(unittest.TestCase):
     Test implementation details of the re module.
     """
 
+    @cpython_only
+    def test_immutable(self):
+        # bpo-43908: check that re types are immutable
+        with self.assertRaises(TypeError):
+            re.Match.foo = 1
+        with self.assertRaises(TypeError):
+            re.Pattern.foo = 1
+        with self.assertRaises(TypeError):
+            pat = re.compile("")
+            tp = type(pat.scanner(""))
+            tp.foo = 1
+
     def test_overlap_table(self):
         f = sre_compile._generate_overlap_table
         self.assertEqual(f(""), [])
diff --git a/Misc/NEWS.d/next/Core and Builtins/2021-04-26-21-20-41.bpo-43908.2L51nO.rst b/Misc/NEWS.d/next/Core and Builtins/2021-04-26-21-20-41.bpo-43908.2L51nO.rst
new file mode 100644 (file)
index 0000000..1709351
--- /dev/null
@@ -0,0 +1,2 @@
+Make :mod:`re` types immutable. Patch by
+Erlend E. Aasland.
index d4bfff6e849e375cce8a3a82ce9e9502164f3f92..59f7551a227cd323bcdd517a6bdc819817e03112 100644 (file)
@@ -2690,7 +2690,7 @@ static PyType_Spec pattern_spec = {
     .name = "re.Pattern",
     .basicsize = sizeof(PatternObject),
     .itemsize = sizeof(SRE_CODE),
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = pattern_slots,
 };
 
@@ -2755,7 +2755,7 @@ static PyType_Spec match_spec = {
     .name = "re.Match",
     .basicsize = sizeof(MatchObject),
     .itemsize = sizeof(Py_ssize_t),
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = match_slots,
 };
 
@@ -2781,7 +2781,7 @@ static PyType_Slot scanner_slots[] = {
 static PyType_Spec scanner_spec = {
     .name = "_" SRE_MODULE ".SRE_Scanner",
     .basicsize = sizeof(ScannerObject),
-    .flags = Py_TPFLAGS_DEFAULT,
+    .flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_IMMUTABLETYPE,
     .slots = scanner_slots,
 };