]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
string_contains(): speed up by avoiding function calls where
authorGuido van Rossum <guido@python.org>
Sat, 24 Aug 2002 06:57:49 +0000 (06:57 +0000)
committerGuido van Rossum <guido@python.org>
Sat, 24 Aug 2002 06:57:49 +0000 (06:57 +0000)
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.

Objects/stringobject.c

index 0b79a06d58ab1a775c7b73d3003ad24b2125ab58..8ae9407476e8e4af6f809156442e1b522bbba7cf 100644 (file)
@@ -991,24 +991,27 @@ string_contains(PyObject *a, PyObject *el)
 {
        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;
+               return memchr(lhs, *rhs, PyString_GET_SIZE(a)) != NULL;
 
-       end = lhs + (PyString_Size(a) - size);
+       end = lhs + (PyString_GET_SIZE(a) - size);
        while (lhs <= end) {
                if (memcmp(lhs++, rhs, size) == 0)
                        return 1;