diff Objects/stringobject.c @ 25017:aa4503556339 legacy-trunk

string_contains(): speed up by avoiding function calls where possible. This always called PyUnicode_Check() and PyString_Check(), at least one of which would call PyType_IsSubtype(). Also, this would call PyString_Size() on known string objects.
author Guido van Rossum <guido@python.org>
date Sat, 24 Aug 2002 06:57:49 +0000
parents 762dd09edb83
children 0337dad8403e
line wrap: on
line diff
--- a/Objects/stringobject.c	Sat Aug 24 06:54:19 2002 +0000
+++ b/Objects/stringobject.c	Sat Aug 24 06:57:49 2002 +0000
@@ -991,24 +991,27 @@
 {
 	const char *lhs, *rhs, *end;
 	int size;
+
+	if (!PyString_CheckExact(el)) {
 #ifdef Py_USING_UNICODE
-	if (PyUnicode_Check(el))
-		return PyUnicode_Contains(a, el);
+		if (PyUnicode_Check(el))
+			return PyUnicode_Contains(a, el);
 #endif
-	if (!PyString_Check(el)) {
-		PyErr_SetString(PyExc_TypeError,
-			      "'in <string>' requires string as left operand");
-		return -1;
+		if (!PyString_Check(el)) {
+			PyErr_SetString(PyExc_TypeError,
+			    "'in <string>' requires string as left operand");
+			return -1;
+		}
 	}
-	size = PyString_Size(el);
+	size = PyString_GET_SIZE(el);
 	rhs = PyString_AS_STRING(el);
 	lhs = PyString_AS_STRING(a);
 
 	/* optimize for a single character */
 	if (size == 1)
-		return memchr(lhs, *rhs, PyString_Size(a)) != NULL;
-
-	end = lhs + (PyString_Size(a) - size);
+		return memchr(lhs, *rhs, PyString_GET_SIZE(a)) != NULL;
+
+	end = lhs + (PyString_GET_SIZE(a) - size);
 	while (lhs <= end) {
 		if (memcmp(lhs++, rhs, size) == 0)
 			return 1;