From 355048970b2aef708c5b9f8e5cfcbf56596d94b1 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Fri, 1 Jul 2016 17:57:30 +0300 Subject: [PATCH] Issue #26765: Moved wrappers for bytes and bytearray methods to common header file. --- Objects/bytearrayobject.c | 79 +++++------------------------- Objects/bytesobject.c | 82 +++++--------------------------- Objects/stringlib/transmogrify.h | 54 +++++++++++++++++++++ 3 files changed, 77 insertions(+), 138 deletions(-) diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 85990e0be44..fcde77b09ef 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -1097,18 +1097,6 @@ bytearray_dealloc(PyByteArrayObject *self) #include "stringlib/transmogrify.h" -static PyObject * -bytearray_find(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_find(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - -static PyObject * -bytearray_count(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_count(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - /*[clinic input] bytearray.clear @@ -1138,42 +1126,6 @@ bytearray_copy_impl(PyByteArrayObject *self) PyByteArray_GET_SIZE(self)); } -static PyObject * -bytearray_index(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_index(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - -static PyObject * -bytearray_rfind(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_rfind(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - -static PyObject * -bytearray_rindex(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_rindex(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - -static int -bytearray_contains(PyObject *self, PyObject *arg) -{ - return _Py_bytes_contains(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), arg); -} - -static PyObject * -bytearray_startswith(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_startswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - -static PyObject * -bytearray_endswith(PyByteArrayObject *self, PyObject *args) -{ - return _Py_bytes_endswith(PyByteArray_AS_STRING(self), PyByteArray_GET_SIZE(self), args); -} - /*[clinic input] bytearray.translate @@ -1329,8 +1281,8 @@ bytearray_replace_impl(PyByteArrayObject *self, Py_buffer *old, /*[clinic end generated code: output=d39884c4dc59412a input=aa379d988637c7fb]*/ { return stringlib_replace((PyObject *)self, - (const char *)old->buf, old->len, - (const char *)new->buf, new->len, count); + old->buf, old->len, + new->buf, new->len, count); } /*[clinic input] @@ -1995,14 +1947,6 @@ PyDoc_STRVAR(hex__doc__, Create a string of hexadecimal numbers from a bytearray object.\n\ Example: bytearray([0xb9, 0x01, 0xef]).hex() -> 'b901ef'."); -static PyObject * -bytearray_hex(PyBytesObject *self) -{ - char* argbuf = PyByteArray_AS_STRING(self); - Py_ssize_t arglen = PyByteArray_GET_SIZE(self); - return _Py_strhex(argbuf, arglen); -} - static PyObject * _common_reduce(PyByteArrayObject *self, int proto) { @@ -2091,7 +2035,7 @@ static PySequenceMethods bytearray_as_sequence = { 0, /* sq_slice */ (ssizeobjargproc)bytearray_setitem, /* sq_ass_item */ 0, /* sq_ass_slice */ - (objobjproc)bytearray_contains, /* sq_contains */ + (objobjproc)stringlib_contains, /* sq_contains */ (binaryfunc)bytearray_iconcat, /* sq_inplace_concat */ (ssizeargfunc)bytearray_irepeat, /* sq_inplace_repeat */ }; @@ -2119,19 +2063,19 @@ bytearray_methods[] = { {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__}, BYTEARRAY_CLEAR_METHODDEF BYTEARRAY_COPY_METHODDEF - {"count", (PyCFunction)bytearray_count, METH_VARARGS, + {"count", (PyCFunction)stringlib_method_count, METH_VARARGS, _Py_count__doc__}, BYTEARRAY_DECODE_METHODDEF - {"endswith", (PyCFunction)bytearray_endswith, METH_VARARGS, + {"endswith", (PyCFunction)stringlib_endswith, METH_VARARGS, _Py_endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, _Py_expandtabs__doc__}, BYTEARRAY_EXTEND_METHODDEF - {"find", (PyCFunction)bytearray_find, METH_VARARGS, + {"find", (PyCFunction)stringlib_method_find, METH_VARARGS, _Py_find__doc__}, BYTEARRAY_FROMHEX_METHODDEF - {"hex", (PyCFunction)bytearray_hex, METH_NOARGS, hex__doc__}, - {"index", (PyCFunction)bytearray_index, METH_VARARGS, _Py_index__doc__}, + {"hex", (PyCFunction)stringlib_hex, METH_NOARGS, hex__doc__}, + {"index", (PyCFunction)stringlib_index, METH_VARARGS, _Py_index__doc__}, BYTEARRAY_INSERT_METHODDEF {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, @@ -2157,15 +2101,16 @@ bytearray_methods[] = { BYTEARRAY_REMOVE_METHODDEF BYTEARRAY_REPLACE_METHODDEF BYTEARRAY_REVERSE_METHODDEF - {"rfind", (PyCFunction)bytearray_rfind, METH_VARARGS, _Py_rfind__doc__}, - {"rindex", (PyCFunction)bytearray_rindex, METH_VARARGS, _Py_rindex__doc__}, + {"rfind", (PyCFunction)stringlib_method_rfind, METH_VARARGS, + _Py_rfind__doc__}, + {"rindex", (PyCFunction)stringlib_rindex, METH_VARARGS, _Py_rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__}, BYTEARRAY_RPARTITION_METHODDEF BYTEARRAY_RSPLIT_METHODDEF BYTEARRAY_RSTRIP_METHODDEF BYTEARRAY_SPLIT_METHODDEF BYTEARRAY_SPLITLINES_METHODDEF - {"startswith", (PyCFunction)bytearray_startswith, METH_VARARGS , + {"startswith", (PyCFunction)stringlib_startswith, METH_VARARGS, _Py_startswith__doc__}, BYTEARRAY_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 8ad27829347..18ee5aa5918 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -1485,12 +1485,6 @@ bytes_repeat(PyBytesObject *a, Py_ssize_t n) return (PyObject *) op; } -static int -bytes_contains(PyObject *self, PyObject *arg) -{ - return _Py_bytes_contains(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), arg); -} - static PyObject * bytes_item(PyBytesObject *a, Py_ssize_t i) { @@ -1701,7 +1695,7 @@ static PySequenceMethods bytes_as_sequence = { 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ - (objobjproc)bytes_contains /*sq_contains*/ + (objobjproc)stringlib_contains /*sq_contains*/ }; static PyMappingMethods bytes_as_mapping = { @@ -1873,32 +1867,6 @@ _PyBytes_Join(PyObject *sep, PyObject *x) return bytes_join((PyBytesObject*)sep, x); } -static PyObject * -bytes_find(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_find(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - -static PyObject * -bytes_index(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_index(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - - -static PyObject * -bytes_rfind(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_rfind(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - - -static PyObject * -bytes_rindex(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_rindex(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - Py_LOCAL_INLINE(PyObject *) do_xstrip(PyBytesObject *self, int striptype, PyObject *sepobj) @@ -2035,13 +2003,6 @@ bytes_rstrip_impl(PyBytesObject *self, PyObject *bytes) } -static PyObject * -bytes_count(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_count(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - - /*[clinic input] bytes.translate @@ -2228,19 +2189,6 @@ bytes_replace_impl(PyBytesObject *self, Py_buffer *old, Py_buffer *new, /** End DALKE **/ -static PyObject * -bytes_startswith(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_startswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - -static PyObject * -bytes_endswith(PyBytesObject *self, PyObject *args) -{ - return _Py_bytes_endswith(PyBytes_AS_STRING(self), PyBytes_GET_SIZE(self), args); -} - - /*[clinic input] bytes.decode @@ -2394,14 +2342,6 @@ PyDoc_STRVAR(hex__doc__, Create a string of hexadecimal numbers from a bytes object.\n\ Example: b'\\xb9\\x01\\xef'.hex() -> 'b901ef'."); -static PyObject * -bytes_hex(PyBytesObject *self) -{ - char* argbuf = PyBytes_AS_STRING(self); - Py_ssize_t arglen = PyBytes_GET_SIZE(self); - return _Py_strhex(argbuf, arglen); -} - static PyObject * bytes_getnewargs(PyBytesObject *v) { @@ -2414,20 +2354,19 @@ bytes_methods[] = { {"__getnewargs__", (PyCFunction)bytes_getnewargs, METH_NOARGS}, {"capitalize", (PyCFunction)stringlib_capitalize, METH_NOARGS, _Py_capitalize__doc__}, - {"center", (PyCFunction)stringlib_center, METH_VARARGS, - _Py_center__doc__}, - {"count", (PyCFunction)bytes_count, METH_VARARGS, + {"center", (PyCFunction)stringlib_center, METH_VARARGS, _Py_center__doc__}, + {"count", (PyCFunction)stringlib_method_count, METH_VARARGS, _Py_count__doc__}, BYTES_DECODE_METHODDEF - {"endswith", (PyCFunction)bytes_endswith, METH_VARARGS, + {"endswith", (PyCFunction)stringlib_endswith, METH_VARARGS, _Py_endswith__doc__}, {"expandtabs", (PyCFunction)stringlib_expandtabs, METH_VARARGS | METH_KEYWORDS, _Py_expandtabs__doc__}, - {"find", (PyCFunction)bytes_find, METH_VARARGS, + {"find", (PyCFunction)stringlib_method_find, METH_VARARGS, _Py_find__doc__}, BYTES_FROMHEX_METHODDEF - {"hex", (PyCFunction)bytes_hex, METH_NOARGS, hex__doc__}, - {"index", (PyCFunction)bytes_index, METH_VARARGS, _Py_index__doc__}, + {"hex", (PyCFunction)stringlib_hex, METH_NOARGS, hex__doc__}, + {"index", (PyCFunction)stringlib_index, METH_VARARGS, _Py_index__doc__}, {"isalnum", (PyCFunction)stringlib_isalnum, METH_NOARGS, _Py_isalnum__doc__}, {"isalpha", (PyCFunction)stringlib_isalpha, METH_NOARGS, @@ -2449,15 +2388,16 @@ bytes_methods[] = { BYTES_MAKETRANS_METHODDEF BYTES_PARTITION_METHODDEF BYTES_REPLACE_METHODDEF - {"rfind", (PyCFunction)bytes_rfind, METH_VARARGS, _Py_rfind__doc__}, - {"rindex", (PyCFunction)bytes_rindex, METH_VARARGS, _Py_rindex__doc__}, + {"rfind", (PyCFunction)stringlib_method_rfind, METH_VARARGS, + _Py_rfind__doc__}, + {"rindex", (PyCFunction)stringlib_rindex, METH_VARARGS, _Py_rindex__doc__}, {"rjust", (PyCFunction)stringlib_rjust, METH_VARARGS, _Py_rjust__doc__}, BYTES_RPARTITION_METHODDEF BYTES_RSPLIT_METHODDEF BYTES_RSTRIP_METHODDEF BYTES_SPLIT_METHODDEF BYTES_SPLITLINES_METHODDEF - {"startswith", (PyCFunction)bytes_startswith, METH_VARARGS, + {"startswith", (PyCFunction)stringlib_startswith, METH_VARARGS, _Py_startswith__doc__}, BYTES_STRIP_METHODDEF {"swapcase", (PyCFunction)stringlib_swapcase, METH_NOARGS, diff --git a/Objects/stringlib/transmogrify.h b/Objects/stringlib/transmogrify.h index 625507ddb1d..fb62d63ba1b 100644 --- a/Objects/stringlib/transmogrify.h +++ b/Objects/stringlib/transmogrify.h @@ -2,6 +2,60 @@ # error "transmogrify.h only compatible with byte-wise strings" #endif +Py_LOCAL(PyObject *) +stringlib_method_find(PyObject *self, PyObject *args) +{ + return _Py_bytes_find(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_index(PyObject *self, PyObject *args) +{ + return _Py_bytes_index(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_method_rfind(PyObject *self, PyObject *args) +{ + return _Py_bytes_rfind(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_rindex(PyObject *self, PyObject *args) +{ + return _Py_bytes_rindex(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_method_count(PyObject *self, PyObject *args) +{ + return _Py_bytes_count(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(int) +stringlib_contains(PyObject *self, PyObject *arg) +{ + return _Py_bytes_contains(STRINGLIB_STR(self), STRINGLIB_LEN(self), arg); +} + +Py_LOCAL(PyObject *) +stringlib_startswith(PyObject *self, PyObject *args) +{ + return _Py_bytes_startswith(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_endswith(PyObject *self, PyObject *args) +{ + return _Py_bytes_endswith(STRINGLIB_STR(self), STRINGLIB_LEN(self), args); +} + +Py_LOCAL(PyObject *) +stringlib_hex(PyObject *self) +{ + return _Py_strhex(STRINGLIB_STR(self), STRINGLIB_LEN(self)); +} + /* the more complicated methods. parts of these should be pulled out into the shared code in bytes_methods.c to cut down on duplicate code bloat. */