diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-04-16 06:39:30 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-16 06:39:30 (GMT) |
commit | cd85d0b90b39310c8ca7329bd35e82c2c1c8f4ad (patch) | |
tree | 1d0715873378e0c3e6d64c476f8cc17198a3a8ea /Modules | |
parent | baf9f29811dba9c06e76b8e220bd77260202f299 (diff) | |
download | cpython-cd85d0b90b39310c8ca7329bd35e82c2c1c8f4ad.zip cpython-cd85d0b90b39310c8ca7329bd35e82c2c1c8f4ad.tar.gz cpython-cd85d0b90b39310c8ca7329bd35e82c2c1c8f4ad.tar.bz2 |
bpo-28765: Use concrete types API in _sre.c. (#1009)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_sre.c | 74 |
1 files changed, 37 insertions, 37 deletions
diff --git a/Modules/_sre.c b/Modules/_sre.c index 84c47bb..ef8295a 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -701,6 +701,9 @@ deepcopy(PyObject** object, PyObject* memo) { PyObject* copy; + if (!*object) + return 1; + copy = call( "copy", "deepcopy", PyTuple_Pack(2, *object, memo) @@ -1368,6 +1371,8 @@ PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects"); static PyObject * pattern_groupindex(PatternObject *self) { + if (self->groupindex == NULL) + return PyDict_New(); return PyDictProxy_New(self->groupindex); } @@ -1448,11 +1453,14 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags, self->groups = groups; - Py_INCREF(groupindex); - self->groupindex = groupindex; - - Py_INCREF(indexgroup); - self->indexgroup = indexgroup; + if (PyDict_GET_SIZE(groupindex) > 0) { + Py_INCREF(groupindex); + self->groupindex = groupindex; + if (PyTuple_GET_SIZE(indexgroup) > 0) { + Py_INCREF(indexgroup); + self->indexgroup = indexgroup; + } + } if (!_validate(self)) { Py_DECREF(self); @@ -1994,13 +2002,10 @@ match_getindex(MatchObject* self, PyObject* index) i = -1; if (self->pattern->groupindex) { - index = PyObject_GetItem(self->pattern->groupindex, index); - if (index) { - if (PyLong_Check(index)) - i = PyLong_AsSsize_t(index); - Py_DECREF(index); - } else - PyErr_Clear(); + index = PyDict_GetItem(self->pattern->groupindex, index); + if (index && PyLong_Check(index)) { + i = PyLong_AsSsize_t(index); + } } return i; @@ -2118,40 +2123,34 @@ static PyObject * _sre_SRE_Match_groupdict_impl(MatchObject *self, PyObject *default_value) /*[clinic end generated code: output=29917c9073e41757 input=0ded7960b23780aa]*/ { - PyObject* result; - PyObject* keys; - Py_ssize_t index; + PyObject *result; + PyObject *key; + PyObject *value; + Py_ssize_t pos = 0; + Py_hash_t hash; result = PyDict_New(); if (!result || !self->pattern->groupindex) return result; - keys = PyMapping_Keys(self->pattern->groupindex); - if (!keys) - goto failed; - - for (index = 0; index < PyList_GET_SIZE(keys); index++) { + while (_PyDict_Next(self->pattern->groupindex, &pos, &key, &value, &hash)) { int status; - PyObject* key; - PyObject* value; - key = PyList_GET_ITEM(keys, index); - if (!key) - goto failed; + Py_INCREF(key); value = match_getslice(self, key, default_value); - if (!value) + if (!value) { + Py_DECREF(key); goto failed; - status = PyDict_SetItem(result, key, value); + } + status = _PyDict_SetItem_KnownHash(result, key, value, hash); Py_DECREF(value); + Py_DECREF(key); if (status < 0) goto failed; } - Py_DECREF(keys); - return result; failed: - Py_XDECREF(keys); Py_DECREF(result); return NULL; } @@ -2378,13 +2377,14 @@ match_lastindex_get(MatchObject *self) static PyObject * match_lastgroup_get(MatchObject *self) { - if (self->pattern->indexgroup && self->lastindex >= 0) { - PyObject* result = PySequence_GetItem( - self->pattern->indexgroup, self->lastindex - ); - if (result) - return result; - PyErr_Clear(); + if (self->pattern->indexgroup && + self->lastindex >= 0 && + self->lastindex < PyTuple_GET_SIZE(self->pattern->indexgroup)) + { + PyObject *result = PyTuple_GET_ITEM(self->pattern->indexgroup, + self->lastindex); + Py_INCREF(result); + return result; } Py_RETURN_NONE; } |