summaryrefslogtreecommitdiffstats
path: root/Modules/regexmodule.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1997-05-12 16:04:09 (GMT)
committerGuido van Rossum <guido@python.org>1997-05-12 16:04:09 (GMT)
commit4a807f59391b497730342cf4cd07207ef50cfb51 (patch)
tree6121c9eb4df08dd349baae1d9a6fc3f2accb1274 /Modules/regexmodule.c
parent1d63d8c8290e801f8a1d9041a8073e0ca79be56e (diff)
downloadcpython-4a807f59391b497730342cf4cd07207ef50cfb51.zip
cpython-4a807f59391b497730342cf4cd07207ef50cfb51.tar.gz
cpython-4a807f59391b497730342cf4cd07207ef50cfb51.tar.bz2
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#").
Diffstat (limited to 'Modules/regexmodule.c')
-rw-r--r--Modules/regexmodule.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/Modules/regexmodule.c b/Modules/regexmodule.c
index 41c7315..ad86068 100644
--- a/Modules/regexmodule.c
+++ b/Modules/regexmodule.c
@@ -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 */
}