Issue #28765: _sre.compile() now checks the type of groupindex and indexgroup
authorVictor Stinner <victor.stinner@gmail.com>
Tue, 22 Nov 2016 22:04:39 +0000 (23:04 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Tue, 22 Nov 2016 22:04:39 +0000 (23:04 +0100)
groupindex must a dictionary and indexgroup must be a tuple.

Previously, indexgroup was a list. Use a tuple to reduce the memory usage.

Lib/sre_compile.py
Lib/test/test_re.py
Modules/_sre.c
Modules/clinic/_sre.c.h
Modules/sre.h

index 420d83de6348b086e4d6abf09a4cf2700513316a..2cc39007ac71288d8deb620a65b8d21c32aa6524 100644 (file)
@@ -576,5 +576,5 @@ def compile(p, flags=0):
     return _sre.compile(
         pattern, flags | p.pattern.flags, code,
         p.pattern.groups-1,
-        groupindex, indexgroup
+        groupindex, tuple(indexgroup)
         )
index 84131d2b9260dfb829c5adf3c99be28af2aae368..6896b4dcbef7321f6b58cd6a654fde040f0fa6f0 100644 (file)
@@ -1506,7 +1506,7 @@ class ReTests(unittest.TestCase):
         long_overflow = 2**128
         self.assertRaises(TypeError, re.finditer, "a", {})
         with self.assertRaises(OverflowError):
-            _sre.compile("abc", 0, [long_overflow], 0, [], [])
+            _sre.compile("abc", 0, [long_overflow], 0, {}, ())
         with self.assertRaises(TypeError):
             _sre.compile({}, 0, [], 0, [], [])
 
index 979e61fb535b798273cccd591d0e2034b2c6b6a5..6e149011017ea36c8d122480d8ad0b784d7fc36b 100644 (file)
@@ -1438,8 +1438,8 @@ _sre.compile
     flags: int
     code: object(subclass_of='&PyList_Type')
     groups: Py_ssize_t
-    groupindex: object
-    indexgroup: object
+    groupindex: object(subclass_of='&PyDict_Type')
+    indexgroup: object(subclass_of='&PyTuple_Type')
 
 [clinic start generated code]*/
 
@@ -1447,7 +1447,7 @@ static PyObject *
 _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
                   PyObject *code, Py_ssize_t groups, PyObject *groupindex,
                   PyObject *indexgroup)
-/*[clinic end generated code: output=ef9c2b3693776404 input=7d059ec8ae1edb85]*/
+/*[clinic end generated code: output=ef9c2b3693776404 input=0a68476dbbe5db30]*/
 {
     /* "compile" pattern descriptor to pattern object */
 
index 0612005d1ea6f99fee3d4d409f3691cbdc5f0214..2b76f0dd1cabac9c211bcd8bb2516087e5a5cb6a 100644 (file)
@@ -438,7 +438,7 @@ _sre_compile(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwna
 {
     PyObject *return_value = NULL;
     static const char * const _keywords[] = {"pattern", "flags", "code", "groups", "groupindex", "indexgroup", NULL};
-    static _PyArg_Parser _parser = {"OiO!nOO:compile", _keywords, 0};
+    static _PyArg_Parser _parser = {"OiO!nO!O!:compile", _keywords, 0};
     PyObject *pattern;
     int flags;
     PyObject *code;
@@ -447,7 +447,7 @@ _sre_compile(PyObject *module, PyObject **args, Py_ssize_t nargs, PyObject *kwna
     PyObject *indexgroup;
 
     if (!_PyArg_ParseStack(args, nargs, kwnames, &_parser,
-        &pattern, &flags, &PyList_Type, &code, &groups, &groupindex, &indexgroup)) {
+        &pattern, &flags, &PyList_Type, &code, &groups, &PyDict_Type, &groupindex, &PyTuple_Type, &indexgroup)) {
         goto exit;
     }
     return_value = _sre_compile_impl(module, pattern, flags, code, groups, groupindex, indexgroup);
@@ -728,4 +728,4 @@ _sre_SRE_Scanner_search(ScannerObject *self, PyObject *Py_UNUSED(ignored))
 {
     return _sre_SRE_Scanner_search_impl(self);
 }
-/*[clinic end generated code: output=a4a246bca1963bc9 input=a9049054013a1b77]*/
+/*[clinic end generated code: output=b74b16d90f207358 input=a9049054013a1b77]*/
index b632165a1f516591e5c3640152c13a8282742ac4..9af5e405749fab5c96c3336e7f0d5ab68e7585d3 100644 (file)
@@ -27,8 +27,8 @@
 typedef struct {
     PyObject_VAR_HEAD
     Py_ssize_t groups; /* must be first! */
-    PyObject* groupindex;
-    PyObject* indexgroup;
+    PyObject* groupindex; /* dict */
+    PyObject* indexgroup; /* tuple */
     /* compatibility */
     PyObject* pattern; /* pattern source (or None) */
     int flags; /* flags used when compiling pattern source */