bpo-28765: Use concrete types API in _sre.c. (#1009)
This commit is contained in:
parent
baf9f29811
commit
cd85d0b90b
|
@ -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;
|
||||
|
||||
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))
|
||||
index = PyDict_GetItem(self->pattern->groupindex, index);
|
||||
if (index && PyLong_Check(index)) {
|
||||
i = PyLong_AsSsize_t(index);
|
||||
Py_DECREF(index);
|
||||
} else
|
||||
PyErr_Clear();
|
||||
}
|
||||
}
|
||||
|
||||
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)
|
||||
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;
|
||||
PyErr_Clear();
|
||||
}
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue