From 726a57d45f8606ad5a33f7c6bbd1e8c2f8cfbdef Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 22 Nov 2016 23:04:39 +0100 Subject: [PATCH] Issue #28765: _sre.compile() now checks the type of groupindex and indexgroup 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 | 2 +- Lib/test/test_re.py | 2 +- Modules/_sre.c | 6 +++--- Modules/clinic/_sre.c.h | 6 +++--- Modules/sre.h | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Lib/sre_compile.py b/Lib/sre_compile.py index 420d83de634..2cc39007ac7 100644 --- a/Lib/sre_compile.py +++ b/Lib/sre_compile.py @@ -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) ) diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py index 84131d2b926..6896b4dcbef 100644 --- a/Lib/test/test_re.py +++ b/Lib/test/test_re.py @@ -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, [], []) diff --git a/Modules/_sre.c b/Modules/_sre.c index 979e61fb535..6e149011017 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -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 */ diff --git a/Modules/clinic/_sre.c.h b/Modules/clinic/_sre.c.h index 0612005d1ea..2b76f0dd1ca 100644 --- a/Modules/clinic/_sre.c.h +++ b/Modules/clinic/_sre.c.h @@ -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]*/ diff --git a/Modules/sre.h b/Modules/sre.h index b632165a1f5..9af5e405749 100644 --- a/Modules/sre.h +++ b/Modules/sre.h @@ -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 */