mirror of
https://github.com/python/cpython.git
synced 2025-09-11 19:27:07 +00:00
needforspeed: more stringlib refactoring
This commit is contained in:
parent
d532ba0746
commit
2d23d5bf2e
4 changed files with 161 additions and 147 deletions
|
@ -690,6 +690,9 @@ PyObject *PyString_DecodeEscape(const char *s,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* object api */
|
||||
|
||||
static Py_ssize_t
|
||||
string_getsize(register PyObject *op)
|
||||
{
|
||||
|
@ -765,22 +768,23 @@ PyString_AsStringAndSize(register PyObject *obj,
|
|||
}
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* stringlib components */
|
||||
/* Methods */
|
||||
|
||||
#define STRINGLIB_CHAR char
|
||||
|
||||
#define STRINGLIB_NEW PyString_FromStringAndSize
|
||||
#define STRINGLIB_CMP memcmp
|
||||
#define STRINGLIB_LEN PyString_GET_SIZE
|
||||
#define STRINGLIB_NEW PyString_FromStringAndSize
|
||||
#define STRINGLIB_STR PyString_AS_STRING
|
||||
|
||||
#define STRINGLIB_EMPTY nullstring
|
||||
|
||||
#include "stringlib/fastsearch.h"
|
||||
|
||||
#include "stringlib/count.h"
|
||||
#include "stringlib/find.h"
|
||||
#include "stringlib/partition.h"
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
/* Methods */
|
||||
|
||||
static int
|
||||
string_print(PyStringObject *op, FILE *fp, int flags)
|
||||
|
@ -1048,49 +1052,36 @@ string_slice(register PyStringObject *a, register Py_ssize_t i,
|
|||
}
|
||||
|
||||
static int
|
||||
string_contains(PyObject *a, PyObject *el)
|
||||
string_contains(PyObject *str_obj, PyObject *sub_obj)
|
||||
{
|
||||
char *s = PyString_AS_STRING(a);
|
||||
const char *sub = PyString_AS_STRING(el);
|
||||
Py_ssize_t len_sub = PyString_GET_SIZE(el);
|
||||
Py_ssize_t pos;
|
||||
|
||||
if (!PyString_CheckExact(el)) {
|
||||
if (!PyString_CheckExact(sub_obj)) {
|
||||
#ifdef Py_USING_UNICODE
|
||||
if (PyUnicode_Check(el))
|
||||
return PyUnicode_Contains(a, el);
|
||||
if (PyUnicode_Check(sub_obj))
|
||||
return PyUnicode_Contains(str_obj, sub_obj);
|
||||
#endif
|
||||
if (!PyString_Check(el)) {
|
||||
if (!PyString_Check(sub_obj)) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"'in <string>' requires string as left operand");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (len_sub == 0)
|
||||
return 1;
|
||||
|
||||
pos = fastsearch(
|
||||
s, PyString_GET_SIZE(a),
|
||||
sub, len_sub, FAST_SEARCH
|
||||
);
|
||||
|
||||
return (pos != -1);
|
||||
return stringlib_contains_obj(str_obj, sub_obj);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
string_item(PyStringObject *a, register Py_ssize_t i)
|
||||
{
|
||||
char pchar;
|
||||
PyObject *v;
|
||||
char *pchar;
|
||||
if (i < 0 || i >= a->ob_size) {
|
||||
PyErr_SetString(PyExc_IndexError, "string index out of range");
|
||||
return NULL;
|
||||
}
|
||||
pchar = a->ob_sval + i;
|
||||
v = (PyObject *)characters[*pchar & UCHAR_MAX];
|
||||
pchar = a->ob_sval[i];
|
||||
v = (PyObject *)characters[pchar & UCHAR_MAX];
|
||||
if (v == NULL)
|
||||
v = PyString_FromStringAndSize(pchar, 1);
|
||||
v = PyString_FromStringAndSize(&pchar, 1);
|
||||
else {
|
||||
#ifdef COUNT_ALLOCS
|
||||
one_strings++;
|
||||
|
@ -1166,9 +1157,8 @@ string_richcompare(PyStringObject *a, PyStringObject *b, int op)
|
|||
int
|
||||
_PyString_Eq(PyObject *o1, PyObject *o2)
|
||||
{
|
||||
PyStringObject *a, *b;
|
||||
a = (PyStringObject*)o1;
|
||||
b = (PyStringObject*)o2;
|
||||
PyStringObject *a = (PyStringObject*) o1;
|
||||
PyStringObject *b = (PyStringObject*) o2;
|
||||
return a->ob_size == b->ob_size
|
||||
&& *a->ob_sval == *b->ob_sval
|
||||
&& memcmp(a->ob_sval, b->ob_sval, a->ob_size) == 0;
|
||||
|
@ -2264,43 +2254,37 @@ as in slice notation.");
|
|||
static PyObject *
|
||||
string_count(PyStringObject *self, PyObject *args)
|
||||
{
|
||||
const char *s = PyString_AS_STRING(self), *sub;
|
||||
Py_ssize_t len = PyString_GET_SIZE(self), n;
|
||||
Py_ssize_t i = 0, last = PY_SSIZE_T_MAX;
|
||||
Py_ssize_t m, r;
|
||||
PyObject *subobj;
|
||||
PyObject *sub_obj;
|
||||
const char *str = PyString_AS_STRING(self), *sub;
|
||||
Py_ssize_t sub_len;
|
||||
Py_ssize_t start = 0, end = PY_SSIZE_T_MAX;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|O&O&:count", &subobj,
|
||||
_PyEval_SliceIndex, &i, _PyEval_SliceIndex, &last))
|
||||
if (!PyArg_ParseTuple(args, "O|O&O&:count", &sub_obj,
|
||||
_PyEval_SliceIndex, &start, _PyEval_SliceIndex, &end))
|
||||
return NULL;
|
||||
|
||||
if (PyString_Check(subobj)) {
|
||||
sub = PyString_AS_STRING(subobj);
|
||||
n = PyString_GET_SIZE(subobj);
|
||||
if (PyString_Check(sub_obj)) {
|
||||
sub = PyString_AS_STRING(sub_obj);
|
||||
sub_len = PyString_GET_SIZE(sub_obj);
|
||||
}
|
||||
#ifdef Py_USING_UNICODE
|
||||
else if (PyUnicode_Check(subobj)) {
|
||||
else if (PyUnicode_Check(sub_obj)) {
|
||||
Py_ssize_t count;
|
||||
count = PyUnicode_Count((PyObject *)self, subobj, i, last);
|
||||
count = PyUnicode_Count((PyObject *)self, sub_obj, start, end);
|
||||
if (count == -1)
|
||||
return NULL;
|
||||
else
|
||||
return PyInt_FromLong((long) count);
|
||||
return PyInt_FromSsize_t(count);
|
||||
}
|
||||
#endif
|
||||
else if (PyObject_AsCharBuffer(subobj, &sub, &n))
|
||||
else if (PyObject_AsCharBuffer(sub_obj, &sub, &sub_len))
|
||||
return NULL;
|
||||
|
||||
string_adjust_indices(&i, &last, len);
|
||||
string_adjust_indices(&start, &end, PyString_GET_SIZE(self));
|
||||
|
||||
m = last + 1 - n;
|
||||
if (n == 0)
|
||||
return PyInt_FromSsize_t(m-i);
|
||||
|
||||
r = fastsearch(s + i, last - i, sub, n, FAST_COUNT);
|
||||
if (r < 0)
|
||||
r = 0; /* no match */
|
||||
return PyInt_FromSsize_t(r);
|
||||
return PyInt_FromSsize_t(
|
||||
stringlib_count(str + start, end - start, sub, sub_len)
|
||||
);
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(swapcase__doc__,
|
||||
|
@ -2477,7 +2461,7 @@ return_self(PyStringObject *self)
|
|||
}
|
||||
|
||||
Py_LOCAL(Py_ssize_t)
|
||||
countchar(char *target, int target_len, char c, Py_ssize_t maxcount)
|
||||
countchar(char *target, int target_len, char c, Py_ssize_t maxcount)
|
||||
{
|
||||
Py_ssize_t count=0;
|
||||
char *start=target;
|
||||
|
@ -2580,7 +2564,7 @@ countstring(char *target, Py_ssize_t target_len,
|
|||
}
|
||||
|
||||
|
||||
/* Algorithms for difference cases of string replacement */
|
||||
/* Algorithms for different cases of string replacement */
|
||||
|
||||
/* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
|
||||
Py_LOCAL(PyStringObject *)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue