mirror of
https://github.com/python/cpython
synced 2024-09-24 01:20:51 +00:00
Fix big ineficciency in regobj.search/match (introduced by Barry in an
otherwise laudible attempt to rationalize the argument parsing): it would save a copy of the original string instead of a reference to it. Go back to saving a reference, but keep the "s#" format (using a hack that involves two argument parsing steps, first using "O", then using "s#").
This commit is contained in:
parent
1d63d8c829
commit
4a807f5939
|
@ -113,12 +113,15 @@ regobj_match(re, args)
|
|||
regexobject *re;
|
||||
PyObject *args;
|
||||
{
|
||||
PyObject *argstring;
|
||||
char *buffer;
|
||||
int size;
|
||||
int offset = 0;
|
||||
int result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s#|i", &buffer, &size, &offset))
|
||||
if (!PyArg_ParseTuple(args, "O|i", &argstring, &offset))
|
||||
return NULL;
|
||||
if (!PyArg_Parse(argstring, "s#", &buffer, &size))
|
||||
return NULL;
|
||||
|
||||
if (offset < 0 || offset > size) {
|
||||
|
@ -134,10 +137,8 @@ regobj_match(re, args)
|
|||
return NULL;
|
||||
}
|
||||
if (result >= 0) {
|
||||
PyObject* str = PyString_FromStringAndSize(buffer, size);
|
||||
if (!str)
|
||||
return NULL;
|
||||
re->re_lastok = str;
|
||||
Py_INCREF(argstring);
|
||||
re->re_lastok = argstring;
|
||||
}
|
||||
return PyInt_FromLong((long)result); /* Length of the match or -1 */
|
||||
}
|
||||
|
@ -147,13 +148,16 @@ regobj_search(re, args)
|
|||
regexobject *re;
|
||||
PyObject *args;
|
||||
{
|
||||
PyObject *argstring;
|
||||
char *buffer;
|
||||
int size;
|
||||
int offset = 0;
|
||||
int range;
|
||||
int result;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "s#|i", &buffer, &size, &offset))
|
||||
if (!PyArg_ParseTuple(args, "O|i", &argstring, &offset))
|
||||
return NULL;
|
||||
if (!PyArg_Parse(argstring, "s#", &buffer, &size))
|
||||
return NULL;
|
||||
|
||||
if (offset < 0 || offset > size) {
|
||||
|
@ -175,10 +179,8 @@ regobj_search(re, args)
|
|||
return NULL;
|
||||
}
|
||||
if (result >= 0) {
|
||||
PyObject* str = PyString_FromStringAndSize(buffer, size);
|
||||
if (!str)
|
||||
return NULL;
|
||||
re->re_lastok = str;
|
||||
Py_INCREF(argstring);
|
||||
re->re_lastok = argstring;
|
||||
}
|
||||
return PyInt_FromLong((long)result); /* Position of the match or -1 */
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue