summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-04-16 06:39:30 (GMT)
committerGitHub <noreply@github.com>2017-04-16 06:39:30 (GMT)
commitcd85d0b90b39310c8ca7329bd35e82c2c1c8f4ad (patch)
tree1d0715873378e0c3e6d64c476f8cc17198a3a8ea /Modules
parentbaf9f29811dba9c06e76b8e220bd77260202f299 (diff)
downloadcpython-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.c74
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;
}