Patch by Moshe Zadka: move the string special case from abstract.c
here.

[Patch modified by GvR to keep the original exception.]
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index bc1bb41..77c08dd 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -381,6 +381,27 @@
 	return PyString_FromStringAndSize(a->ob_sval + i, (int) (j-i));
 }
 
+static int
+string_contains(a, el)
+PyObject *a, *el;
+{
+	register char *s, *end;
+	register char c;
+	if (!PyString_Check(el) || PyString_Size(el) != 1) {
+		PyErr_SetString(PyExc_TypeError,
+				"string member test needs char left operand");
+		return -1;
+	}
+	c = PyString_AsString(el)[0];
+	s = PyString_AsString(a);
+	end = s + PyString_Size(a);
+	while (s < end) {
+		if (c == *s++)
+			return 1;
+	}
+	return 0;
+}
+
 static PyObject *
 string_item(a, i)
 	PyStringObject *a;
@@ -516,6 +537,7 @@
 	(intintargfunc)string_slice, /*sq_slice*/
 	0,		/*sq_ass_item*/
 	0,		/*sq_ass_slice*/
+	(objobjproc)string_contains /*sq_contains*/
 };
 
 static PyBufferProcs string_as_buffer = {