Kaydet (Commit) cd85d0b9 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka Kaydeden (comit) GitHub

bpo-28765: Use concrete types API in _sre.c. (#1009)

üst baf9f298
...@@ -701,6 +701,9 @@ deepcopy(PyObject** object, PyObject* memo) ...@@ -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"); ...@@ -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, ...@@ -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) ...@@ -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 * ...@@ -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) ...@@ -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;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment