From 8b06d7923b82a3f63f6b4db778c29961bec48937 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 24 Aug 2002 06:57:49 +0000 Subject: 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. --- Objects/stringobject.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'Objects/stringobject.c') diff --git a/Objects/stringobject.c b/Objects/stringobject.c index 0b79a06d58..8ae9407476 100644 --- a/Objects/stringobject.c +++ b/Objects/stringobject.c @@ -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 ' requires string as left operand"); - return -1; + if (!PyString_Check(el)) { + PyErr_SetString(PyExc_TypeError, + "'in ' 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; -- cgit v1.2.1