Skip to content

Commit

Permalink
bpo-28765: Use concrete types API in _sre.c. (#1009)
Browse files Browse the repository at this point in the history
  • Loading branch information
serhiy-storchaka committed Apr 16, 2017
1 parent baf9f29 commit cd85d0b
Showing 1 changed file with 37 additions and 37 deletions.
74 changes: 37 additions & 37 deletions Modules/_sre.c
Original file line number Diff line number Diff line change
Expand Up @@ -701,6 +701,9 @@ deepcopy(PyObject** object, PyObject* memo)
{
PyObject* copy;

if (!*object)
return 1;

copy = call(
"copy", "deepcopy",
PyTuple_Pack(2, *object, memo)
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit cd85d0b

Please sign in to comment.