summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Include/pyport.h3
-rw-r--r--Objects/unicodeobject.c95
2 files changed, 43 insertions, 55 deletions
diff --git a/Include/pyport.h b/Include/pyport.h
index 3239020..5309de6 100644
--- a/Include/pyport.h
+++ b/Include/pyport.h
@@ -286,15 +286,12 @@ typedef size_t Py_uhash_t;
/* fastest possible local call under MSVC */
#define Py_LOCAL(type) static type __fastcall
#define Py_LOCAL_INLINE(type) static __inline type __fastcall
-#define Py_LOCAL_CALLBACK(name) (__fastcall *name)
#elif defined(USE_INLINE)
#define Py_LOCAL(type) static type
#define Py_LOCAL_INLINE(type) static inline type
-#define Py_LOCAL_CALLBACK(name) (*name)
#else
#define Py_LOCAL(type) static type
#define Py_LOCAL_INLINE(type) static type
-#define Py_LOCAL_CALLBACK(name) (*name)
#endif
/* Py_MEMCPY can be used instead of memcpy in cases where the copied blocks
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
index af92368..f9117f1 100644
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -8531,19 +8531,7 @@ PyUnicode_EncodeDecimal(Py_UNICODE *s,
#include "stringlib/undef.h"
static Py_ssize_t
-any_find_slice(Py_ssize_t Py_LOCAL_CALLBACK(ascii)(const Py_UCS1*, Py_ssize_t,
- const Py_UCS1*, Py_ssize_t,
- Py_ssize_t, Py_ssize_t),
- Py_ssize_t Py_LOCAL_CALLBACK(ucs1)(const Py_UCS1*, Py_ssize_t,
- const Py_UCS1*, Py_ssize_t,
- Py_ssize_t, Py_ssize_t),
- Py_ssize_t Py_LOCAL_CALLBACK(ucs2)(const Py_UCS2*, Py_ssize_t,
- const Py_UCS2*, Py_ssize_t,
- Py_ssize_t, Py_ssize_t),
- Py_ssize_t Py_LOCAL_CALLBACK(ucs4)(const Py_UCS4*, Py_ssize_t,
- const Py_UCS4*, Py_ssize_t,
- Py_ssize_t, Py_ssize_t),
- PyObject* s1, PyObject* s2,
+any_find_slice(int direction, PyObject* s1, PyObject* s2,
Py_ssize_t start,
Py_ssize_t end)
{
@@ -8569,21 +8557,41 @@ any_find_slice(Py_ssize_t Py_LOCAL_CALLBACK(ascii)(const Py_UCS1*, Py_ssize_t,
len1 = PyUnicode_GET_LENGTH(s1);
len2 = PyUnicode_GET_LENGTH(s2);
- switch(kind) {
- case PyUnicode_1BYTE_KIND:
- if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2))
- result = ascii(buf1, len1, buf2, len2, start, end);
- else
- result = ucs1(buf1, len1, buf2, len2, start, end);
- break;
- case PyUnicode_2BYTE_KIND:
- result = ucs2(buf1, len1, buf2, len2, start, end);
- break;
- case PyUnicode_4BYTE_KIND:
- result = ucs4(buf1, len1, buf2, len2, start, end);
- break;
- default:
- assert(0); result = -2;
+ if (direction > 0) {
+ switch(kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2))
+ result = asciilib_find_slice(buf1, len1, buf2, len2, start, end);
+ else
+ result = ucs1lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_find_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ default:
+ assert(0); result = -2;
+ }
+ }
+ else {
+ switch(kind) {
+ case PyUnicode_1BYTE_KIND:
+ if (PyUnicode_IS_ASCII(s1) && PyUnicode_IS_ASCII(s2))
+ result = asciilib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ else
+ result = ucs1lib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_2BYTE_KIND:
+ result = ucs2lib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ case PyUnicode_4BYTE_KIND:
+ result = ucs4lib_rfind_slice(buf1, len1, buf2, len2, start, end);
+ break;
+ default:
+ assert(0); result = -2;
+ }
}
if (kind1 != kind)
@@ -8752,18 +8760,9 @@ PyUnicode_Find(PyObject *str,
return -2;
}
- if (direction > 0)
- result = any_find_slice(
- asciilib_find_slice, ucs1lib_find_slice,
- ucs2lib_find_slice, ucs4lib_find_slice,
- str, sub, start, end
- );
- else
- result = any_find_slice(
- asciilib_rfind_slice, ucs1lib_rfind_slice,
- ucs2lib_rfind_slice, ucs4lib_rfind_slice,
- str, sub, start, end
- );
+ result = any_find_slice(direction,
+ str, sub, start, end
+ );
Py_DECREF(str);
Py_DECREF(sub);
@@ -10677,9 +10676,7 @@ unicode_find(PyObject *self, PyObject *args)
if (PyUnicode_READY(substring) == -1)
return NULL;
- result = any_find_slice(
- asciilib_find_slice, ucs1lib_find_slice,
- ucs2lib_find_slice, ucs4lib_find_slice,
+ result = any_find_slice(1,
self, (PyObject*)substring, start, end
);
@@ -10771,9 +10768,7 @@ unicode_index(PyObject *self, PyObject *args)
if (PyUnicode_READY(substring) == -1)
return NULL;
- result = any_find_slice(
- asciilib_find_slice, ucs1lib_find_slice,
- ucs2lib_find_slice, ucs4lib_find_slice,
+ result = any_find_slice(1,
self, (PyObject*)substring, start, end
);
@@ -11784,9 +11779,7 @@ unicode_rfind(PyObject *self, PyObject *args)
if (PyUnicode_READY(substring) == -1)
return NULL;
- result = any_find_slice(
- asciilib_rfind_slice, ucs1lib_rfind_slice,
- ucs2lib_rfind_slice, ucs4lib_rfind_slice,
+ result = any_find_slice(-1,
self, (PyObject*)substring, start, end
);
@@ -11820,9 +11813,7 @@ unicode_rindex(PyObject *self, PyObject *args)
if (PyUnicode_READY(substring) == -1)
return NULL;
- result = any_find_slice(
- asciilib_rfind_slice, ucs1lib_rfind_slice,
- ucs2lib_rfind_slice, ucs4lib_rfind_slice,
+ result = any_find_slice(-1,
self, (PyObject*)substring, start, end
);