]> granicus.if.org Git - python/commitdiff
Fix big ineficciency in regobj.search/match (introduced by Barry in an
authorGuido van Rossum <guido@python.org>
Mon, 12 May 1997 16:04:09 +0000 (16:04 +0000)
committerGuido van Rossum <guido@python.org>
Mon, 12 May 1997 16:04:09 +0000 (16:04 +0000)
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#").

Modules/regexmodule.c

index 41c7315aa4e3eaf42df805392068dfe979c1a31b..ad860683f6b91e9e78ba3c78298a29a8be147e31 100644 (file)
@@ -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 */
 }