diff options
author | Guido van Rossum <guido@python.org> | 1997-05-12 16:04:09 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1997-05-12 16:04:09 (GMT) |
commit | 4a807f59391b497730342cf4cd07207ef50cfb51 (patch) | |
tree | 6121c9eb4df08dd349baae1d9a6fc3f2accb1274 /Modules/regexmodule.c | |
parent | 1d63d8c8290e801f8a1d9041a8073e0ca79be56e (diff) | |
download | cpython-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.c | 22 |
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 */ } |