mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
bpo-28765: Use concrete types API in _sre.c. (#1009)
This commit is contained in:
parent
baf9f29811
commit
cd85d0b90b
1 changed files with 37 additions and 37 deletions
|
|
@ -701,6 +701,9 @@ deepcopy(PyObject** object, PyObject* memo)
|
||||||
{
|
{
|
||||||
PyObject* copy;
|
PyObject* copy;
|
||||||
|
|
||||||
|
if (!*object)
|
||||||
|
return 1;
|
||||||
|
|
||||||
copy = call(
|
copy = call(
|
||||||
"copy", "deepcopy",
|
"copy", "deepcopy",
|
||||||
PyTuple_Pack(2, *object, memo)
|
PyTuple_Pack(2, *object, memo)
|
||||||
|
|
@ -1368,6 +1371,8 @@ PyDoc_STRVAR(pattern_doc, "Compiled regular expression objects");
|
||||||
static PyObject *
|
static PyObject *
|
||||||
pattern_groupindex(PatternObject *self)
|
pattern_groupindex(PatternObject *self)
|
||||||
{
|
{
|
||||||
|
if (self->groupindex == NULL)
|
||||||
|
return PyDict_New();
|
||||||
return PyDictProxy_New(self->groupindex);
|
return PyDictProxy_New(self->groupindex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1448,11 +1453,14 @@ _sre_compile_impl(PyObject *module, PyObject *pattern, int flags,
|
||||||
|
|
||||||
self->groups = groups;
|
self->groups = groups;
|
||||||
|
|
||||||
Py_INCREF(groupindex);
|
if (PyDict_GET_SIZE(groupindex) > 0) {
|
||||||
self->groupindex = groupindex;
|
Py_INCREF(groupindex);
|
||||||
|
self->groupindex = groupindex;
|
||||||
Py_INCREF(indexgroup);
|
if (PyTuple_GET_SIZE(indexgroup) > 0) {
|
||||||
self->indexgroup = indexgroup;
|
Py_INCREF(indexgroup);
|
||||||
|
self->indexgroup = indexgroup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!_validate(self)) {
|
if (!_validate(self)) {
|
||||||
Py_DECREF(self);
|
Py_DECREF(self);
|
||||||
|
|
@ -1994,13 +2002,10 @@ match_getindex(MatchObject* self, PyObject* index)
|
||||||
i = -1;
|
i = -1;
|
||||||
|
|
||||||
if (self->pattern->groupindex) {
|
if (self->pattern->groupindex) {
|
||||||
index = PyObject_GetItem(self->pattern->groupindex, index);
|
index = PyDict_GetItem(self->pattern->groupindex, index);
|
||||||
if (index) {
|
if (index && PyLong_Check(index)) {
|
||||||
if (PyLong_Check(index))
|
i = PyLong_AsSsize_t(index);
|
||||||
i = PyLong_AsSsize_t(index);
|
}
|
||||||
Py_DECREF(index);
|
|
||||||
} else
|
|
||||||
PyErr_Clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
|
|
@ -2118,40 +2123,34 @@ static PyObject *
|
||||||
_sre_SRE_Match_groupdict_impl(MatchObject *self, PyObject *default_value)
|
_sre_SRE_Match_groupdict_impl(MatchObject *self, PyObject *default_value)
|
||||||
/*[clinic end generated code: output=29917c9073e41757 input=0ded7960b23780aa]*/
|
/*[clinic end generated code: output=29917c9073e41757 input=0ded7960b23780aa]*/
|
||||||
{
|
{
|
||||||
PyObject* result;
|
PyObject *result;
|
||||||
PyObject* keys;
|
PyObject *key;
|
||||||
Py_ssize_t index;
|
PyObject *value;
|
||||||
|
Py_ssize_t pos = 0;
|
||||||
|
Py_hash_t hash;
|
||||||
|
|
||||||
result = PyDict_New();
|
result = PyDict_New();
|
||||||
if (!result || !self->pattern->groupindex)
|
if (!result || !self->pattern->groupindex)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
keys = PyMapping_Keys(self->pattern->groupindex);
|
while (_PyDict_Next(self->pattern->groupindex, &pos, &key, &value, &hash)) {
|
||||||
if (!keys)
|
|
||||||
goto failed;
|
|
||||||
|
|
||||||
for (index = 0; index < PyList_GET_SIZE(keys); index++) {
|
|
||||||
int status;
|
int status;
|
||||||
PyObject* key;
|
Py_INCREF(key);
|
||||||
PyObject* value;
|
|
||||||
key = PyList_GET_ITEM(keys, index);
|
|
||||||
if (!key)
|
|
||||||
goto failed;
|
|
||||||
value = match_getslice(self, key, default_value);
|
value = match_getslice(self, key, default_value);
|
||||||
if (!value)
|
if (!value) {
|
||||||
|
Py_DECREF(key);
|
||||||
goto failed;
|
goto failed;
|
||||||
status = PyDict_SetItem(result, key, value);
|
}
|
||||||
|
status = _PyDict_SetItem_KnownHash(result, key, value, hash);
|
||||||
Py_DECREF(value);
|
Py_DECREF(value);
|
||||||
|
Py_DECREF(key);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
Py_DECREF(keys);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
failed:
|
failed:
|
||||||
Py_XDECREF(keys);
|
|
||||||
Py_DECREF(result);
|
Py_DECREF(result);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -2378,13 +2377,14 @@ match_lastindex_get(MatchObject *self)
|
||||||
static PyObject *
|
static PyObject *
|
||||||
match_lastgroup_get(MatchObject *self)
|
match_lastgroup_get(MatchObject *self)
|
||||||
{
|
{
|
||||||
if (self->pattern->indexgroup && self->lastindex >= 0) {
|
if (self->pattern->indexgroup &&
|
||||||
PyObject* result = PySequence_GetItem(
|
self->lastindex >= 0 &&
|
||||||
self->pattern->indexgroup, self->lastindex
|
self->lastindex < PyTuple_GET_SIZE(self->pattern->indexgroup))
|
||||||
);
|
{
|
||||||
if (result)
|
PyObject *result = PyTuple_GET_ITEM(self->pattern->indexgroup,
|
||||||
return result;
|
self->lastindex);
|
||||||
PyErr_Clear();
|
Py_INCREF(result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue