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#").
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 @@
 	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 @@
 		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 @@
 	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 @@
 		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 */
 }